about summary refs log tree commit diff
path: root/src/game/server
diff options
context:
space:
mode:
authorJakob Fries <jakob.fries@gmail.com>2007-07-26 09:21:47 +0000
committerJakob Fries <jakob.fries@gmail.com>2007-07-26 09:21:47 +0000
commit3769853ba47efd9ff761fc48539758dd4b0b8e74 (patch)
tree5a8a6655b1c7db943db92a16c4db981295001da8 /src/game/server
parentc1da3b23b64e31eef6970a8eb021fc79bdd65e08 (diff)
downloadzcatch-3769853ba47efd9ff761fc48539758dd4b0b8e74.tar.gz
zcatch-3769853ba47efd9ff761fc48539758dd4b0b8e74.zip
ctf flags
Diffstat (limited to 'src/game/server')
-rw-r--r--src/game/server/game_server.cpp89
-rw-r--r--src/game/server/game_server.h19
2 files changed, 108 insertions, 0 deletions
diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp
index 3dfa0773..09831ba5 100644
--- a/src/game/server/game_server.cpp
+++ b/src/game/server/game_server.cpp
@@ -1458,6 +1458,95 @@ void powerup::snap(int snapping_client)
 
 // POWERUP END ///////////////////////
 
+//////////////////////////////////////////////////
+// FLAG
+//////////////////////////////////////////////////
+flag::flag(int _team)
+: entity(OBJTYPE_FLAG)
+{
+	team = _team;
+	proximity_radius = phys_size;
+	carrying_player = 0x0;
+	
+	reset();
+	
+	// TODO: should this be done here?
+	world.insert_entity(this);
+}
+
+void flag::reset()
+{
+	spawntick = -1;
+}
+
+void flag::tick()
+{
+	// wait for respawn
+	if(spawntick > 0)
+	{
+		if(server_tick() > spawntick)
+			spawntick = -1;
+		else
+			return;
+	}
+
+	// Check if a player intersected us
+	vec2 meh;
+	player* pplayer = intersect_player(pos, pos + vel, meh, 0);
+	if (pplayer)
+	{
+		if (!carrying_player)
+			carrying_player = pplayer;
+
+		// TODO: something..?
+	}
+
+	if (carrying_player)
+	{
+		if (carrying_player->dead)
+			carrying_player = 0x0;
+		else
+		{
+			vel = carrying_player->pos - pos;
+			pos = carrying_player->pos;
+		}
+	}
+	
+	if (!carrying_player)
+	{
+		vel.y += 0.25f;
+		vec2 new_pos = pos + vel;
+
+		col_intersect_line(pos, new_pos, &new_pos);
+
+		pos = new_pos;
+
+		if (is_grounded())
+			vel.x = vel.y = 0;
+	}
+}
+
+bool flag::is_grounded()
+{
+	if(col_check_point((int)(pos.x+phys_size/2), (int)(pos.y+phys_size/2+5)))
+		return true;
+	if(col_check_point((int)(pos.x-phys_size/2), (int)(pos.y+phys_size/2+5)))
+		return true;
+	return false;
+}
+
+void flag::snap(int snapping_client)
+{
+	if(spawntick != -1)
+		return;
+
+	obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, id, sizeof(obj_flag));
+	flag->x = (int)pos.x;
+	flag->y = (int)pos.y;
+	flag->team = team;
+}
+// FLAG END ///////////////////////
+
 player *get_player(int index)
 {
 	return &players[index];
diff --git a/src/game/server/game_server.h b/src/game/server/game_server.h
index c285c4d5..d234bb13 100644
--- a/src/game/server/game_server.h
+++ b/src/game/server/game_server.h
@@ -294,3 +294,22 @@ public:
 };
 
 extern player players[MAX_CLIENTS];
+
+// TODO: move to seperate file
+class flag : public entity
+{
+public:
+	static const int phys_size = 14;
+	player *carrying_player;
+	baselib::vec2 vel;
+	
+	int team;
+	int spawntick;
+	flag(int _team);
+
+	bool is_grounded();
+	
+	virtual void reset();
+	virtual void tick();
+	virtual void snap(int snapping_client);
+};