about summary refs log tree commit diff
path: root/src/game/server
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-03-16 22:32:17 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-03-16 22:32:17 +0000
commit4a3c2e2c8c3a8dee5828258f920f1c175e952cb0 (patch)
treee0fda9dfad5e605c0810c8f27d719078cd48fd63 /src/game/server
parent727c9a3a3249deec1c5a96025e99c0c654e7ff80 (diff)
downloadzcatch-4a3c2e2c8c3a8dee5828258f920f1c175e952cb0.tar.gz
zcatch-4a3c2e2c8c3a8dee5828258f920f1c175e952cb0.zip
loads of fixes, skidding, velocity ramping and other stuff
Diffstat (limited to 'src/game/server')
-rw-r--r--src/game/server/gs_common.h2
-rw-r--r--src/game/server/gs_server.cpp108
2 files changed, 71 insertions, 39 deletions
diff --git a/src/game/server/gs_common.h b/src/game/server/gs_common.h
index ffeadecf..0de81318 100644
--- a/src/game/server/gs_common.h
+++ b/src/game/server/gs_common.h
@@ -188,7 +188,7 @@ public:
 		PROJECTILE_FLAGS_EXPLODE = 1 << 0,
 	};
 	
-	vec2 vel;
+	vec2 direction;
 	entity *powner; // this is nasty, could be removed when client quits
 	int lifespan;
 	int owner;
diff --git a/src/game/server/gs_server.cpp b/src/game/server/gs_server.cpp
index f674ecfd..fa3f9925 100644
--- a/src/game/server/gs_server.cpp
+++ b/src/game/server/gs_server.cpp
@@ -24,6 +24,7 @@ void create_playerspawn(vec2 p);
 void create_death(vec2 p);
 void create_sound(vec2 pos, int sound, int mask=-1);
 class player *intersect_player(vec2 pos0, vec2 pos1, vec2 &new_pos, class entity *notthis = 0);
+class player *closest_player(vec2 pos, float radius, entity *notthis);
 
 game_world *world;
 
@@ -380,13 +381,13 @@ static input_count count_input(int prev, int cur)
 //////////////////////////////////////////////////
 // projectile
 //////////////////////////////////////////////////
-projectile::projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity* powner,
+projectile::projectile(int type, int owner, vec2 pos, vec2 dir, int span, entity* powner,
 	int damage, int flags, float force, int sound_impact, int weapon)
 : entity(NETOBJTYPE_PROJECTILE)
 {
 	this->type = type;
 	this->pos = pos;
-	this->vel = vel * server_tickspeed(); // TODO: remove this
+	this->direction = normalize(dir);
 	this->lifespan = span;
 	this->owner = owner;
 	this->powner = powner;
@@ -407,14 +408,28 @@ void projectile::reset()
 
 void projectile::tick()
 {
-	float gravity = -400;
-	if(type != WEAPON_GRENADE)
-		gravity = -100;
+	float curvature = 0;
+	float speed = 0;
+	if(type == WEAPON_GRENADE)
+	{
+		curvature = tuning.grenade_curvature;
+		speed = tuning.grenade_speed;
+	}
+	else if(type == WEAPON_SHOTGUN)
+	{
+		curvature = tuning.shotgun_curvature;
+		speed = tuning.shotgun_speed;
+	}
+	else if(type == WEAPON_GUN)
+	{
+		curvature = tuning.gun_curvature;
+		speed = tuning.gun_speed;
+	}
 	
 	float pt = (server_tick()-start_tick-1)/(float)server_tickspeed();
 	float ct = (server_tick()-start_tick)/(float)server_tickspeed();
-	vec2 prevpos = calc_pos(pos, vel, gravity, pt);
-	vec2 curpos = calc_pos(pos, vel, gravity, ct);
+	vec2 prevpos = calc_pos(pos, direction, curvature, speed, pt);
+	vec2 curpos = calc_pos(pos, direction, curvature, speed, ct);
 
 	lifespan--;
 	
@@ -432,7 +447,7 @@ void projectile::tick()
 			create_explosion(prevpos, owner, weapon, false);
 		else if (targetplayer)
 		{
-			targetplayer->take_damage(normalize(vel) * max(0.001f, force), damage, owner, weapon);
+			targetplayer->take_damage(direction * max(0.001f, force), damage, owner, weapon);
 		}
 
 		world->destroy_entity(this);
@@ -443,19 +458,21 @@ void projectile::fill_info(NETOBJ_PROJECTILE *proj)
 {
 	proj->x = (int)pos.x;
 	proj->y = (int)pos.y;
-	proj->vx = (int)vel.x;
-	proj->vy = (int)vel.y;
+	proj->vx = (int)(direction.x*100.0f);
+	proj->vy = (int)(direction.y*100.0f);
 	proj->start_tick = start_tick;
 	proj->type = type;
 }
 
 void projectile::snap(int snapping_client)
 {
-	float ct = (server_tick()-start_tick)/(float)server_tickspeed();
-	vec2 curpos = calc_pos(pos, vel, -7.5f*server_tickspeed(), ct);
+	/*float ct = (server_tick()-start_tick)/(float)server_tickspeed();*/
+	/*vec2 curpos = calc_pos(pos, vel, -7.5f*server_tickspeed(), ct);*/
 
-	if(distance(players[snapping_client].pos, curpos) > 1000.0f)
-		return;
+	/*if(distance(players[snapping_client].pos, curpos) > 1000.0f)
+		return;*/
+		
+	/* TODO: FIX ME */
 
 	NETOBJ_PROJECTILE *proj = (NETOBJ_PROJECTILE *)snap_new_item(NETOBJTYPE_PROJECTILE, id, sizeof(NETOBJ_PROJECTILE));
 	fill_info(proj);
@@ -989,7 +1006,7 @@ void player::fire_weapon()
 			projectile *proj = new projectile(WEAPON_GUN,
 				client_id,
 				pos+vec2(0,0),
-				direction*tuning.gun_speed,
+				direction,
 				server_tickspeed(),
 				this,
 				1, 0, 0, -1, WEAPON_GUN);
@@ -1013,7 +1030,7 @@ void player::fire_weapon()
 			projectile *proj = new projectile(WEAPON_GRENADE,
 				client_id,
 				pos+vec2(0,0),
-				direction*tuning.grenade_speed,
+				direction,
 				100,
 				this,
 				1, projectile::PROJECTILE_FLAGS_EXPLODE, 0, SOUND_GRENADE_EXPLODE, WEAPON_GRENADE);
@@ -1043,13 +1060,12 @@ void player::fire_weapon()
 			{
 				float spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f};
 				float a = get_angle(direction);
-				float v = 1.0f-fabs(i/(float)shotspread);
 				a += spreading[i+2];
-				float speed = mix((float)tuning.shotgun_speed_wide, (float)tuning.shotgun_speed_center, v);
+				/*float speed = mix((float)tuning.shotgun_speed_wide, (float)tuning.shotgun_speed_center, v);*/
 				projectile *proj = new projectile(WEAPON_SHOTGUN,
 					client_id,
 					pos+vec2(0,0),
-					vec2(cosf(a), sinf(a))*speed,
+					vec2(cosf(a), sinf(a)),
 					(int)(server_tickspeed()*0.25f),
 					this,
 					1, 0, 0, -1, WEAPON_SHOTGUN);
@@ -1622,9 +1638,17 @@ void player::snap(int snaping_client)
 		character->ammocount = weapons[active_weapon].ammo;
 		character->health = 0;
 		character->armor = 0;
+		
 		character->weapon = active_weapon;
 		character->attacktick = attack_tick;
 
+		character->wanted_direction = 0;
+		if(input.left && !input.right)
+			character->wanted_direction = -1;
+		else if(!input.left && input.right)
+			character->wanted_direction = 1;
+
+
 		if(client_id == snaping_client)
 		{
 			character->health = health;
@@ -1696,8 +1720,7 @@ void powerup::tick()
 			return;
 	}
 	// Check if a player intersected us
-	vec2 meh;
-	player* pplayer = intersect_player(pos, pos + vec2(0,16), meh, 0);
+	player* pplayer = closest_player(pos, 20.0f, 0);
 	if (pplayer)
 	{
 		// player picked us up, is someone was hooking us, let them go
@@ -1957,29 +1980,38 @@ player *intersect_player(vec2 pos0, vec2 pos1, vec2& new_pos, entity *notthis)
 	}
 	
 	return closest;
-	
-	/*
-	entity *ents[64];
-	vec2 dir = pos1 - pos0;
-	float radius = length(dir * 0.5f);
-	vec2 center = pos0 + dir * 0.5f;
-	const int types[] = {OBJTYPE_PLAYER_CHARACTER};
-	int num = world->find_entities(center, radius, ents, 64, types, 1);
-	for (int i = 0; i < num; i++)
+}
+
+
+player *closest_player(vec2 pos, float radius, entity *notthis)
+{
+	// Find other players
+	float closest_range = radius*2;
+	player *closest = 0;
+		
+	for(int i = 0; i < MAX_CLIENTS; i++)
 	{
-		// Check if entity is a player
-		if (ents[i] != notthis)
+		if(players[i].client_id < 0 || (entity *)&players[i] == notthis)
+			continue;
+			
+		if(!(players[i].flags&entity::FLAG_PHYSICS))
+			continue;
+
+		float len = distance(pos, players[i].pos);
+		if(len < player::phys_size+radius)
 		{
-			new_pos = ents[i]->pos;
-			return (player*)ents[i];
+			if(len < closest_range)
+			{
+				closest_range = len;
+				closest = &players[i];
+			}
 		}
 	}
-
-	return 0;*/
+	
+	return closest;
 }
 
 
-
 // TODO: should be more general
 
 	/*
@@ -2281,7 +2313,7 @@ static void con_broadcast(void *result, void *user_data)
 
 void mods_console_init()
 {
-	MACRO_REGISTER_COMMAND("tune", "s?i", con_tune_param, 0);
+	MACRO_REGISTER_COMMAND("tune", "si", con_tune_param, 0);
 	MACRO_REGISTER_COMMAND("tune_reset", "", con_tune_reset, 0);
 	MACRO_REGISTER_COMMAND("tune_dump", "", con_tune_dump, 0);