]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/weapons/w_fireball.qc
Add weaponstartoverride property to weapons
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / w_fireball.qc
index 72a597712542b224cd669d6d4d2458f2fdd5991b..179559712a3a8abba8c53e6dd882b357d7811682 100644 (file)
@@ -10,42 +10,47 @@ REGISTER_WEAPON(
 /* netname  */ "fireball",
 /* fullname */ _("Fireball")
 );
-#define FIREBALL_SETTINGS(weapon) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, animtime) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, refire) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, damage) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, damageforcescale) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, speed) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, lifetime) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, laserburntime) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, laserdamage) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, laseredgedamage) \
-       WEP_ADD_CVAR(weapon, MO_BOTH, laserradius) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  edgedamage) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  force) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  radius) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  health) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  refire2) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  bfgdamage) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  bfgforce) \
-       WEP_ADD_CVAR(weapon, MO_PRI,  bfgradius) \
-       WEP_ADD_CVAR(weapon, MO_SEC,  damagetime) \
-       WEP_ADD_CVAR(weapon, MO_SEC,  speed_up) \
-       WEP_ADD_PROP(weapon, reloading_ammo, reload_ammo) \
-       WEP_ADD_PROP(weapon, reloading_time, reload_time) \
-       WEP_ADD_PROP(weapon, switchdelay_raise, switchdelay_raise) \
-       WEP_ADD_PROP(weapon, switchdelay_drop, switchdelay_drop)
 
-#ifdef SVQC
-FIREBALL_SETTINGS(fireball)
-void spawnfunc_weapon_fireball() { weapon_defaultspawnfunc(WEP_FIREBALL); }
+#define FIREBALL_SETTINGS(w_cvar,w_prop) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, animtime) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, refire) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, damage) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, damageforcescale) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, speed) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, spread) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, lifetime) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laserburntime) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laserdamage) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laseredgedamage) \
+       w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laserradius) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  edgedamage) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  force) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  radius) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  health) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  refire2) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  bfgdamage) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  bfgforce) \
+       w_cvar(WEP_FIREBALL, fireball, MO_PRI,  bfgradius) \
+       w_cvar(WEP_FIREBALL, fireball, MO_SEC,  damagetime) \
+       w_cvar(WEP_FIREBALL, fireball, MO_SEC,  speed_up) \
+       w_cvar(WEP_FIREBALL, fireball, MO_SEC,  speed_z) \
+       w_prop(WEP_FIREBALL, fireball, float,  reloading_ammo, reload_ammo) \
+       w_prop(WEP_FIREBALL, fireball, float,  reloading_time, reload_time) \
+       w_prop(WEP_FIREBALL, fireball, float,  switchdelay_raise, switchdelay_raise) \
+       w_prop(WEP_FIREBALL, fireball, float,  switchdelay_drop, switchdelay_drop) \
+       w_prop(WEP_FIREBALL, fireball, string, weaponreplace, weaponreplace) \
+       w_prop(WEP_FIREBALL, fireball, float,  weaponstart, weaponstart) \
+       w_prop(WEP_FIREBALL, fireball, float,  weaponstartoverride, weaponstartoverride)
 
+#ifdef SVQC
+FIREBALL_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 .float bot_primary_fireballmooth; // whatever a mooth is
 .vector fireball_impactvec;
 .float fireball_primarytime;
 #endif
 #else
 #ifdef SVQC
+void spawnfunc_weapon_fireball() { weapon_defaultspawnfunc(WEP_FIREBALL); }
 
 void W_Fireball_Explode (void)
 {
@@ -69,7 +74,7 @@ void W_Fireball_Explode (void)
                // 2. bfg effect
                // NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
                for(e = findradius(self.origin, WEP_CVAR_PRI(fireball, bfgradius)); e; e = e.chain)
-               if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(!IS_PLAYER(e) || !self.realowner || IsDifferentTeam(e, self))
+               if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(!IS_PLAYER(e) || !self.realowner || DIFF_TEAM(e, self))
                {
                        // can we see fireball?
                        traceline(e.origin + e.view_ofs, self.origin, MOVE_NORMAL, e);
@@ -114,7 +119,7 @@ void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage,
 
        RandomSelection_Init();
        for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain)
-       if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(!IS_PLAYER(e) || !self.realowner || IsDifferentTeam(e, self))
+       if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(!IS_PLAYER(e) || !self.realowner || DIFF_TEAM(e, self))
        {
                p = e.origin;
                p_x += e.mins_x + random() * (e.maxs_x - e.mins_x);
@@ -156,10 +161,10 @@ void W_Fireball_Damage (entity inflictor, entity attacker, float damage, float d
 {
        if(self.health <= 0)
                return;
-               
+
        if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, -1)) // no exceptions
                return; // g_projectiles_damage says to halt
-               
+
        self.health = self.health - damage;
        if (self.health <= 0)
        {
@@ -195,13 +200,13 @@ void W_Fireball_Attack1()
        setorigin(proj, w_shotorg);
 
        proj.movetype = MOVETYPE_FLY;
-       W_SETUPPROJECTILEVELOCITY(proj, g_balance_fireball_primary);
+       WEP_SETUPPROJVELOCITY_PRI(proj, fireball);
        proj.angles = vectoangles(proj.velocity);
        proj.touch = W_Fireball_TouchExplode;
        setsize(proj, '-16 -16 -16', '16 16 16');
        proj.flags = FL_PROJECTILE;
     proj.missile_flags = MIF_SPLASH | MIF_PROXY;
-    
+
        CSQCProjectile(proj, TRUE, PROJECTILE_FIREBALL, TRUE);
 
        other = proj; MUTATOR_CALLHOOK(EditProjectile);
@@ -241,7 +246,7 @@ void W_Fireball_Attack1_Frame1()
 void W_Fireball_Attack1_Frame0()
 {
        W_Fireball_AttackEffect(0, '-1.25 -3.75 0');
-       sound (self, CH_WEAPON_SINGLE, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
+       sound (self, CH_WEAPON_SINGLE, "weapons/fireball_prefire2.wav", VOL_BASE, ATTEN_NORM);
        weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), W_Fireball_Attack1_Frame1);
 }
 
@@ -327,12 +332,12 @@ void W_Fireball_Attack2()
        proj.nextthink = time;
        proj.damageforcescale = WEP_CVAR_SEC(fireball, damageforcescale);
        proj.pushltime = time + WEP_CVAR_SEC(fireball, lifetime);
-       W_SETUPPROJECTILEVELOCITY_UP(proj, g_balance_fireball_secondary);
+       WEP_SETUPPROJVELOCITY_UP_SEC(proj, fireball);
 
        proj.angles = vectoangles(proj.velocity);
        proj.flags = FL_PROJECTILE;
     proj.missile_flags = MIF_SPLASH | MIF_PROXY | MIF_ARC;
-    
+
        CSQCProjectile(proj, TRUE, PROJECTILE_FIREMINE, TRUE);
 
        other = proj; MUTATOR_CALLHOOK(EditProjectile);
@@ -396,16 +401,11 @@ float w_fireball(float req)
                        precache_sound ("weapons/fireball_fire.wav");
                        precache_sound ("weapons/fireball_fire2.wav");
                        precache_sound ("weapons/fireball_prefire2.wav");
-                       #define WEP_ADD_CVAR(weapon,mode,name) /*nothing*/
-                       #define WEP_ADD_PROP(weapon,prop,name) WEP_SET_PROP(WEP_FIREBALL,weapon,prop,name)
-                       FIREBALL_SETTINGS(fireball)
-                       #undef WEP_ADD_CVAR
-                       #undef WEP_ADD_PROP
+                       FIREBALL_SETTINGS(WEP_SKIPCVAR, WEP_SET_PROP)
                        return TRUE;
                }
                case WR_SETUP:
                {
-                       weapon_setup(WEP_FIREBALL);
                        self.current_ammo = ammo_none;
                        return TRUE;
                }
@@ -414,6 +414,11 @@ float w_fireball(float req)
                {
                        return TRUE; // fireball has infinite ammo
                }
+               case WR_CONFIG:
+               {
+                       FIREBALL_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS)
+                       return TRUE;
+               }
                case WR_RESETPLAYER:
                {
                        self.fireball_primarytime = time;
@@ -454,7 +459,7 @@ float w_fireball(float req)
                                org2 = w_org + w_backoff * 16;
                                pointparticles(particleeffectnum("fireball_explode"), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CH_SHOTS, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom
+                                       sound(self, CH_SHOTS, "weapons/fireball_impact2.wav", VOL_BASE, ATTEN_NORM * 0.25); // long range boom
                        }
                        
                        return TRUE;