send enemy entity to CSQC
Posted: Thu Jul 10, 2014 1:31 am
Hy guys, I'm trying to circumnavigate my csqc animation problem starting by adding a simple enemy entity to CSQC and then add a skeleton to it (now I'm good at that part ). This is the SSQC code
I tried to put SendEnemyToCSQC() even in PutClientInServer() but results are the same.
CSQC
the model, instead of searching player, remains at middle air, and the centerprint prints only first coordinate system (where the model is hanged). But If I turn r_showbboxes to 1 I can see the enemyBase entity searching the player
So, my question is: is it possible to send another entity that is not the player to CSQC?
Thanks in advance
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