// WEAPONTODO: rename the cvars
REGISTER_MUTATOR(weaponarena_random, true);
+MUTATOR_HOOKFUNCTION(weaponarena_random, SetStartItems)
+{
+ if(g_weaponarena)
+ g_weaponarena_random = cvar("g_weaponarena_random");
+ else
+ g_weaponarena_random = 0;
+
+ g_weaponarena_random_with_blaster = cvar("g_weaponarena_random_with_blaster");
+}
+
MUTATOR_HOOKFUNCTION(weaponarena_random, PlayerSpawn)
{
if (!g_weaponarena_random) return;
STAT(WEAPONS, player) = W_RandomWeapons(player, STAT(WEAPONS, player), g_weaponarena_random);
if (g_weaponarena_random_with_blaster) STAT(WEAPONS, player) |= WEPSET(BLASTER);
}
+
+MUTATOR_HOOKFUNCTION(weaponarena_random, GiveFragsForKill)
+{
+ if(!g_weaponarena_random) return;
+ entity attacker = M_ARGV(0, entity);
+ entity targ = M_ARGV(1, entity);
+ float deathtype = M_ARGV(3, float);
+ entity wep_ent = M_ARGV(4, entity);
+ .entity weaponentity = wep_ent.weaponentity_fld;
+
+ if(targ == attacker) return; // not for suicides
+
+ // after a frag, exchange the current weapon (or the culprit, if detectable) by a new random weapon
+ Weapon culprit = DEATH_WEAPONOF(deathtype);
+ if(!culprit) culprit = wep_ent.m_weapon;
+ else if(!(STAT(WEAPONS, attacker) & (culprit.m_wepset))) culprit = wep_ent.m_weapon;
+
+ if(g_weaponarena_random_with_blaster && culprit == WEP_BLASTER)
+ {
+ // no exchange
+ }
+ else
+ {
+ if(!GiveFrags_randomweapons)
+ {
+ GiveFrags_randomweapons = new(GiveFrags_randomweapons);
+ }
+
+ if(warmup_stage)
+ STAT(WEAPONS, GiveFrags_randomweapons) = WARMUP_START_WEAPONS;
+ else
+ STAT(WEAPONS, GiveFrags_randomweapons) = start_weapons;
+
+ // all others (including the culprit): remove
+ STAT(WEAPONS, GiveFrags_randomweapons) &= ~STAT(WEAPONS, attacker);
+ STAT(WEAPONS, GiveFrags_randomweapons) &= ~(culprit.m_wepset);
+
+ // among the remaining ones, choose one by random
+ STAT(WEAPONS, GiveFrags_randomweapons) = W_RandomWeapons(GiveFrags_randomweapons, STAT(WEAPONS, GiveFrags_randomweapons), 1);
+
+ if(STAT(WEAPONS, GiveFrags_randomweapons))
+ {
+ STAT(WEAPONS, attacker) |= STAT(WEAPONS, GiveFrags_randomweapons);
+ STAT(WEAPONS, attacker) &= ~(culprit.m_wepset);
+ }
+ }
+
+ // after a frag, choose another random weapon set
+ if (!(STAT(WEAPONS, attacker) & WepSet_FromWeapon(wep_ent.m_weapon)))
+ W_SwitchWeapon_Force(attacker, w_getbestweapon(attacker, weaponentity), weaponentity);
+}
#pragma once
+
+float g_weaponarena_random_with_blaster;
GameRules_scoring_add(targ, DEATHS, 1);
- if(targ != attacker) // not for suicides
- if(g_weaponarena_random)
- {
- // after a frag, exchange the current weapon (or the culprit, if detectable) by a new random weapon
- Weapon culprit = DEATH_WEAPONOF(deathtype);
- if(!culprit) culprit = attacker.(weaponentity).m_weapon;
- else if(!(STAT(WEAPONS, attacker) & (culprit.m_wepset))) culprit = attacker.(weaponentity).m_weapon;
-
- if(g_weaponarena_random_with_blaster && culprit == WEP_BLASTER) // WEAPONTODO: Shouldn't this be in a mutator?
- {
- // no exchange
- }
- else
- {
- if(!GiveFrags_randomweapons)
- {
- GiveFrags_randomweapons = new(GiveFrags_randomweapons);
- }
-
- if(warmup_stage)
- STAT(WEAPONS, GiveFrags_randomweapons) = WARMUP_START_WEAPONS;
- else
- STAT(WEAPONS, GiveFrags_randomweapons) = start_weapons;
-
- // all others (including the culprit): remove
- STAT(WEAPONS, GiveFrags_randomweapons) &= ~STAT(WEAPONS, attacker);
- STAT(WEAPONS, GiveFrags_randomweapons) &= ~(culprit.m_wepset);
-
- // among the remaining ones, choose one by random
- STAT(WEAPONS, GiveFrags_randomweapons) = W_RandomWeapons(GiveFrags_randomweapons, STAT(WEAPONS, GiveFrags_randomweapons), 1);
-
- if(STAT(WEAPONS, GiveFrags_randomweapons))
- {
- STAT(WEAPONS, attacker) |= STAT(WEAPONS, GiveFrags_randomweapons);
- STAT(WEAPONS, attacker) &= ~(culprit.m_wepset);
- }
- }
-
- // after a frag, choose another random weapon set
- if (!(STAT(WEAPONS, attacker) & WepSet_FromWeapon(attacker.(weaponentity).m_weapon)))
- W_SwitchWeapon_Force(attacker, w_getbestweapon(attacker, weaponentity), weaponentity);
- }
-
// FIXME fix the mess this is (we have REAL points now!)
- if(MUTATOR_CALLHOOK(GiveFragsForKill, attacker, targ, f))
+ if(MUTATOR_CALLHOOK(GiveFragsForKill, attacker, targ, f, deathtype, attacker.(weaponentity)))
f = M_ARGV(2, float);
attacker.totalfrags += f;
g_weaponarena_list = strzone(substring(g_weaponarena_list, 0, strlen(g_weaponarena_list) - 3));
}
- if(g_weaponarena)
- g_weaponarena_random = cvar("g_weaponarena_random");
- else
- g_weaponarena_random = 0;
- g_weaponarena_random_with_blaster = cvar("g_weaponarena_random_with_blaster");
-
if (g_weaponarena)
{
g_weapon_stay = 0; // incompatible
float g_pickup_weapons_anyway;
float g_weaponarena;
WepSet g_weaponarena_weapons;
-float g_weaponarena_random;
-float g_weaponarena_random_with_blaster;
+float g_weaponarena_random; // TODO
string g_weaponarena_list;
float g_weaponspeedfactor;
float g_weaponratefactor;
/** target */ i(entity, MUTATOR_ARGV_1_entity) \
/** frag score */ i(float, MUTATOR_ARGV_2_float) \
/** */ o(float, MUTATOR_ARGV_2_float) \
+ /** deathtype */ i(float, MUTATOR_ARGV_3_float) \
+ /** wep entity */ i(entity, MUTATOR_ARGV_4_entity) \
/**/
MUTATOR_HOOKABLE(GiveFragsForKill, EV_GiveFragsForKill);
if(g_weaponarena)
{
if(g_weaponarena_random)
- modifications = strcat(modifications, ", ", ftos(g_weaponarena_random), " of ", g_weaponarena_list, " Arena");
+ modifications = strcat(modifications, ", ", ftos(g_weaponarena_random), " of ", g_weaponarena_list, " Arena"); // TODO: somehow get this into the mutator
else
modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena");
}