From: Samual Lenks Date: Mon, 10 Sep 2012 07:41:08 +0000 (-0400) Subject: Improvements to Keepaway (move scorerules to ka file, split declarations) X-Git-Tag: xonotic-v0.7.0~240^2~10 X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=5fd71ce5ea75779f5a260b4602c03814ebf45bdc Improvements to Keepaway (move scorerules to ka file, split declarations) --- diff --git a/qcsrc/server/mutators/gamemode_keepaway.qc b/qcsrc/server/mutators/gamemode_keepaway.qc index 1f6a82b84b..25a41f13d2 100644 --- a/qcsrc/server/mutators/gamemode_keepaway.qc +++ b/qcsrc/server/mutators/gamemode_keepaway.qc @@ -1,61 +1,23 @@ -void ka_SpawnBall(void); -void ka_TouchEvent(void); -void ka_RespawnBall(void); -void ka_DropEvent(entity); -void ka_TimeScoring(void); -void ka_EventLog(string, entity); +// =========================================================== +// Keepaway game mode coding, written by Samual and Diabolik +// Last updated: September, 2012 +// =========================================================== -entity ka_ball; - -float ka_ballcarrier_waypointsprite_visible_for_player(entity); - -void ka_Initialize() // run at the start of a match, initiates game mode +float ka_ballcarrier_waypointsprite_visible_for_player(entity e) // runs on waypoints which are attached to ballcarriers, updates once per frame { - if(!g_keepaway) - return; + if(e.ballcarried) + if(other.classname == "spectator") + return FALSE; // we don't want spectators of the ballcarrier to see the attached waypoint on the top of their screen - precache_sound("keepaway/pickedup.wav"); - precache_sound("keepaway/dropped.wav"); - precache_sound("keepaway/respawn.wav"); - precache_sound("keepaway/touch.wav"); - - ScoreRules_keepaway(); - ka_SpawnBall(); -} - -void ka_Reset() // used to clear the ballcarrier whenever the match switches from warmup to normal -{ - if(self.owner) - if(self.owner.classname == "player") - ka_DropEvent(self.owner); + // TODO: Make the ballcarrier lack a waypointsprite whenever they have the invisibility powerup - ka_RespawnBall(); + return TRUE; } -void ka_SpawnBall() // loads various values for the ball, runs only once at start of match +void ka_EventLog(string mode, entity actor) // use an alias for easy changing and quick editing later { - if(!g_keepaway) { return; } - - entity e; - e = spawn(); - e.model = "models/orbs/orbblue.md3"; - precache_model(e.model); - setmodel(e, e.model); - setsize(e, '-16 -16 -20', '16 16 20'); // 20 20 20 was too big, player is only 16 16 24... gotta cheat with the Z (20) axis so that the particle isn't cut off - e.classname = "keepawayball"; - e.damageforcescale = autocvar_g_keepawayball_damageforcescale; - e.takedamage = DAMAGE_YES; - e.solid = SOLID_TRIGGER; - e.movetype = MOVETYPE_BOUNCE; - e.glow_color = autocvar_g_keepawayball_trail_color; - e.glow_trail = TRUE; - e.flags = FL_ITEM; - e.reset = ka_Reset; - e.touch = ka_TouchEvent; - e.owner = world; - ka_ball = e; - - InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So. + if(autocvar_sv_eventlog) + GameLogEcho(strcat(":ka:", mode, ((actor != world) ? (strcat(":", ftos(actor.playerid))) : ""))); } void ka_RespawnBall() // runs whenever the ball needs to be relocated @@ -87,6 +49,18 @@ void ka_RespawnBall() // runs whenever the ball needs to be relocated } } +void ka_TimeScoring() +{ + if(self.owner.ballcarried) + { // add points for holding the ball after a certain amount of time + if(autocvar_g_keepaway_score_timepoints) + PlayerScore_Add(self.owner, SP_SCORE, autocvar_g_keepaway_score_timepoints); + + PlayerScore_Add(self.owner, SP_KEEPAWAY_BCTIME, (autocvar_g_keepaway_score_timeinterval / 1)); // interval is divided by 1 so that time always shows "seconds" + self.nextthink = time + autocvar_g_keepaway_score_timeinterval; + } +} + void ka_TouchEvent() // runs any time that the ball comes in contact with something { if(gameover) { return; } @@ -185,34 +159,18 @@ void ka_DropEvent(entity plyr) // runs any time that a player is supposed to los WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier); } -float ka_ballcarrier_waypointsprite_visible_for_player(entity e) // runs on waypoints which are attached to ballcarriers, updates once per frame +void ka_Reset() // used to clear the ballcarrier whenever the match switches from warmup to normal { - if(e.ballcarried) - if(other.classname == "spectator") - return FALSE; // we don't want spectators of the ballcarrier to see the attached waypoint on the top of their screen - - // TODO: Make the ballcarrier lack a waypointsprite whenever they have the invisibility powerup + if((self.owner) && (self.owner.classname == "player")) + ka_DropEvent(self.owner); - return TRUE; + ka_RespawnBall(); } -void ka_TimeScoring() -{ - if(self.owner.ballcarried) - { // add points for holding the ball after a certain amount of time - if(autocvar_g_keepaway_score_timepoints) - PlayerScore_Add(self.owner, SP_SCORE, autocvar_g_keepaway_score_timepoints); - - PlayerScore_Add(self.owner, SP_KEEPAWAY_BCTIME, (autocvar_g_keepaway_score_timeinterval / 1)); // interval is divided by 1 so that time always shows "seconds" - self.nextthink = time + autocvar_g_keepaway_score_timeinterval; - } -} -void ka_EventLog(string mode, entity actor) // use an alias for easy changing and quick editing later -{ - if(autocvar_sv_eventlog) - GameLogEcho(strcat(":ka:", mode, ((actor != world) ? (strcat(":", ftos(actor.playerid))) : ""))); -} +// ============== +// Hook Functions +// ============== MUTATOR_HOOKFUNCTION(ka_Scoring) { @@ -314,6 +272,61 @@ MUTATOR_HOOKFUNCTION(ka_PlayerPowerups) return 0; } + +// ============== +// Initialization +// ============== + +void ka_SpawnBall() // loads various values for the ball, runs only once at start of match +{ + if(!g_keepaway) { return; } + + entity e; + e = spawn(); + e.model = "models/orbs/orbblue.md3"; + precache_model(e.model); + setmodel(e, e.model); + setsize(e, '-16 -16 -20', '16 16 20'); // 20 20 20 was too big, player is only 16 16 24... gotta cheat with the Z (20) axis so that the particle isn't cut off + e.classname = "keepawayball"; + e.damageforcescale = autocvar_g_keepawayball_damageforcescale; + e.takedamage = DAMAGE_YES; + e.solid = SOLID_TRIGGER; + e.movetype = MOVETYPE_BOUNCE; + e.glow_color = autocvar_g_keepawayball_trail_color; + e.glow_trail = TRUE; + e.flags = FL_ITEM; + e.reset = ka_Reset; + e.touch = ka_TouchEvent; + e.owner = world; + ka_ball = e; + + InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So. +} + +void ka_ScoreRules() +{ + ScoreRules_basics(0, SFL_SORT_PRIO_PRIMARY, 0, TRUE); // SFL_SORT_PRIO_PRIMARY + ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_PICKUPS, "pickups", 0); + ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_CARRIERKILLS, "bckills", 0); + ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_BCTIME, "bctime", SFL_SORT_PRIO_SECONDARY); + ScoreRules_basics_end(); +} + +void ka_Initialize() // run at the start of a match, initiates game mode +{ + if(!g_keepaway) + return; + + precache_sound("keepaway/pickedup.wav"); + precache_sound("keepaway/dropped.wav"); + precache_sound("keepaway/respawn.wav"); + precache_sound("keepaway/touch.wav"); + + ka_ScoreRules(); + ka_SpawnBall(); +} + + MUTATOR_DEFINITION(gamemode_keepaway) { MUTATOR_HOOK(MakePlayerObserver, ka_RemovePlayer, CBC_ORDER_ANY); diff --git a/qcsrc/server/mutators/gamemode_keepaway.qh b/qcsrc/server/mutators/gamemode_keepaway.qh new file mode 100644 index 0000000000..83a2d0bf5b --- /dev/null +++ b/qcsrc/server/mutators/gamemode_keepaway.qh @@ -0,0 +1,5 @@ +entity ka_ball; + +#define SP_KEEPAWAY_PICKUPS 4 +#define SP_KEEPAWAY_CARRIERKILLS 5 +#define SP_KEEPAWAY_BCTIME 6 diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 39c29037a0..028519372f 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -31,6 +31,7 @@ mutators/base.qh mutators/mutators.qh mutators/gamemode_ctf.qh mutators/gamemode_keyhunt.qh // TODO fix this +mutators/gamemode_keepaway.qh mutators/gamemode_nexball.qh mutators/mutator_dodging.qh diff --git a/qcsrc/server/scores_rules.qc b/qcsrc/server/scores_rules.qc index 302938b267..c4021fc397 100644 --- a/qcsrc/server/scores_rules.qc +++ b/qcsrc/server/scores_rules.qc @@ -149,19 +149,6 @@ void ScoreRules_nexball(float teams) ScoreRules_basics_end(); } -// Keep Away stuff -#define SP_KEEPAWAY_PICKUPS 4 -#define SP_KEEPAWAY_CARRIERKILLS 5 -#define SP_KEEPAWAY_BCTIME 6 -void ScoreRules_keepaway() -{ - ScoreRules_basics(0, SFL_SORT_PRIO_PRIMARY, 0, TRUE); // SFL_SORT_PRIO_PRIMARY - ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_PICKUPS, "pickups", 0); - ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_CARRIERKILLS, "bckills", 0); - ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_BCTIME, "bctime", SFL_SORT_PRIO_SECONDARY); - ScoreRules_basics_end(); -} - // FreezeTag stuff #define SP_FREEZETAG_REVIVALS 4 void ScoreRules_freezetag()