about summary refs log tree commit diff
path: root/src/game/server/gamecontext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/server/gamecontext.cpp')
-rw-r--r--src/game/server/gamecontext.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp
new file mode 100644
index 00000000..dfea7e91
--- /dev/null
+++ b/src/game/server/gamecontext.cpp
@@ -0,0 +1,232 @@
+#include <engine/e_server_interface.h>
+#include "gamecontext.hpp"
+
+GAMECONTEXT game;
+
+GAMECONTEXT::GAMECONTEXT()
+{
+	clear();
+}
+
+void GAMECONTEXT::clear()
+{
+	// reset all players
+	for(int i = 0; i < MAX_CLIENTS; i++)
+		players[i].init(-1);
+}
+
+
+void GAMECONTEXT::create_damageind(vec2 p, float angle, int amount)
+{
+	float a = 3 * 3.14159f / 2 + angle;
+	//float a = get_angle(dir);
+	float s = a-pi/3;
+	float e = a+pi/3;
+	for(int i = 0; i < amount; i++)
+	{
+		float f = mix(s, e, float(i+1)/float(amount+2));
+		NETEVENT_DAMAGEIND *ev = (NETEVENT_DAMAGEIND *)events.create(NETEVENTTYPE_DAMAGEIND, sizeof(NETEVENT_DAMAGEIND));
+		if(ev)
+		{
+			ev->x = (int)p.x;
+			ev->y = (int)p.y;
+			ev->angle = (int)(f*256.0f);
+		}
+	}
+}
+
+void GAMECONTEXT::create_explosion(vec2 p, int owner, int weapon, bool bnodamage)
+{
+	// create the event
+	NETEVENT_EXPLOSION *ev = (NETEVENT_EXPLOSION *)events.create(NETEVENTTYPE_EXPLOSION, sizeof(NETEVENT_EXPLOSION));
+	if(ev)
+	{
+		ev->x = (int)p.x;
+		ev->y = (int)p.y;
+	}
+
+	if (!bnodamage)
+	{
+		// deal damage
+		CHARACTER *ents[64];
+		float radius = 128.0f;
+		float innerradius = 42.0f;
+		int num = game.world.find_entities(p, radius, (ENTITY**)ents, 64, NETOBJTYPE_CHARACTER);
+		for(int i = 0; i < num; i++)
+		{
+			vec2 diff = ents[i]->pos - p;
+			vec2 forcedir(0,1);
+			float l = length(diff);
+			if(l)
+				forcedir = normalize(diff);
+			l = 1-clamp((l-innerradius)/(radius-innerradius), 0.0f, 1.0f);
+			float dmg = 6 * l;
+			if((int)dmg)
+				ents[i]->take_damage(forcedir*dmg*2, (int)dmg, owner, weapon);
+		}
+	}
+}
+
+/*
+void create_smoke(vec2 p)
+{
+	// create the event
+	EV_EXPLOSION *ev = (EV_EXPLOSION *)events.create(EVENT_SMOKE, sizeof(EV_EXPLOSION));
+	if(ev)
+	{
+		ev->x = (int)p.x;
+		ev->y = (int)p.y;
+	}
+}*/
+
+void GAMECONTEXT::create_playerspawn(vec2 p)
+{
+	// create the event
+	NETEVENT_SPAWN *ev = (NETEVENT_SPAWN *)events.create(NETEVENTTYPE_SPAWN, sizeof(NETEVENT_SPAWN));
+	if(ev)
+	{
+		ev->x = (int)p.x;
+		ev->y = (int)p.y;
+	}
+}
+
+void GAMECONTEXT::create_death(vec2 p, int cid)
+{
+	// create the event
+	NETEVENT_DEATH *ev = (NETEVENT_DEATH *)events.create(NETEVENTTYPE_DEATH, sizeof(NETEVENT_DEATH));
+	if(ev)
+	{
+		ev->x = (int)p.x;
+		ev->y = (int)p.y;
+		ev->cid = cid;
+	}
+}
+
+void GAMECONTEXT::create_sound(vec2 pos, int sound, int mask)
+{
+	if (sound < 0)
+		return;
+
+	// create a sound
+	NETEVENT_SOUNDWORLD *ev = (NETEVENT_SOUNDWORLD *)events.create(NETEVENTTYPE_SOUNDWORLD, sizeof(NETEVENT_SOUNDWORLD), mask);
+	if(ev)
+	{
+		ev->x = (int)pos.x;
+		ev->y = (int)pos.y;
+		ev->soundid = sound;
+	}
+}
+
+void GAMECONTEXT::create_sound_global(int sound, int target)
+{
+	if (sound < 0)
+		return;
+
+	NETMSG_SV_SOUNDGLOBAL msg;
+	msg.soundid = sound;
+	msg.pack(MSGFLAG_VITAL);
+	server_send_msg(target);
+}
+
+void GAMECONTEXT::send_chat(int chatter_cid, int team, const char *text)
+{
+	if(chatter_cid >= 0 && chatter_cid < MAX_CLIENTS)
+		dbg_msg("chat", "%d:%d:%s: %s", chatter_cid, team, server_clientname(chatter_cid), text);
+	else
+		dbg_msg("chat", "*** %s", text);
+
+	if(team == CHAT_ALL)
+	{
+		NETMSG_SV_CHAT msg;
+		msg.team = 0;
+		msg.cid = chatter_cid;
+		msg.message = text;
+		msg.pack(MSGFLAG_VITAL);
+		server_send_msg(-1);
+	}
+	else
+	{
+		NETMSG_SV_CHAT msg;
+		msg.team = 1;
+		msg.cid = chatter_cid;
+		msg.message = text;
+		msg.pack(MSGFLAG_VITAL);
+
+		for(int i = 0; i < MAX_CLIENTS; i++)
+		{
+			if(game.players[i].client_id != -1 && game.players[i].team == team)
+				server_send_msg(i);
+		}
+	}
+}
+
+
+void GAMECONTEXT::send_info(int who, int to_who)
+{
+	NETMSG_SV_SETINFO msg;
+	msg.cid = who;
+	msg.name = server_clientname(who);
+	msg.skin = players[who].skin_name;
+	msg.use_custom_color = players[who].use_custom_color;
+	msg.color_body = players[who].color_body;
+	msg.color_feet = players[who].color_feet;
+	msg.pack(MSGFLAG_VITAL);
+	
+	server_send_msg(to_who);
+}
+
+void GAMECONTEXT::send_emoticon(int cid, int emoticon)
+{
+	NETMSG_SV_EMOTICON msg;
+	msg.cid = cid;
+	msg.emoticon = emoticon;
+	msg.pack(MSGFLAG_VITAL);
+	server_send_msg(-1);
+}
+
+void GAMECONTEXT::send_weapon_pickup(int cid, int weapon)
+{
+	NETMSG_SV_WEAPONPICKUP msg;
+	msg.weapon = weapon;
+	msg.pack(MSGFLAG_VITAL);
+	server_send_msg(cid);
+}
+
+
+void GAMECONTEXT::send_broadcast(const char *text, int cid)
+{
+	NETMSG_SV_BROADCAST msg;
+	msg.message = text;
+	msg.pack(MSGFLAG_VITAL);
+	server_send_msg(cid);
+}
+
+
+
+void GAMECONTEXT::tick()
+{
+	world.core.tuning = tuning;
+	world.tick();
+
+	//if(world.paused) // make sure that the game object always updates
+	controller->tick();
+		
+	for(int i = 0; i < MAX_CLIENTS; i++)
+	{
+		if(players[i].client_id != -1)
+			players[i].tick();
+	}
+}
+
+void GAMECONTEXT::snap(int client_id)
+{
+	world.snap(client_id);
+	controller->snap(client_id);
+	events.snap(client_id);
+	
+	for(int i = 0; i < MAX_CLIENTS; i++)
+	{
+		if(players[i].client_id != -1)
+			players[i].snap(client_id);
+	}
+}