void Ent_RemoveEntCS()
{SELFPARAM();
- entcs_receiver[self.sv_entnum] = world;
+ entcs_receiver[self.sv_entnum] = NULL;
}
void Ent_ReadEntCS()
{SELFPARAM();
- int sf;
InterpolateOrigin_Undo();
-
self.classname = "entcs_receiver";
- sf = ReadByte();
+ int sf = ReadByte();
- if(sf & 1)
+ if(sf & BIT(0))
self.sv_entnum = ReadByte();
- if(sf & 2)
+ if (sf & BIT(1))
{
self.origin_x = ReadShort();
self.origin_y = ReadShort();
self.origin_z = ReadShort();
setorigin(self, self.origin);
}
- if(sf & 4)
+ if (sf & BIT(2))
{
self.angles_y = ReadByte() * 360.0 / 256;
self.angles_x = self.angles_z = 0;
}
- if(sf & 8)
+ if (sf & BIT(3))
self.healthvalue = ReadByte() * 10;
- if(sf & 16)
+ if (sf & BIT(4))
self.armorvalue = ReadByte() * 10;
entcs_receiver[self.sv_entnum] = self;
+#include "ent_cs.qh"
#include "_all.qh"
-#include "defs.qh"
-#include "mutators/mutators_include.qh"
-
-/**
- * The point of these entities is to avoid the problems
- * with clientprediction.
- * If you add SendEntity to players, the engine will not
- * do any prediction anymore, and you'd have to write the whole
- * prediction code in CSQC, you want that? :P
- * Data can depend on gamemode. For now, it serves as GPS entities
- * in onslaught... YAY ;)
- */
-
-// Beware: do not redefine those in other files
-// and NO, you cannot use ".version", which already exists (at least
-// it did when I added this) But you have to use .Version
-// Capital V
-
-.entity entcs;
-
-void entcs_init()
-{
- LOG_INFO("Initializing ClientSide information entities\n");
-}
-
float entcs_customize()
-{SELFPARAM();
- entity o;
- o = self.owner;
+{
+ SELFPARAM();
+ entity o = self.owner;
if(o.deadflag != DEAD_NO)
return false;
if (!IS_PLAYER(o))
{
WriteByte(MSG_ENTITY, ENT_CLIENT_ENTCS);
WriteByte(MSG_ENTITY, sf);
- if(sf & 1)
- WriteByte(MSG_ENTITY, num_for_edict(self.owner)-1);
- if(sf & 2)
+ if(sf & BIT(0))
+ WriteByte(MSG_ENTITY, num_for_edict(self.owner) - 1);
+ if(sf & BIT(1))
{
WriteShort(MSG_ENTITY, self.origin.x);
WriteShort(MSG_ENTITY, self.origin.y);
WriteShort(MSG_ENTITY, self.origin.z);
}
- if(sf & 4)
+ if(sf & BIT(2))
WriteByte(MSG_ENTITY, self.angles.y * 256.0 / 360);
- if(sf & 8)
+ if(sf & BIT(3))
WriteByte(MSG_ENTITY, self.health / 10); // FIXME use a better scale?
- if(sf & 16)
+ if(sf & BIT(4))
WriteByte(MSG_ENTITY, self.armorvalue / 10); // FIXME use a better scale?
return true;
}
void entcs_think()
-{SELFPARAM();
+{
+ SELFPARAM();
self.nextthink = time + 0.033333333333; // increase this to like 0.15 once the client can do smoothing
-
- entity o;
- o = self.owner;
-
- if(o.origin != self.origin)
+ entity o = self.owner;
+ if (o.origin != self.origin)
{
setorigin(self, o.origin);
- self.SendFlags |= 2;
+ self.SendFlags |= BIT(1);
}
- if(o.angles.y != self.angles.y)
+ if (o.angles.y != self.angles.y)
{
self.angles = o.angles;
- self.SendFlags |= 4;
+ self.SendFlags |= BIT(2);
}
- if(o.health != self.health)
+ if (o.health != self.health)
{
self.health = o.health;
- self.SendFlags |= 8;
+ self.SendFlags |= BIT(3);
}
- if(o.armorvalue != self.armorvalue)
+ if (o.armorvalue != self.armorvalue)
{
self.armorvalue = o.armorvalue;
- self.SendFlags |= 16;
+ self.SendFlags |= BIT(4);
}
}
-entity attach_entcs()
-{SELFPARAM();
- entity ent;
-
- ent = spawn();
- ent.classname = "entcs_sender_v2";
- ent.owner = self;
+entity attach_entcs(entity e)
+{
+ entity ent = e.entcs = new(entcs_sender);
+ ent.owner = e;
ent.think = entcs_think;
ent.nextthink = time;
Net_LinkEntity(ent, false, 0, entcs_send);
ent.customizeentityforclient = entcs_customize;
- self.entcs = ent;
-
return ent;
}
-void detach_entcs()
-{SELFPARAM();
- remove(self.entcs);
- self.entcs = world;
+void detach_entcs(entity e)
+{
+ if (!e.entcs) return;
+ remove(e.entcs);
+ e.entcs = NULL;
}