Code: Select all
float SendEnemyToCSQC()
{
WriteByte(MSG_ENTITY, ENT_CSENEMY);
WriteByte(MSG_ENTITY, enemyBase.frame); //FIXME NEED COMPRESSION
WriteByte(MSG_ENTITY, enemyBase.movetype); //FIXME NEED COMPRESSION
WriteByte(MSG_ENTITY, enemyBase.solid); //FIXME NEED COMPRESSION
WriteString(MSG_ENTITY,enemyBase.model);
WriteByte(MSG_ENTITY, enemyBase.PersID);
//WriteEntity(MSG_ENTITY, self.entityType);
WriteByte(MSG_ENTITY, enemyBase.v_angle_x*(256/360));
WriteByte(MSG_ENTITY, enemyBase.v_angle_y*(256/360));
WriteCoord(MSG_ENTITY, enemyBase.origin_x);
WriteCoord(MSG_ENTITY, enemyBase.origin_y);
WriteCoord(MSG_ENTITY, enemyBase.origin_z);
WriteShort(MSG_ENTITY, enemyBase.velocity_x);
WriteShort(MSG_ENTITY, enemyBase.velocity_y);
WriteShort(MSG_ENTITY, enemyBase.velocity_z);
return TRUE;
}
void enemy_base()
{
local entity tempent;
tempent = spawn();
enemyBase = self; //vital! Otherwise the model is not loaded.And order matters!
enemyBase.solid = SOLID_SLIDEBOX;
enemyBase.angles = tempent.angles; //vital otherwise enemy doesn't search player all the time!
enemyBase.movetype = MOVETYPE_STEP;
precache_model("models/enemies/erebus.iqm");
setmodel (enemyBase, "models/enemies/erebus.iqm");
enemyBase.health = 200;
enemyBase.classname = "enemy_base";
setsize (enemyBase, VEC_HULL_MIN, VEC_HULL_MAX);
Enemy_SearchingPlayer(); //AI stuff for making player life less easy!
enemyBase.flags = FL_MONSTER;
enemyBase.SendEntity = SendEnemyToCSQC; //send enemy to CSQC...I'm not sure about it! :)
}
CSQC
Code: Select all
void UpdateCSEnemy(float newent)
{
if (newent)
{
enemyBase.classname = "enemy_base";
print(enemyBase.model,"- model name\n");
precache_model(enemyBase.model);
setmodel (self, enemyBase.model);
enemyBase.drawmask = MASK_NORMAL; // makes the entity visible
addentity(enemyBase); //does it need?
}
}
void CSQC_Ent_Update (float isnew)
{
self.enttype = ReadByte();
switch(self.enttype)
{
case ENT_CSPLAYER:
//blah,blah, player stuff
break;
case ENT_CSENEMY:
enemyBase = self;
enemyBase.animation = ReadByte();
enemyBase.movetype = ReadByte();
enemyBase.solid = ReadByte();
enemyBase.model = ReadString();
enemyBase.PersID = ReadByte();
//self.entityType = ReadEnt();
enemyBase.old_wish_ang_x = ReadByte();
enemyBase.old_wish_ang_y = ReadByte();
enemyBase.origin_x = ReadCoord();
enemyBase.origin_y = ReadCoord();
enemyBase.origin_z = ReadCoord();
enemyBase.velocity_x = ReadShort();
enemyBase.velocity_y = ReadShort();
enemyBase.velocity_z = ReadShort();
UpdateCSEnemy(isnew); // IT WILL HAPPEN JUST ONCE
break;
}
}
void UpdateEnemyEveryFrame()
{
local entity ent;
ent = nextent(world);
while (ent)
{
if (ent.classname == "enemy_base")
{
centerprint(vtos(enemyBase.origin));
}
ent = nextent(ent);
}
}
// CSQC_UpdateView - Called every rendered frame on the client. Useful for HUD drawing operations.
void CSQC_UpdateView(float vwidth, float vheight)
{
centerprint(vtos(enemyBase.origin)); //stamps only enemy first origin but not updating it
UpdateEnemyEveryFrame(); //same results as above
R_ClearScene();
R_SetView(VF_DRAWWORLD, 1);
R_SetView(VF_ORIGIN, player.origin);
R_AddEntities(MASK_ENGINE | MASK_ENGINEVIEWMODELS | MASK_NORMAL );///not weapon
R_RenderScene();
}
So, my question is: is it possible to send another entity that is not the player to CSQC?
Thanks in advance