openmohaa/code/cgame_hook/script/centity.cpp

450 lines
6.9 KiB
C++
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
* Entity.cpp
*
* DESCRIPTION : Client-side entity
*/
#include "centity.h"
#include "archive.h"
Container< SafePtr< Entity > > s_entities;
Event EV_Entity_Attach
(
"attach",
EV_DEFAULT,
"esIV",
"parent tagname use_angles offset",
"attach this entity to the parent's legs tag called tagname",
EV_NORMAL
);
Event EV_Entity_Detach
(
"detach",
EV_DEFAULT,
NULL,
NULL,
"detach this entity from its parent.",
EV_NORMAL
);
Event EV_Entity_GetModel
(
"model",
EV_DEFAULT,
NULL,
NULL,
"Gets the model.",
EV_RETURN
);
Event EV_Entity_Getter_GetModel
(
"model",
EV_DEFAULT,
NULL,
NULL,
"Gets the model.",
EV_GETTER
);
Event EV_Entity_GetScale
(
"scale",
EV_DEFAULT,
NULL,
NULL,
"Gets the scale.",
EV_GETTER
);
Event EV_Entity_SetModel
(
"model",
EV_DEFAULT,
"s",
"modelName",
"Sets the model to modelName.",
EV_NORMAL
);
Event EV_Entity_SetScale
(
"scale",
EV_DEFAULT,
"f",
"scale",
"Sets the scale.",
EV_SETTER
);
Event EV_Entity_Setter_SetModel
(
"model",
EV_DEFAULT,
"s",
"modelName",
"Sets the model to modelName.",
EV_SETTER
);
Event EV_Entity_SetSize
(
"setsize",
EV_DEFAULT,
"vv",
"mins maxs",
"Set the bounding box of the entity to mins and maxs.",
EV_NORMAL
);
Event EV_Touch
(
"doTouch",
EV_CODEONLY,
"e",
"touchingEntity",
"sent to entity when touched.",
EV_NORMAL
);
Entity * CL_GetCEntity( int ent_num )
{
// Iterate through simple client entities
for( int i = 0; i < s_entities.NumObjects(); i++ )
{
Entity * ent = ( Entity * )s_entities[ i ];
if( !checkInheritance( &Entity::ClassInfo, ent->classinfo() ) ) {
continue;
}
int entnum = ent->GetNumber();
if( entnum != -1 && entnum == ent_num ) {
return ent;
}
}
return NULL;
}
centity_t *CL_GetEntity( int ent_num )
{
entityState_t *ce = NULL;
int i;
for( i = 0; i < cg->activeSnapshots[ 0 ].numEntities; i++ )
{
if( cg->activeSnapshots[ 0 ].entities[ i ].number == ent_num ) {
ce = &cg->activeSnapshots[ 0 ].entities[ i ];
}
}
return ( centity_t * )ce;
}
void CL_ProcessCEntities()
{
// Iterate through client entities
for( int i = s_entities.NumObjects(); i > 0; i-- )
{
Entity *ent = s_entities.ObjectAt( i );
if( !checkInheritance( &Entity::ClassInfo, ent->classinfo() ) ) {
continue;
}
if( ent->CanThink() ) {
ent->Think();
}
}
}
Entity::Entity()
{
cent = &cg_entities[ 0 ];
centity = &cg_entities[ 0 ];
model = "";
modelhandle = 0;
scale = 1.f;
renderFx = 0;
tiki = NULL;
frame = new frameInfo_t[ 1 ];
numframes = 1;
entnum = -1;
frame[ 0 ].index = 0;
frame[ 0 ].time = 0.f;
frame[ 0 ].weight = 1.0f;
//turnThinkOn();
absmin = absmax = mins = maxs = vec_zero;
s_entities.AddObject( this );
}
Entity::~Entity()
{
if( frame ) {
delete[] frame;
}
numframes = 0;
s_entities.RemoveObject( this );
}
bool Entity::IsTouching( Entity *ent )
{
return ent->absmin[ 0 ] <= absmax[ 0 ]
&& ent->absmin[ 1 ] <= absmax[ 1 ]
&& ent->absmin[ 2 ] <= absmax[ 2 ]
&& absmin[ 0 ] <= ent->absmax[ 0 ]
&& absmin[ 1 ] <= ent->absmax[ 1 ]
&& absmin[ 2 ] <= ent->absmax[ 2 ];
}
float Entity::getScale()
{
return scale;
}
qboolean Entity::inRadius( Vector org, float rad )
{
if( Vector::Distance( origin, org ) <= rad ) {
return true;
} else {
return false;
}
}
void Entity::setModel( const char *name )
{
model = name;
modelhandle = cgi.R_RegisterModel( name );
tiki = cgi.R_Model_GetHandle( modelhandle );
}
void Entity::setOrigin( Vector origin )
{
this->origin = origin;
absmin = origin + mins;
absmax = origin + maxs;
}
void Entity::setScale( float s )
{
scale = s;
}
void Entity::Think()
{
}
void Entity::Archive( Archiver &arc )
{
SimpleEntity::Archive( arc );
arc.ArchiveBoolean( &fShader );
if( fShader )
{
arc.ArchiveString( &shader );
if( arc.Loading() ) {
customshader = cgi.R_RegisterShader( shader );
}
}
arc.ArchiveBoolean( &canThink );
arc.ArchiveFloat( &scale );
arc.ArchiveInteger( &entnum );
arc.ArchiveInteger( &renderFx );
arc.ArchiveString( &model );
}
frameInfo_t *Entity::GetFrameInfo( int index )
{
if( index >= numframes ) {
return NULL;
} else {
return &frame[ index ];
}
}
int Entity::GetNumFrames()
{
return numframes;
}
void Entity::GetTag( const char *tagname, orientation_t *orient )
{
refEntity_t ref;
if( tiki == NULL ) {
return;
}
int num = cgi.Tag_NumForName( tiki, tagname );
if( num == -1 ) {
return;
}
memset( &ref, 0, sizeof( refEntity_t ) );
VectorCopy( origin, ref.origin );
MatrixToEulerAngles( ref.axis, angles );
ref.reType = RT_MODEL;
ref.scale = scale;
ref.hModel = modelhandle;
ref.hOldModel = modelhandle;
ref.tiki = tiki;
ref.entityNumber = 0;
ref.actionWeight = 1.0f;
for( int i = 0; i < GetNumFrames(); i++ )
{
frameInfo_t *frame = GetFrameInfo( i );
ref.frameInfo[ i ].index = frame->index;
ref.frameInfo[ i ].time = frame->time;
ref.frameInfo[ i ].weight = frame->weight;
}
//cgi.TIKI_Orientation( orient, &ref, num );
*orient = re.TIKI_Orientation( &ref, num );
}
void Entity::AssignNumber( int ent_num )
{
if( entnum == -1 ) {
entnum = ent_num;
}
}
int Entity::GetNumber()
{
return entnum;
}
qboolean Entity::CanThink()
{
return canThink;
}
void Entity::turnThinkOn()
{
canThink = true;
}
void Entity::turnThinkOff()
{
canThink = false;
}
void Entity::SetShader( const char *name )
{
if( name == NULL )
{
fShader = false;
shader = "";
return;
}
fShader = true;
customshader = cgi.R_RegisterShader( name );
shader = name;
}
//=== SCRIPT ===\\
void Entity::EventAttach( Event *ev )
{
Entity *parent = ev->GetEntity( 1 );
str tagname = ev->GetString( 2 );
int use_angles;
Vector offset;
if( ev->NumArgs() > 2 ) {
use_angles = ev->GetInteger( 3 );
} else {
use_angles = 1;
}
if( ev->NumArgs() > 3 ) {
offset = ev->GetVector( 4 );
} else {
offset = vec_zero;
}
attached = parent;
attached_tagname = tagname;
attached_use_angles = use_angles;
attached_offset = offset;
}
void Entity::EventDetach( Event *ev )
{
attached = NULL;
}
void Entity::EventGetModel( Event *ev )
{
ev->AddString( model );
}
void Entity::EventGetScale( Event *ev )
{
ev->AddFloat( getScale() );
}
void Entity::EventSetScale( Event *ev )
{
setScale( ev->GetFloat( 1 ) );
}
void Entity::EventSetModel( Event *ev )
{
str name = ev->GetString( 1 );
setModel( name );
}
void Entity::EventSetSize( Event *ev )
{
mins = ev->GetVector( 1 );
maxs = ev->GetVector( 2 );
setOrigin( origin );
}
CLASS_DECLARATION( SimpleEntity, Entity, NULL )
{
{ &EV_Entity_Attach, &Entity::EventAttach },
{ &EV_Entity_Detach, &Entity::EventDetach },
{ &EV_Entity_GetModel, &Entity::EventGetModel },
{ &EV_Entity_GetScale, &Entity::EventGetScale },
{ &EV_Entity_Getter_GetModel, &Entity::EventGetModel },
{ &EV_Entity_SetModel, &Entity::EventSetModel },
{ &EV_Entity_SetScale, &Entity::EventSetScale },
{ &EV_Entity_Setter_SetModel, &Entity::EventSetModel },
{ &EV_Entity_SetSize, &Entity::EventSetSize },
{ NULL, NULL }
};