]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Commit by Mario: Attempt to fix dropped weapon networking/spawning from
authorSamual Lenks <samual@xonotic.org>
Sun, 8 Dec 2013 04:41:24 +0000 (23:41 -0500)
committerSamual Lenks <samual@xonotic.org>
Sun, 8 Dec 2013 04:41:24 +0000 (23:41 -0500)
getting stuck inside walls.

qcsrc/server/t_items.qc
qcsrc/server/t_items.qh
qcsrc/server/weapons/throwing.qc

index 493ca337dc4822c6bb9d5a1a2b0519db2a359d96..86d19beec4411c59bc8e6c7d061e779ab1ddf168 100644 (file)
@@ -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;
 
index a64c8396a88a2c666821bba7ee368585f99f280a..0b9165c8ce519971fc2a431d21bf7175f50c016e 100644 (file)
@@ -11,6 +11,7 @@
 #define ISF_COLORMAP 16
 #define ISF_DROP 32
 #define ISF_ANGLES 64
+#define ISF_SIZE 128
 
 .float ItemStatus;
 
index 80a97d1e2f4c1921fdcd275a81c7ab4a5b24f701..84516ded0fa506f31dc8be3bbda67389d71d69d9 100644 (file)
@@ -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)