]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_buffs.qc
Add a limit to prevent ultra rare buffs
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_buffs.qc
index 7dfdaca6225f8c6c5c1b0164e1f43d99fa6663ee..3debf921c6bbb863ac4b56d4ae5c5b90b40982c1 100644 (file)
@@ -1,3 +1,11 @@
+#include "../../common/triggers/target/music.qh"
+#include "mutator_buffs.qh"
+#include "../_all.qh"
+
+#include "mutator.qh"
+
+#include "../../common/buffs.qh"
+
 float buffs_BuffModel_Customize()
 {
        entity player, myowner;
@@ -194,7 +202,7 @@ void buff_NewType(entity ent, float cb)
        for(e = Buff_Type_first; e; e = e.enemy)
        if(buff_Available(e.items))
        {
-               RandomSelection_Add(world, e.items, string_null, 1, 1 / e.count); // if it's already been chosen, give it a lower priority
+               RandomSelection_Add(world, e.items, string_null, 1, max(0.2, 1 / e.count)); // if it's already been chosen, give it a lower priority
                e.count += 1;
        }
        ent.buffs = RandomSelection_chosen_float;
@@ -238,7 +246,7 @@ void buff_Think()
                if(autocvar_g_buffs_randomize)
                        buff_NewType(self, self.buffs);
 
-               if(autocvar_g_buffs_random_location || (self.spawnflags & 1))
+               if(autocvar_g_buffs_random_location || (self.spawnflags & 64))
                        buff_Respawn(self);
        }
 
@@ -286,7 +294,7 @@ void buff_Reset()
        buff_Waypoint_Reset();
        self.buff_activetime_updated = false;
 
-       if(autocvar_g_buffs_random_location || (self.spawnflags & 1))
+       if(autocvar_g_buffs_random_location || (self.spawnflags & 64))
                buff_Respawn(self);
 }
 
@@ -311,9 +319,9 @@ float buff_Customize()
 
 void buff_Init(entity ent)
 {
-       if(!cvar("g_buffs")) { remove(self); return; }
+       if(!cvar("g_buffs")) { remove(ent); return; }
 
-       if(!teamplay && self.team) { self.team = 0; }
+       if(!teamplay && ent.team) { ent.team = 0; }
 
        entity oldself = self;
        self = ent;
@@ -341,13 +349,16 @@ void buff_Init(entity ent)
        self.buff_active = !self.buff_activetime;
        self.pflags = PFLAGS_FULLDYNAMIC;
 
+       if(self.spawnflags & 1)
+               self.noalign = true;
+
        if(self.noalign)
                self.movetype = MOVETYPE_NONE; // reset by random location
 
        setmodel(self, BUFF_MODEL);
        setsize(self, BUFF_MIN, BUFF_MAX);
 
-       if(cvar("g_buffs_random_location") || (self.spawnflags & 1))
+       if(cvar("g_buffs_random_location") || (self.spawnflags & 64))
                buff_Respawn(self);
 
        self = oldself;
@@ -369,7 +380,7 @@ void buff_SpawnReplacement(entity ent, entity old)
 {
        setorigin(ent, old.origin);
        ent.angles = old.angles;
-       ent.noalign = old.noalign;
+       ent.noalign = (old.noalign || (old.spawnflags & 1));
 
        buff_Init(ent);
 }
@@ -517,6 +528,12 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerPhysics)
                self.stat_sv_airspeedlimit_nonqw *= autocvar_g_buffs_disability_speed;
        }
 
+       if(self.buffs & BUFF_JUMP)
+       {
+               // automatically reset, no need to worry
+               self.stat_sv_jumpvelocity = autocvar_g_buffs_jump_height;
+       }
+
        return false;
 }
 
@@ -524,7 +541,6 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerJump)
 {
        if(self.buffs & BUFF_JUMP)
                player_jumpheight = autocvar_g_buffs_jump_height;
-       self.stat_jumpheight = player_jumpheight;
 
        return false;
 }
@@ -916,7 +932,7 @@ void buffs_DelayedInit()
                for(i = 0; i < autocvar_g_buffs_spawn_count; ++i)
                {
                        entity e = spawn();
-                       e.spawnflags |= 1; // always randomize
+                       e.spawnflags |= 64; // always randomize
                        e.velocity = randomvec() * 250; // this gets reset anyway if random location works
                        buff_Init(e);
                }
@@ -934,7 +950,6 @@ void buffs_Initialize()
 
        addstat(STAT_BUFFS, AS_INT, buffs);
        addstat(STAT_BUFF_TIME, AS_FLOAT, buff_time);
-       addstat(STAT_MOVEVARS_JUMPVELOCITY, AS_FLOAT, stat_jumpheight);
 
        InitializeEntity(world, buffs_DelayedInit, INITPRIO_FINDTARGET);
 }
@@ -956,7 +971,7 @@ MUTATOR_DEFINITION(mutator_buffs)
        MUTATOR_HOOK(ForbidThrowCurrentWeapon, buffs_PlayerThrowKey, CBC_ORDER_ANY);
        MUTATOR_HOOK(MakePlayerObserver, buffs_RemovePlayer, CBC_ORDER_ANY);
        MUTATOR_HOOK(ClientDisconnect, buffs_RemovePlayer, CBC_ORDER_ANY);
-       MUTATOR_HOOK(OnEntityPreSpawn, buffs_OnEntityPreSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(OnEntityPreSpawn, buffs_OnEntityPreSpawn, CBC_ORDER_LAST);
        MUTATOR_HOOK(CustomizeWaypoint, buffs_CustomizeWaypoint, CBC_ORDER_ANY);
        MUTATOR_HOOK(WeaponRateFactor, buffs_WeaponRate, CBC_ORDER_ANY);
        MUTATOR_HOOK(WeaponSpeedFactor, buffs_WeaponSpeed, CBC_ORDER_ANY);