.float anim_start_time; // reusing for bob waveform synchronisation
.vector angles_held; // reusing for (re)storing original angles
.float wait, delay, pointtime; // reusing for despawn effects
+.vector m_mins, m_maxs; // reusing for storing standard bbox (same purpose as in SVQC itemdef)
HashMap ENT_CLIENT_ITEM_simple;
STATIC_INIT(ENT_CLIENT_ITEM_simple)
LOG_WARNF("this.model is unset for item %s", this.classname);
precache_model(this.model);
_setmodel(this, this.model);
- setsize(this, '-16 -16 0', '16 16 48');
- // bones_was_here TODO: network proper box size for sv_legacy_bbox_expand 0
+ setsize(this, this.m_mins, this.m_maxs);
}
void ItemDraw(entity this)
if (bobheight != this.origin_z - this.oldorigin_z)
{
this.origin_z = this.oldorigin_z + bobheight;
- this.mins_z = 0 - bobheight; // don't want the absmin and absmax to bob
- this.maxs_z = 48 - bobheight;
- // bones_was_here TODO: network proper box size for sv_legacy_bbox_expand 0
+ this.mins_z = this.m_mins.z - bobheight; // don't want the absmin and absmax to bob
+ this.maxs_z = this.m_maxs.z - bobheight;
}
// set alpha based on distance
this.angles = this.angles_held = ReadAngleVector();
}
- /* bones_was_here TODO: network proper box size for sv_legacy_bbox_expand 0
- if(sf & ISF_SIZE)
- {
- setsize(this, '-16 -16 0', '16 16 48');
- }
- */
-
if(sf & ISF_STATUS) // need to read/write status first so model can handle simple, fb etc.
{
int prevItemStatus = this.ItemStatus;
}
}
- if(sf & ISF_MODEL)
+ if(sf & ISF_SIZE || sf & ISF_SIZE2) // always true when it's spawned (in CSQC's perspective)
{
if(isnew)
{
this.entremove = ItemRemove;
}
+ if(sf & ISF_SIZE && !(sf & ISF_SIZE2)) // Small
+ {
+ this.m_mins = ITEM_S_MINS;
+ this.m_maxs = ITEM_S_MAXS;
+ }
+ else if(!(sf & ISF_SIZE) && sf & ISF_SIZE2) // Large
+ {
+ this.m_mins = ITEM_D_MINS;
+ this.m_maxs = ITEM_L_MAXS;
+ }
+ else // Default
+ {
+ this.m_mins = ITEM_D_MINS;
+ this.m_maxs = ITEM_D_MAXS;
+ }
+
this.fade_end = ReadShort();
strcpy(this.mdl, ReadString());
SET_ONGROUND(this); // extra overkill
}
- if(sf & ISF_REMOVEFX && !(sf & ISF_SIZE) && !(sf & ISF_MODEL)) // TODO !isnew isn't reliable for this... are we double sending initialisations?
+ if(sf & ISF_REMOVEFX && !(sf & ISF_SIZE) && !(sf & ISF_SIZE2)) // TODO !isnew isn't reliable for this... are we double sending initialisations?
{
// no longer available to pick up, about to be removed
if (this.drawmask) // this.alpha > 0
else
sf &= ~ISF_DROP;
+ // if this item is being spawned (in CSQC's perspective)
+ // reuse ISF_SIZE and ISF_SIZE2 to also tell CSQC its bbox size
+ if(sf & ISF_SIZE)
+ {
+ if(this.maxs == ITEM_S_MAXS) // Small
+ {
+ sf |= ISF_SIZE;
+ sf &= ~ISF_SIZE2;
+ }
+ else if(this.maxs == ITEM_L_MAXS) // Large
+ {
+ sf &= ~ISF_SIZE;
+ sf |= ISF_SIZE2;
+ }
+ else // Default
+ sf |= ISF_SIZE | ISF_SIZE2;
+ }
+
WriteHeader(MSG_ENTITY, ENT_CLIENT_ITEM);
WriteByte(MSG_ENTITY, sf);
WriteAngleVector(MSG_ENTITY, this.angles);
}
- // sets size on the client, unused on server
- //if(sf & ISF_SIZE)
-
if(sf & ISF_STATUS)
WriteByte(MSG_ENTITY, this.ItemStatus);
- if(sf & ISF_MODEL)
+ if(sf & ISF_SIZE || sf & ISF_SIZE2) // always true when it's spawned (in CSQC's perspective)
{
WriteShort(MSG_ENTITY, bound(0, this.fade_end, 32767));