From: Samual Lenks Date: Sun, 8 Dec 2013 04:41:24 +0000 (-0500) Subject: Commit by Mario: Attempt to fix dropped weapon networking/spawning from X-Git-Tag: xonotic-v0.8.0~152^2~303 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=7a738be3163631386e6750d4d60a25529ab138ce;p=xonotic%2Fxonotic-data.pk3dir.git Commit by Mario: Attempt to fix dropped weapon networking/spawning from getting stuck inside walls. --- diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 493ca337d..86d19beec 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -67,6 +67,17 @@ void ItemRead(float _IsNew) self.move_angles = self.angles; } + if(sf & ISF_SIZE) + { + self.mins_x = ReadCoord(); + self.mins_y = ReadCoord(); + self.mins_z = ReadCoord(); + self.maxs_x = ReadCoord(); + self.maxs_y = ReadCoord(); + self.maxs_z = ReadCoord(); + setsize(self, self.mins, self.maxs); + } + if(sf & ISF_STATUS) // need to read/write status frist so model can handle simple, fb etc. { self.ItemStatus = ReadByte(); @@ -110,7 +121,7 @@ void ItemRead(float _IsNew) if(sf & ISF_MODEL) { self.drawmask = MASK_NORMAL; - self.movetype = MOVETYPE_NOCLIP; + self.movetype = MOVETYPE_TOSS; self.draw = ItemDraw; if(self.mdl) @@ -158,7 +169,7 @@ void ItemRead(float _IsNew) if(sf & ISF_DROP) { self.gravity = 1; - self.move_angles = '0 0 0'; + //self.move_angles = '0 0 0'; self.move_movetype = MOVETYPE_TOSS; self.move_velocity_x = ReadCoord(); self.move_velocity_y = ReadCoord(); @@ -213,6 +224,16 @@ float ItemSend(entity to, float sf) WriteCoord(MSG_ENTITY, self.angles_z); } + if(sf & ISF_SIZE) + { + WriteCoord(MSG_ENTITY, self.mins_x); + WriteCoord(MSG_ENTITY, self.mins_y); + WriteCoord(MSG_ENTITY, self.mins_z); + WriteCoord(MSG_ENTITY, self.maxs_x); + WriteCoord(MSG_ENTITY, self.maxs_y); + WriteCoord(MSG_ENTITY, self.maxs_z); + } + if(sf & ISF_STATUS) WriteByte(MSG_ENTITY, self.ItemStatus); @@ -392,6 +413,16 @@ void Item_Show (entity e, float mode) e.SendFlags |= ISF_STATUS; } +void Item_Think() +{ + self.nextthink = time; + if(self.origin != self.oldorigin) + { + self.oldorigin = self.origin; + ItemUpdate(self); + } +} + void Item_Respawn (void) { Item_Show(self, 1); @@ -404,6 +435,9 @@ void Item_Respawn (void) sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTEN_NORM); // play respawn sound setorigin (self, self.origin); + self.think = Item_Think; + self.nextthink = time; + //pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1); pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1); } @@ -467,6 +501,19 @@ void Item_RespawnCountdown (void) } } +void Item_RespawnThink() +{ + self.nextthink = time; + if(self.origin != self.oldorigin) + { + self.oldorigin = self.origin; + ItemUpdate(self); + } + + if(time >= self.wait) + Item_Respawn(); +} + void Item_ScheduleRespawnIn(entity e, float t) { if((e.flags & FL_POWERUP) || (e.weapons & WEPSET_SUPERWEAPONS)) @@ -477,8 +524,9 @@ void Item_ScheduleRespawnIn(entity e, float t) } else { - e.think = Item_Respawn; - e.nextthink = time + t; + e.think = Item_RespawnThink; + e.nextthink = time; + e.wait = time + t; } } @@ -712,8 +760,8 @@ void Item_Reset() if(self.classname != "droppedweapon") { - self.think = func_null; - self.nextthink = 0; + self.think = Item_Think; + self.nextthink = time; if(self.waypointsprite_attached) WaypointSprite_Kill(self.waypointsprite_attached); @@ -988,6 +1036,9 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, setsize (self, '-16 -16 0', '16 16 48'); else setsize (self, '-16 -16 0', '16 16 32'); + + self.SendFlags |= ISF_SIZE; + // note droptofloor returns FALSE if stuck/or would fall too far droptofloor(); waypoint_spawnforitem(self); @@ -1061,6 +1112,8 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, } setsize (self, self.pos1, self.pos2); + self.SendFlags |= ISF_SIZE; + if(itemflags & FL_POWERUP) self.ItemStatus |= ITS_ANIMATE1; diff --git a/qcsrc/server/t_items.qh b/qcsrc/server/t_items.qh index a64c8396a..0b9165c8c 100644 --- a/qcsrc/server/t_items.qh +++ b/qcsrc/server/t_items.qh @@ -11,6 +11,7 @@ #define ISF_COLORMAP 16 #define ISF_DROP 32 #define ISF_ANGLES 64 +#define ISF_SIZE 128 .float ItemStatus; diff --git a/qcsrc/server/weapons/throwing.qc b/qcsrc/server/weapons/throwing.qc index 80a97d1e2..84516ded0 100644 --- a/qcsrc/server/weapons/throwing.qc +++ b/qcsrc/server/weapons/throwing.qc @@ -1,5 +1,11 @@ void thrown_wep_think() { + self.nextthink = time; + if(self.oldorigin != self.origin) + { + self.SendFlags |= ISF_LOCATION; + self.oldorigin = self.origin; + } self.owner = world; float timeleft = self.savenextthink - time; if(timeleft > 1)