about summary refs log tree commit diff
path: root/src/game/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/server')
-rw-r--r--src/game/server/game_server.cpp7
-rw-r--r--src/game/server/srv_common.cpp5
-rw-r--r--src/game/server/srv_common.h2
-rw-r--r--src/game/server/srv_ctf.cpp17
-rw-r--r--src/game/server/srv_ctf.h2
5 files changed, 23 insertions, 10 deletions
diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp
index 241e3862..797f31bf 100644
--- a/src/game/server/game_server.cpp
+++ b/src/game/server/game_server.cpp
@@ -992,17 +992,18 @@ void player::tick_defered()
 
 void player::die(int killer, int weapon)
 {
-	gameobj->on_player_death(this, get_player(killer), weapon);
+	int mode_special = gameobj->on_player_death(this, get_player(killer), weapon);
 
-	dbg_msg("game", "kill killer='%d:%s' victim='%d:%s' weapon=%d",
+	dbg_msg("game", "kill killer='%d:%s' victim='%d:%s' weapon=%d special=%d",
 		killer, server_clientname(killer),
-		client_id, server_clientname(client_id), weapon);
+		client_id, server_clientname(client_id), weapon, mode_special);
 
 	// send the kill message
 	msg_pack_start(MSG_KILLMSG, MSGFLAG_VITAL);
 	msg_pack_int(killer);
 	msg_pack_int(client_id);
 	msg_pack_int(weapon);
+	msg_pack_int(mode_special);
 	msg_pack_end();
 	server_send_msg(-1);
 
diff --git a/src/game/server/srv_common.cpp b/src/game/server/srv_common.cpp
index c97433d3..5cb3d6e4 100644
--- a/src/game/server/srv_common.cpp
+++ b/src/game/server/srv_common.cpp
@@ -127,15 +127,16 @@ void gameobject::on_player_info_change(class player *p)
 }
 
 
-void gameobject::on_player_death(class player *victim, class player *killer, int weapon)
+int gameobject::on_player_death(class player *victim, class player *killer, int weapon)
 {
 	// do scoreing
 	if(!killer)
-		return;
+		return 0;
 	if(killer == victim)
 		victim->score--; // klant arschel
 	else
 		killer->score++; // good shit
+	return 0;
 }
 
 void gameobject::do_warmup(int seconds)
diff --git a/src/game/server/srv_common.h b/src/game/server/srv_common.h
index a780dd73..11a6c3f2 100644
--- a/src/game/server/srv_common.h
+++ b/src/game/server/srv_common.h
@@ -136,7 +136,7 @@ public:
 	virtual void tick();
 	
 	virtual void on_player_spawn(class player *p) {}
-	virtual void on_player_death(class player *victim, class player *killer, int weapon);
+	virtual int on_player_death(class player *victim, class player *killer, int weapon);
 	
 	virtual void on_player_info_change(class player *p);
 	
diff --git a/src/game/server/srv_ctf.cpp b/src/game/server/srv_ctf.cpp
index 42061a5c..972da032 100644
--- a/src/game/server/srv_ctf.cpp
+++ b/src/game/server/srv_ctf.cpp
@@ -29,16 +29,25 @@ void gameobject_ctf::on_player_spawn(class player *p)
 {
 }
 
-void gameobject_ctf::on_player_death(class player *victim, class player *killer, int weaponid)
+int gameobject_ctf::on_player_death(class player *victim, class player *killer, int weaponid)
 {
 	gameobject::on_player_death(victim, killer, weaponid);
+	int had_flag = 0;
+	
 	// drop flags
 	for(int fi = 0; fi < 2; fi++)
 	{
 		flag *f = flags[fi];
+		if(f && f->carrying_player == killer)
+			had_flag |= 2;
 		if(f && f->carrying_player == victim)
+		{
 			f->carrying_player = 0;
+			had_flag |= 1;
+		}
 	}
+	
+	return had_flag;
 }
 
 void gameobject_ctf::tick()
@@ -125,12 +134,14 @@ void flag::snap(int snapping_client)
 	if(spawntick != -1)
 		return;
 
-	obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, id, sizeof(obj_flag));
+	obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, team, sizeof(obj_flag));
 	flag->x = (int)pos.x;
 	flag->y = (int)pos.y;
 	flag->team = team;
 	flag->carried_by = -1;
 	
-	if(carrying_player)
+	if(at_stand)
+		flag->carried_by = -2;
+	else if(carrying_player)
 		flag->carried_by = carrying_player->client_id;
 }
diff --git a/src/game/server/srv_ctf.h b/src/game/server/srv_ctf.h
index e7bc93ab..37f3cfb0 100644
--- a/src/game/server/srv_ctf.h
+++ b/src/game/server/srv_ctf.h
@@ -9,7 +9,7 @@ public:
 	virtual void tick();
 	
 	virtual void on_player_spawn(class player *p);
-	virtual void on_player_death(class player *victim, class player *killer, int weapon);
+	virtual int on_player_death(class player *victim, class player *killer, int weapon);
 };
 
 // TODO: move to seperate file