From 2cad58e8fe0e042972d95b1ad669a99f746cd124 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 6 Feb 2013 12:22:05 +1100 Subject: [PATCH] Add highly experimental RTS game-mode (for testing purposes) --- gamemodes.cfg | 10 ++ qcsrc/common/mapinfo.qh | 3 + qcsrc/server/monsters/lib/monsters.qc | 5 +- qcsrc/server/mutators/gamemode_rts.qc | 165 ++++++++++++++++++++++++++ qcsrc/server/mutators/mutators.qh | 1 + qcsrc/server/progs.src | 1 + qcsrc/server/teamplay.qc | 7 ++ 7 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 qcsrc/server/mutators/gamemode_rts.qc diff --git a/gamemodes.cfg b/gamemodes.cfg index 1219cd0ba..a01f05a37 100644 --- a/gamemodes.cfg +++ b/gamemodes.cfg @@ -39,6 +39,7 @@ alias cl_hook_gamestart_cts alias cl_hook_gamestart_ka alias cl_hook_gamestart_ft alias cl_hook_gamestart_td +alias cl_hook_gamestart_rts alias cl_hook_gameend alias cl_hook_activeweapon @@ -62,6 +63,7 @@ alias sv_hook_gamestart_cts alias sv_hook_gamestart_ka alias sv_hook_gamestart_ft alias sv_hook_gamestart_td +alias sv_hook_gamestart_rts alias sv_hook_gamerestart alias sv_hook_gameend @@ -146,6 +148,9 @@ set g_ft_weapon_stay 0 set g_td_respawn_waves 0 set g_td_respawn_delay 0 set g_td_weapon_stay 0 +set g_rts_respawn_waves 0 +set g_rts_respawn_delay 0 +set g_rts_weapon_stay 0 // ======= @@ -503,3 +508,8 @@ set g_td_turret_mlrs_cost 80 set g_td_turret_walker_cost 100 set g_td_tower_buff_cost 70 set g_td_turret_upgrade_cost 100 + +// ==================== +// real-time strategy +// ==================== +set g_rts 0 "Real-Time Strategy: defend your generator & turrets by controlling monsters" \ No newline at end of file diff --git a/qcsrc/common/mapinfo.qh b/qcsrc/common/mapinfo.qh index c036b6d8f..43ec2771e 100644 --- a/qcsrc/common/mapinfo.qh +++ b/qcsrc/common/mapinfo.qh @@ -42,6 +42,9 @@ REGISTER_GAMETYPE(_("Last Man Standing"),lms,g_lms,LMS,"timelimit=20 lives=9 lea REGISTER_GAMETYPE(_("Tower Defense"),td,g_td,TD,"timelimit=0 pointlimit=10 leadlimit=0") #define g_td IS_GAMETYPE(TD) +REGISTER_GAMETYPE(_("Real-Time Strategy"),rts,g_rts,RTS,"timelimit=0 pointlimit=10 leadlimit=0") +#define g_rts IS_GAMETYPE(RTS) + REGISTER_GAMETYPE(_("Arena"),arena,g_arena,ARENA,"timelimit=20 pointlimit=10 leadlimit=0") #define g_arena IS_GAMETYPE(ARENA) diff --git a/qcsrc/server/monsters/lib/monsters.qc b/qcsrc/server/monsters/lib/monsters.qc index f7612a76b..e6f53a681 100644 --- a/qcsrc/server/monsters/lib/monsters.qc +++ b/qcsrc/server/monsters/lib/monsters.qc @@ -78,6 +78,9 @@ float monster_isvalidtarget (entity targ, entity ent, float neutral) if(neutral == TRUE) return TRUE; // we come in peace! + if(targ.owner == ent.owner) + return FALSE; + if(targ.takedamage == DAMAGE_NO) return FALSE; // enemy can't be damaged @@ -461,7 +464,7 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ if(time >= self.last_trace) { - if(self.monster_movestate == MONSTER_MOVE_WANDER && self.goalentity.classname != "td_waypoint") + if(self.monster_movestate == MONSTER_MOVE_WANDER && (self.goalentity.classname != "td_waypoint" || self.goalentity != self.sprite)) self.last_trace = time + 2; else self.last_trace = time + 0.5; diff --git a/qcsrc/server/mutators/gamemode_rts.qc b/qcsrc/server/mutators/gamemode_rts.qc new file mode 100644 index 000000000..7cbf32f6f --- /dev/null +++ b/qcsrc/server/mutators/gamemode_rts.qc @@ -0,0 +1,165 @@ +// Real-Time Strategy +// Gamemode by Mario + +.vector oldorigin; +.float selected; +.float last_click; +MUTATOR_HOOKFUNCTION(rts_PlayerSpawn) +{ + self.oldorigin = self.origin; + self.last_click = time; + self.flags |= FL_NOTARGET; + self.movetype = MOVETYPE_FLY; + stuffcmd(self, "settemp cl_prydoncursor 1\n"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(rts_FilterItem) +{ + // no items... yet + return TRUE; +} + +MUTATOR_HOOKFUNCTION(rts_SetStartItems) +{ + WEPSET_COPY_AW(start_weapons, 0); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(rts_PlayerThink) +{ + entity head, wp = world; + if(self.cursor_trace_ent == world && self.BUTTON_ATCK) + { + FOR_EACH_MONSTER(head) + { + if(head.waypointsprite_attachedforcarrier) + WaypointSprite_Kill(head.waypointsprite_attachedforcarrier); + + head.selected = FALSE; + + if(head.owner == self) + head.owner = world; + } + } + if(self.cursor_trace_ent.flags & FL_MONSTER && self.BUTTON_ATCK && time >= self.last_click) + { + if(self.cursor_trace_ent.selected) + { + WaypointSprite_Kill(self.cursor_trace_ent.waypointsprite_attachedforcarrier); + self.cursor_trace_ent.selected = FALSE; + self.cursor_trace_ent.owner = world; + self.last_click = time + 0.5; // prevent spamming + } + else + { + WaypointSprite_Spawn("Selected", 0, 0, self.cursor_trace_ent, '0 0 64' + ('0 0 1' * self.cursor_trace_ent.maxs_z), world, 0, self.cursor_trace_ent, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); + + self.cursor_trace_ent.owner = self; + self.cursor_trace_ent.selected = TRUE; + self.last_click = time + 0.5; // prevent spamming + } + } + if(self.BUTTON_ATCK2) + { + if not(self.cursor_trace_ent) + { + float selected_count = 0; + FOR_EACH_MONSTER(head) { if(head.owner == self) selected_count += 1; } + if(selected_count > 0) + { + wp = spawn(); + setorigin(wp, self.cursor_trace_endpos); + WaypointSprite_SpawnFixed("Moving Here", wp.origin + '0 0 40', wp, sprite, RADARICON_HERE, '1 0.5 0'); + } + } + + FOR_EACH_MONSTER(head) + { + if(head.owner != self) continue; + + if(head.goalentity) + { + if(head.goalentity.sprite) + WaypointSprite_Kill(head.goalentity.sprite); + remove(head.goalentity); + head.goalentity = world; + } + + if(head.sprite) + WaypointSprite_Kill(head.sprite); + + if(self.cursor_trace_ent) + head.enemy = self.cursor_trace_ent; + else + head.goalentity = wp; + } + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(rts_MonsterSpawn) +{ + self.effects |= EF_SELECTABLE; + + if(self.sprite) + WaypointSprite_Kill(self.sprite); // no waypoint names in rts...? + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(rts_MonsterThink) +{ + if(self.selected) + self.colormod = '1 1 1' * 4; + else + self.colormod = '1 1 1'; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(rts_MonsterDies) +{ + if(self.waypointsprite_attachedforcarrier) + WaypointSprite_Kill(self.waypointsprite_attachedforcarrier); + + self.selected = FALSE; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(rts_PlayerPhysics) +{ + self.origin_z = self.oldorigin_z; + self.stat_sv_maxspeed *= 4; // lol + + return FALSE; +} + +MUTATOR_DEFINITION(gamemode_rts) +{ + MUTATOR_HOOK(PlayerPhysics, rts_PlayerPhysics, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerSpawn, rts_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(SetStartItems, rts_SetStartItems, CBC_ORDER_ANY); + MUTATOR_HOOK(FilterItem, rts_FilterItem, CBC_ORDER_ANY); + MUTATOR_HOOK(MonsterSpawn, rts_MonsterSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerPreThink, rts_PlayerThink, CBC_ORDER_ANY); + MUTATOR_HOOK(MonsterMove, rts_MonsterThink, CBC_ORDER_ANY); + MUTATOR_HOOK(MonsterDies, rts_MonsterDies, CBC_ORDER_ANY); + + MUTATOR_ONADD + { + if(time > 1) // game loads at time 1 + error("This is a game type and it cannot be added at runtime."); + cvar_settemp("g_monsters", "1"); + } + + MUTATOR_ONREMOVE + { + error("This is a game type and it cannot be removed at runtime."); + } + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh index e8a5aa8b9..7a8b5764a 100644 --- a/qcsrc/server/mutators/mutators.qh +++ b/qcsrc/server/mutators/mutators.qh @@ -6,6 +6,7 @@ MUTATOR_DECLARATION(gamemode_nexball); MUTATOR_DECLARATION(gamemode_onslaught); MUTATOR_DECLARATION(gamemode_td); MUTATOR_DECLARATION(gamemode_domination); +MUTATOR_DECLARATION(gamemode_rts); MUTATOR_DECLARATION(mutator_dodging); MUTATOR_DECLARATION(mutator_invincibleprojectiles); diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 3ac35eee2..f7029fe23 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -219,6 +219,7 @@ mutators/gamemode_keepaway.qc mutators/gamemode_nexball.qc mutators/gamemode_onslaught.qc mutators/gamemode_td.qc +mutators/gamemode_rts.qc mutators/mutator_invincibleproj.qc mutators/mutator_new_toys.qc mutators/mutator_nix.qc diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index fb3d0ae87..3581f6bd1 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -152,6 +152,13 @@ void InitGameplayMode() leadlimit_override = 0; MUTATOR_ADD(gamemode_td); } + + if(g_rts) + { + fraglimit_override = 0; + leadlimit_override = 0; + MUTATOR_ADD(gamemode_rts); + } if(g_runematch) { -- 2.39.2