X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fgamemode_invasion.qc;h=c6f6a02f63f521d3d2a1b0d73927ecffa23c9419;hb=74a4e5c118426a16f5656cdefbb0f5efa2f71124;hp=5dbe12d22d9c7701f042591b7d04e677509ec34f;hpb=32ca966802c45c4c231210c2d8776bc3f4135dc2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/gamemode_invasion.qc b/qcsrc/server/mutators/gamemode_invasion.qc index 5dbe12d22..c6f6a02f6 100644 --- a/qcsrc/server/mutators/gamemode_invasion.qc +++ b/qcsrc/server/mutators/gamemode_invasion.qc @@ -1,11 +1,22 @@ #include "gamemode_invasion.qh" -#include "../_all.qh" #include "gamemode.qh" #include "../../common/monsters/spawn.qh" #include "../../common/monsters/sv_monsters.qh" +#include "../teamplay.qh" + +float autocvar_g_invasion_round_timelimit; +int autocvar_g_invasion_teams; +bool autocvar_g_invasion_team_spawns; +float autocvar_g_invasion_spawnpoint_spawn_delay; +#define autocvar_g_invasion_point_limit cvar("g_invasion_point_limit") +float autocvar_g_invasion_warmup; +int autocvar_g_invasion_monster_count; +bool autocvar_g_invasion_zombies_only; +float autocvar_g_invasion_spawn_delay; + spawnfunc(invasion_spawnpoint) { if(!g_invasion) { remove(self); return; } @@ -13,8 +24,10 @@ spawnfunc(invasion_spawnpoint) self.classname = "invasion_spawnpoint"; if(autocvar_g_invasion_zombies_only) // precache only if it hasn't been already - if(self.monsterid) - MON_ACTION(self.monsterid, MR_PRECACHE); + if(self.monsterid) { + Monster mon = get_monsterinfo(self.monsterid); + mon.mr_precache(mon); + } } float invasion_PickMonster(float supermonster_count) @@ -260,7 +273,7 @@ void Invasion_RoundStart() } } -MUTATOR_HOOKFUNCTION(invasion_MonsterDies) +MUTATOR_HOOKFUNCTION(inv, MonsterDies) {SELFPARAM(); if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) { @@ -282,7 +295,7 @@ MUTATOR_HOOKFUNCTION(invasion_MonsterDies) return false; } -MUTATOR_HOOKFUNCTION(invasion_MonsterSpawn) +MUTATOR_HOOKFUNCTION(inv, MonsterSpawn) {SELFPARAM(); if(!(self.spawnflags & MONSTERFLAG_SPAWNED)) return true; @@ -303,7 +316,7 @@ MUTATOR_HOOKFUNCTION(invasion_MonsterSpawn) return false; } -MUTATOR_HOOKFUNCTION(invasion_OnEntityPreSpawn) +MUTATOR_HOOKFUNCTION(inv, OnEntityPreSpawn) {SELFPARAM(); if(startsWith(self.classname, "monster_")) if(!(self.spawnflags & MONSTERFLAG_SPAWNED)) @@ -312,7 +325,7 @@ MUTATOR_HOOKFUNCTION(invasion_OnEntityPreSpawn) return false; } -MUTATOR_HOOKFUNCTION(invasion_StartFrame) +MUTATOR_HOOKFUNCTION(inv, SV_StartFrame) { monsters_total = inv_maxspawned; // TODO: make sure numspawned never exceeds maxspawned monsters_killed = inv_numkilled; @@ -320,19 +333,19 @@ MUTATOR_HOOKFUNCTION(invasion_StartFrame) return false; } -MUTATOR_HOOKFUNCTION(invasion_PlayerRegen) +MUTATOR_HOOKFUNCTION(inv, PlayerRegen) { // no regeneration in invasion return true; } -MUTATOR_HOOKFUNCTION(invasion_PlayerSpawn) +MUTATOR_HOOKFUNCTION(inv, PlayerSpawn) {SELFPARAM(); self.bot_attack = false; return false; } -MUTATOR_HOOKFUNCTION(invasion_PlayerDamage) +MUTATOR_HOOKFUNCTION(inv, PlayerDamage_Calculate) { if(IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target) && frag_attacker != frag_target) { @@ -343,7 +356,7 @@ MUTATOR_HOOKFUNCTION(invasion_PlayerDamage) return false; } -MUTATOR_HOOKFUNCTION(invasion_PlayerCommand) +MUTATOR_HOOKFUNCTION(inv, SV_ParseClientCommand) {SELFPARAM(); if(MUTATOR_RETURNVALUE) // command was already handled? return false; @@ -364,7 +377,7 @@ MUTATOR_HOOKFUNCTION(invasion_PlayerCommand) return false; } -MUTATOR_HOOKFUNCTION(invasion_BotShouldAttack) +MUTATOR_HOOKFUNCTION(inv, BotShouldAttack) { if(!IS_MONSTER(checkentity)) return true; @@ -372,28 +385,27 @@ MUTATOR_HOOKFUNCTION(invasion_BotShouldAttack) return false; } -MUTATOR_HOOKFUNCTION(invasion_SetStartItems) +MUTATOR_HOOKFUNCTION(inv, SetStartItems) { start_health = 200; start_armorvalue = 200; - return false; } -MUTATOR_HOOKFUNCTION(invasion_AccuracyTargetValid) +MUTATOR_HOOKFUNCTION(inv, AccuracyTargetValid) { if(IS_MONSTER(frag_target)) return MUT_ACCADD_INVALID; return MUT_ACCADD_INDIFFERENT; } -MUTATOR_HOOKFUNCTION(invasion_AllowMobSpawning) +MUTATOR_HOOKFUNCTION(inv, AllowMobSpawning) { // monster spawning disabled during an invasion return true; } -MUTATOR_HOOKFUNCTION(invasion_GetTeamCount) +MUTATOR_HOOKFUNCTION(inv, GetTeamCount, CBC_ORDER_EXCLUSIVE) { ret_float = invasion_teams; return false; @@ -430,9 +442,10 @@ void invasion_DelayedInit() // Do this check with a delay so we can wait for tea void invasion_Initialize() { - if(autocvar_g_invasion_zombies_only) - MON_ACTION(MON_ZOMBIE.monsterid, MR_PRECACHE); - else + if(autocvar_g_invasion_zombies_only) { + Monster mon = MON_ZOMBIE; + mon.mr_precache(mon); + } else { float i; entity mon; @@ -442,28 +455,22 @@ void invasion_Initialize() if((mon.spawnflags & MONSTER_TYPE_FLY) || (mon.spawnflags & MONSTER_TYPE_SWIM)) continue; // flying/swimming monsters not yet supported - MON_ACTION(i, MR_PRECACHE); + mon.mr_precache(mon); } } InitializeEntity(world, invasion_DelayedInit, INITPRIO_GAMETYPE); } -MUTATOR_DEFINITION(gamemode_invasion) +REGISTER_MUTATOR(inv, g_invasion) { - MUTATOR_HOOK(MonsterDies, invasion_MonsterDies, CBC_ORDER_ANY); - MUTATOR_HOOK(MonsterSpawn, invasion_MonsterSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(OnEntityPreSpawn, invasion_OnEntityPreSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(SV_StartFrame, invasion_StartFrame, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerRegen, invasion_PlayerRegen, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerSpawn, invasion_PlayerSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDamage_Calculate, invasion_PlayerDamage, CBC_ORDER_ANY); - MUTATOR_HOOK(SV_ParseClientCommand, invasion_PlayerCommand, CBC_ORDER_ANY); - MUTATOR_HOOK(BotShouldAttack, invasion_BotShouldAttack, CBC_ORDER_ANY); - MUTATOR_HOOK(SetStartItems, invasion_SetStartItems, CBC_ORDER_ANY); - MUTATOR_HOOK(AccuracyTargetValid, invasion_AccuracyTargetValid, CBC_ORDER_ANY); - MUTATOR_HOOK(AllowMobSpawning, invasion_AllowMobSpawning, CBC_ORDER_ANY); - MUTATOR_HOOK(GetTeamCount, invasion_GetTeamCount, CBC_ORDER_ANY); + SetLimits(autocvar_g_invasion_point_limit, -1, -1, -1); + if(autocvar_g_invasion_teams >= 2) + { + ActivateTeamplay(); + if(autocvar_g_invasion_team_spawns) + have_team_spawns = -1; // request team spawns + } MUTATOR_ONADD {