]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/gamemode_keepaway.qc
Update waypoints in keepaway slightly - this creates a bug on initialization/spawning...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / gamemode_keepaway.qc
index 607705384b610f23850b5a0205043a2f29cd60cf..6394f3f07cf67d04468bf0932793d7c9ab9b7d04 100644 (file)
@@ -1,6 +1,7 @@
 void ka_SpawnBall(void);
-void ka_TouchEvent(entity);
+void ka_TouchEvent(void);
 void ka_RespawnBall(void);
+void ka_DropEvent(entity);
 
 void ka_Initialize()
 {
@@ -9,6 +10,8 @@ void ka_Initialize()
                
        precache_sound("keepaway/pickedup.wav");
        precache_sound("keepaway/dropped.wav");
+
+       ScoreRules_keepaway();
        
        entity e;
        e = spawn();
@@ -16,15 +19,15 @@ void ka_Initialize()
        e.nextthink = time;
 }
 
-void ka_SpawnBall()
+void ka_SpawnBall() // self = the ball
 {
        if(!g_keepaway) { 
                remove(self); 
                return; 
        }
        if (!self.model) {
-               self.model = "models/nexball/ball.md3"; 
-               self.scale = 1.3;
+               self.model = "models/orbs/orbblue.md3"; 
+               self.scale = 1;
        }
 
        precache_model(self.model);
@@ -42,8 +45,10 @@ void ka_SpawnBall()
        //self.reset = ka_Reset;
        self.owner = world;
        
-       // todo: Waypoints and radar
-       //WaypointSprite_AttachCarrier();
+       //WaypointSprite_AttachCarrier("ka-ball", self);
+       //WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
+       //WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
+       // wtf radar doesn't work when not in a team environment?
 }
 
 void ka_RespawnBall()
@@ -58,6 +63,7 @@ void ka_RespawnBall()
                //self.touch = ka_TouchEvent;
                self.think = ka_RespawnBall;
                self.nextthink = time + cvar("g_keepawayball_respawntime");
+               WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
        }
        else
        {
@@ -67,7 +73,7 @@ void ka_RespawnBall()
        }
 }
 
-void ka_TouchEvent(entity plyr)
+void ka_TouchEvent()
 {
        if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
        {
@@ -75,17 +81,17 @@ void ka_TouchEvent(entity plyr)
                self.nextthink = time;
                return;
        }
-       if (!plyr) 
-               return;
-       if (!self) 
+       if(!self) 
                return;
-       if ((other.classname != "player" || other.health < 1) && (time > self.ctf_droptime + cvar("g_keepawayball_respawntime")))
+       if(other.classname != "player" || other.health < 1)
                return;
-       if (self.wait > time)
+       if(self.wait > time)
                return;
+       //if(time > self.ctf_droptime + cvar("g_keepawayball_respawntime"))
+       //      return;
 
        self.owner = other;
-       other.ballcarried = self;
+       other.kaballcarried = self;
        setattachment(self, other, "");
        setorigin(self, BALL_ATTACHORG);
        
@@ -99,8 +105,8 @@ void ka_TouchEvent(entity plyr)
 
        self.glow_color = cvar("g_keepawayball_trail_color");
        self.glow_trail = TRUE;
-       plyr.effects |= 8;
-       plyr.alpha = 0.6;
+       other.effects |= 8;
+       other.alpha = 0.6;
 
        bprint(other.netname, "^7 has picked up the ball!\n");
        WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
@@ -109,48 +115,19 @@ void ka_TouchEvent(entity plyr)
        
        PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
 
-       // todo: Waypoints and radar
+       WaypointSprite_AttachCarrier("ka-ballcarrier", other);
+       WaypointSprite_UpdateRule(other.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+       WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
+       WaypointSprite_Kill(self.waypointsprite_attachedforcarrier);
 }
 
-MUTATOR_HOOKFUNCTION(ka_RemovePlayer)
+void ka_DropEvent(entity plyr) 
 {
        entity ball;
-       ball = self.ballcarried;
+       ball = plyr.kaballcarried;
 
-       setattachment(ball, world, "");
-       ball.movetype = MOVETYPE_BOUNCE;
-       ball.solid = SOLID_TRIGGER;
-       ball.wait = time + 1;
-       ball.ctf_droptime = time;
-       ball.think = ka_SpawnBall;
-       ball.nextthink = time + cvar("g_keepawayball_respawntime");
-       ball.touch = ka_TouchEvent;
-       self.effects = EF_LOWPRECISION;
-       self.alpha = 1.0;
-       ball.alpha = 1.0;
-       setorigin(ball, self.origin + '0 0 10');
-       ball.velocity = '0 0 200' + '0 100 0'*crandom() + '100 0 0'*crandom();
-       
-       bprint(self.netname, "^7 has dropped the ball!\n");
-       WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
-       WriteString(MSG_BROADCAST, strcat("\n\n", self.netname, "^7 has dropped the ball!\n"));
-       sound(other, CHAN_AUTO, "keepaway/dropped.wav", VOL_BASE, ATTN_NORM);   
+       if(!ball) { return; }
        
-       PlayerScore_Add(self, SP_KEEPAWAY_DROPS, 1);
-       
-       // todo
-       //WaypointSprite_AttachCarrier("ka-ball", ball);
-       //WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
-       
-       ball.owner.ballcarried = world;
-       ball.owner = world;
-
-       return 1;
-}
-
-/*
-void ka_DropEvent(entity plyr, entity ball)
-{      
        setattachment(ball, world, "");
        ball.movetype = MOVETYPE_BOUNCE;
        ball.solid = SOLID_TRIGGER;
@@ -164,7 +141,7 @@ void ka_DropEvent(entity plyr, entity ball)
        ball.alpha = 1.0;
        setorigin(ball, plyr.origin + '0 0 10');
        ball.velocity = '0 0 200' + '0 100 0'*crandom() + '100 0 0'*crandom();
-       
+
        bprint(plyr.netname, "^7 has dropped the ball!\n");
        WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
        WriteString(MSG_BROADCAST, strcat("\n\n", plyr.netname, "^7 has dropped the ball!\n"));
@@ -173,100 +150,56 @@ void ka_DropEvent(entity plyr, entity ball)
        PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1);
        
        // todo
+       WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+       WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
+       //WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);
        //WaypointSprite_AttachCarrier("ka-ball", ball);
-       //WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
-       
+       //WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+       //WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
+       //WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);  
+
        ball.owner.kaballcarried = world;
        ball.owner = world;
 }
 
-
-void ka_CheckWinner()
+MUTATOR_HOOKFUNCTION(ka_RemovePlayer)
 {
-
+       if(self.kaballcarried) { ka_DropEvent(self); }
+       return 1;
 }
 
-MUTATOR_HOOKFUNCTION(ka_PlayerDies)
+MUTATOR_HOOKFUNCTION(ka_Scoring)
 {
-       float i;
-       entity e;
-
-       float temp_tag_players_count;
-       temp_tag_players_count = tag_players_count;
-
-       if(frag_target.tagcolor == frag_target.tagcolor_original) // if this is the first time we die... (our tagcolor remained unchanged)
+       if not(frag_attacker == frag_target)
        {
-               for(i = 0; i < temp_tag_players_count; ++i) // check other players...
-               {
-                       e = tag_players[i];
-                       if(e == world) // empty slot, skip to next
-                       {
-                               if(temp_tag_players_count < TAGCOLOR_MAX - 1) // just in case
-                                       ++temp_tag_players_count;
-                               continue;
-                       }
-
-                       if(e.tagcolor == frag_target.tagcolor_original) // and see if they have our original tag color
-                       {
-                               tag_GetFragAttackers_ColorOwner();
-                               centerprint(e, strcat("^1Your master ^7", frag_target.netname, "^1 was tagged by ^7", frag_attacker.netname, " ^1with ^7", color_owner_red, " ^1color.\n"));
-                               e.tagcolor = frag_attacker.tagcolor; // if so, remove it, our tag color has now "died out" from this round and we can not win anymore. The attacker will "summon" all of our previously fragged targets, and also us.
-                               setcolor(e, 16 * e.tagcolor + e.tagcolor);
-                       }
+               if(frag_target.kaballcarried) { // get amount of times killing carrier
+                       PlayerScore_Add(frag_attacker, SP_KEEPAWAY_CARRIERKILLS, 1);
                }
-       }
-       else
-       {
-               frag_target.tagcolor = frag_attacker.tagcolor;
-               setcolor(frag_target, 16 * frag_target.tagcolor + frag_target.tagcolor);
-       }
-
-       tag_GetFragAttackers_ColorOwner();
+               else if not(frag_attacker.kaballcarried)
+                       if(cvar("g_keepaway_noncarrier_warn"))
+                               centerprint_atprio(frag_attacker, (CENTERPRIO_SPAM + 5), "Killing people while you don't have the ball gives no points!");
 
-       if(color_owner_self)
-               color_owner_green = "^2your own";
-       centerprint(frag_attacker, strcat("^2You tagged ^7", frag_target.netname, " ^2with ^7", color_owner_green, " ^2color.\n"));
-
-       if(color_owner_self)
-               color_owner_red = "^1their own";
-       centerprint(frag_target, strcat("^1You were tagged by ^7", frag_attacker.netname, " ^1with ^7", color_owner_red, " ^1color.\n"));
-       bprint("^7", frag_target.netname, "^1 was tagged by ^7", frag_attacker.netname, " ^1with ^7", color_owner_red, " ^1color.\n");
-
-       frag_target.health = cvar("g_balance_health_start"); // "respawn" the player :P
-
-       tag_CheckWinner();
-
-       return 1;
-}
-
-MUTATOR_HOOKFUNCTION(tag_RemovePlayer)
-{
-
-       return 1;
-}
+               if(frag_attacker.kaballcarried) // get kills as carrier
+                       PlayerScore_Add(frag_attacker, SP_KEEPAWAY_SCORE, 1);
+       }
 
-MUTATOR_HOOKFUNCTION(tag_GiveFragsForKill)
-{
-       frag_score = 0; // no frags counted in Tag, maybe later (TODO)
+       if(self.kaballcarried) { ka_DropEvent(self); }
        return 1;
 }
 
-MUTATOR_HOOKFUNCTION(tag_PlayerPreThink)
+MUTATOR_HOOKFUNCTION(ka_GiveFragsForKill)
 {
-       setcolor(self, 16 * self.tagcolor + self.tagcolor); // prevent cheating by changing player colors
+       frag_score = 0; // no frags counted in keepaway
        return 1;
 }
-*/
-
 
 MUTATOR_DEFINITION(gamemode_keepaway)
 {
        MUTATOR_HOOK(MakePlayerObserver, ka_RemovePlayer, CBC_ORDER_ANY);
        MUTATOR_HOOK(ClientDisconnect, ka_RemovePlayer, CBC_ORDER_ANY);
-       //MUTATOR_HOOK(PlayerDies, ka_PlayerDies, CBC_ORDER_ANY);
-       //MUTATOR_HOOK(PlayerSpawn, ka_PlayerSpawn, CBC_ORDER_ANY);
-       //MUTATOR_HOOK(GiveFragsForKill, ka_GiveFragsForKill, CBC_ORDER_FIRST);
-       //MUTATOR_HOOK(PlayerPreThink, ka_PlayerPreThink, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(PlayerDies, ka_Scoring, CBC_ORDER_ANY);
+       MUTATOR_HOOK(GiveFragsForKill, ka_GiveFragsForKill, CBC_ORDER_FIRST);
 
        MUTATOR_ONADD
        {