about summary refs log tree commit diff
path: root/src/game/server
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-11-11 21:02:36 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-11-11 21:02:36 +0000
commit7efefe27163548b7f61c516d6b650258a3c7d033 (patch)
tree3615438a87ead4a9552db85b871b82ac5972b53e /src/game/server
parent5702b3bfd0e20a0f99c8fecdada033e8d8802f01 (diff)
downloadzcatch-7efefe27163548b7f61c516d6b650258a3c7d033.tar.gz
zcatch-7efefe27163548b7f61c516d6b650258a3c7d033.zip
many smaller changes. changed how projectiles are handled. fixed joining bug
Diffstat (limited to 'src/game/server')
-rw-r--r--src/game/server/game_server.cpp45
-rw-r--r--src/game/server/srv_common.h1
2 files changed, 21 insertions, 25 deletions
diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp
index f88eefa9..06dafb72 100644
--- a/src/game/server/game_server.cpp
+++ b/src/game/server/game_server.cpp
@@ -270,7 +270,7 @@ projectile::projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity
 {
 	this->type = type;
 	this->pos = pos;
-	this->vel = vel;
+	this->vel = vel * SERVER_TICK_SPEED; // TODO: remove this
 	this->lifespan = span;
 	this->owner = owner;
 	this->powner = powner;
@@ -280,6 +280,7 @@ projectile::projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity
 	this->sound_impact = sound_impact;
 	this->weapon = weapon;
 	this->bounce = 0;
+	this->start_tick = server_tick();
 	world->insert_entity(this);
 }
 
@@ -290,36 +291,26 @@ void projectile::reset()
 
 void projectile::tick()
 {
-	vec2 oldpos = pos;
-
-	int collide = 0;
-	if(bounce)
-	{
-		int numbounces;
-		vel.y += 0.25f;
-		move_point(&pos, &vel, 0.25f, &numbounces);
-		bounce -= numbounces;
-	}
-	else
-	{
-		vel.y += 0.25f;
-		pos += vel;
-		collide = col_check_point((int)pos.x, (int)pos.y);
-	}
+	float gravity = -400;
+	float pt = (server_tick()-start_tick-1)/(float)SERVER_TICK_SPEED;
+	float ct = (server_tick()-start_tick)/(float)SERVER_TICK_SPEED;
+	vec2 prevpos = calc_pos(pos, vel, gravity, pt);
+	vec2 curpos = calc_pos(pos, vel, gravity, ct);
 
 	lifespan--;
-
-	// check player intersection as well
+	
+	int collide = col_check_point((int)curpos.x, (int)curpos.y);
+	
 	vec2 new_pos;
-	entity *targetplayer = (entity*)intersect_player(oldpos, pos, new_pos, powner);
-
-	if(targetplayer || lifespan < 0 || collide || bounce < 0)
+	entity *targetplayer = (entity*)intersect_player(prevpos, curpos, new_pos, powner);
+	
+	if(targetplayer || collide || lifespan < 0 )
 	{
 		if (lifespan >= 0 || weapon == WEAPON_ROCKET)
 			create_sound(pos, sound_impact);
 
 		if (flags & PROJECTILE_FLAGS_EXPLODE)
-			create_explosion(oldpos, owner, weapon, false);
+			create_explosion(prevpos, owner, weapon, false);
 		else if (targetplayer)
 		{
 			targetplayer->take_damage(normalize(vel) * max(0.001f, force), damage, owner, weapon);
@@ -331,14 +322,18 @@ void projectile::tick()
 
 void projectile::snap(int snapping_client)
 {
-	if(distance(players[snapping_client].pos, pos) > 1000.0f)
+	float ct = (server_tick()-start_tick)/(float)SERVER_TICK_SPEED;
+	vec2 curpos = calc_pos(pos, vel, -7.5f*SERVER_TICK_SPEED, ct);
+
+	if(distance(players[snapping_client].pos, curpos) > 1000.0f)
 		return;
 
 	obj_projectile *proj = (obj_projectile *)snap_new_item(OBJTYPE_PROJECTILE, id, sizeof(obj_projectile));
 	proj->x = (int)pos.x;
 	proj->y = (int)pos.y;
-	proj->vx = (int)vel.x; // TODO: should be an angle
+	proj->vx = (int)vel.x;
 	proj->vy = (int)vel.y;
+	proj->start_tick = start_tick;
 	proj->type = type;
 }
 
diff --git a/src/game/server/srv_common.h b/src/game/server/srv_common.h
index 46c17ed8..4b84b272 100644
--- a/src/game/server/srv_common.h
+++ b/src/game/server/srv_common.h
@@ -186,6 +186,7 @@ public:
 	int weapon;
 	int bounce;
 	float force;
+	int start_tick;
 	
 	projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity* powner,
 		int damage, int flags, float force, int sound_impact, int weapon);