]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/weapons/throwing.qc
Apply voted game type on map switch, not on game type vote end so that the "restart...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / throwing.qc
index e36bc68c62af99b39d543d4811140b9c35cee65a..782ee3aa39cc5f7c5e83cce6e0ca6bd05a48db95 100644 (file)
@@ -1,59 +1,44 @@
 #include "throwing.qh"
 
-#include "weaponsystem.qh"
-#include "../resources.qh"
-#include "../items.qh"
-#include <server/mutators/_mod.qh>
-#include <common/t_items.qh>
-#include "../g_damage.qh"
 #include <common/items/item.qh>
 #include <common/mapinfo.qh>
-#include <common/notifications/all.qh>
 #include <common/mapobjects/subs.qh>
+#include <common/mutators/mutator/status_effects/_mod.qh>
+#include <common/notifications/all.qh>
+#include <common/resources/sv_resources.qh>
+#include <common/state.qh>
 #include <common/util.qh>
 #include <common/weapons/_all.qh>
-#include <common/state.qh>
 #include <common/wepent.qh>
-
-void thrown_wep_think(entity this)
-{
-       this.nextthink = time;
-       if(this.oldorigin != this.origin)
-       {
-               this.SendFlags |= ISF_LOCATION;
-               this.oldorigin = this.origin;
-       }
-       this.owner = NULL;
-       float timeleft = this.savenextthink - time;
-       if(timeleft > 1)
-               SUB_SetFade(this, this.savenextthink - 1, 1);
-       else if(timeleft > 0)
-               SUB_SetFade(this, time, timeleft);
-       else
-               SUB_VanishOrRemove(this);
-}
+#include <server/damage.qh>
+#include <server/items/items.qh>
+#include <server/items/spawning.qh>
+#include <server/mutators/_mod.qh>
+#include <server/weapons/selection.qh>
+#include <server/weapons/weaponsystem.qh>
+#include <server/world.qh>
 
 // returns amount of ammo used, or -1 for failure, or 0 for no ammo count
 float W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo, .entity weaponentity)
 {
        Weapon info = REGISTRY_GET(Weapons, wpn);
-       int ammotype = info.ammo_type;
+       Resource ammotype = info.ammo_type;
 
        entity wep = spawn();
-       Item_SetLoot(wep, true);
+       ITEM_SET_LOOT(wep, true);
        setorigin(wep, org);
        wep.velocity = velo;
        wep.owner = wep.enemy = own;
        wep.flags |= FL_TOSSED;
        wep.colormap = own.colormap;
-       wep.glowmod = weaponentity_glowmod(info, own, own.clientcolors, own.(weaponentity));
+       // wep.glowmod will be set in weapon_defaultspawnfunc
        navigation_dynamicgoal_init(wep, false);
 
        W_DropEvent(wr_drop,own,wpn,wep,weaponentity);
 
        if(WepSet_FromWeapon(REGISTRY_GET(Weapons, wpn)) & WEPSET_SUPERWEAPONS)
        {
-               Item_SetExpiring(wep, true);
+               ITEM_SET_EXPIRING(wep, true);
                if(own.items & IT_UNLIMITED_SUPERWEAPONS)
                {
                        wep.superweapons_finished = time + autocvar_g_balance_superweapons_time;
@@ -67,15 +52,20 @@ float W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector
                        });
                        if(superweapons <= 1)
                        {
-                               wep.superweapons_finished = STAT(SUPERWEAPONS_FINISHED, own);
-                               STAT(SUPERWEAPONS_FINISHED, own) = 0;
+                               wep.superweapons_finished = StatusEffects_gettime(STATUSEFFECT_Superweapons, own);
+                               StatusEffects_remove(STATUSEFFECT_Superweapons, own, STATUSEFFECT_REMOVE_CLEAR);
                        }
                        else
                        {
-                               float timeleft = STAT(SUPERWEAPONS_FINISHED, own) - time;
+                               float timeleft = StatusEffects_gettime(STATUSEFFECT_Superweapons, own) - time;
                                float weptimeleft = timeleft / superweapons;
                                wep.superweapons_finished = time + weptimeleft;
-                               STAT(SUPERWEAPONS_FINISHED, own) -= weptimeleft;
+                               if(own.statuseffects)
+                               {
+                                       // TODO: this doesn't explicitly enable the effect, use apply here?
+                                       own.statuseffects.statuseffect_time[STATUSEFFECT_Superweapons.m_id] -= weptimeleft;
+                                       StatusEffects_update(own);
+                               }
                        }
                }
        }
@@ -83,9 +73,7 @@ float W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector
        weapon_defaultspawnfunc(wep, info);
        if(startitem_failed)
                return -1;
-       setthink(wep, thrown_wep_think);
-       wep.savenextthink = wep.nextthink;
-       wep.nextthink = min(wep.nextthink, time + 0.5);
+
        wep.pickup_anyway = true; // these are ALWAYS pickable
 
        //wa = W_AmmoItemCode(wpn);
@@ -147,6 +135,8 @@ void W_ThrowWeapon(entity this, .entity weaponentity, vector velo, vector delta,
        Weapon w = this.(weaponentity).m_weapon;
        if (w == WEP_Null)
                return; // just in case
+       if (time < game_starttime)
+               return;
        if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon, this, this.(weaponentity)))
                return;
        if(!autocvar_g_weapon_throwable)