From: Samual Lenks <samual@xonotic.org>
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: https://git.rm.cloudns.org/?a=commitdiff_plain;h=5fd71ce5ea75779f5a260b4602c03814ebf45bdc;p=xonotic%2Fxonotic-data.pk3dir.git

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 1f6a82b84..25a41f13d 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 000000000..83a2d0bf5
--- /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 39c29037a..028519372 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 302938b26..c4021fc39 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()