about summary refs log tree commit diff
path: root/src/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/game')
-rw-r--r--src/game/server/game_server.cpp17
-rw-r--r--src/game/server/game_server.h3
2 files changed, 18 insertions, 2 deletions
diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp
index 669b2757..17604794 100644
--- a/src/game/server/game_server.cpp
+++ b/src/game/server/game_server.cpp
@@ -752,7 +752,7 @@ bool player::is_grounded()
 // releases the hooked player
 void player::release_hooked()
 {
-	hook_state = HOOK_IDLE;
+	hook_state = HOOK_RETRACTED;
 	hooked_player = 0x0;
 }
 
@@ -792,6 +792,10 @@ int player::handle_ninja()
 		numobjectshit = 0;
 
 		create_sound(pos, SOUND_NINJA_FIRE);
+		
+		// release all hooks when ninja is activated
+		release_hooked();
+		release_hooks();
 	}
 
 	currentmovetime--;
@@ -1099,6 +1103,7 @@ void player::tick()
 			hook_state = HOOK_FLYING;
 			hook_pos = pos;
 			hook_dir = direction;
+			hook_tick = -1;
 		}
 		else if(hook_state == HOOK_FLYING)
 		{
@@ -1136,20 +1141,30 @@ void player::tick()
 			}
 			
 			if(hook_state == HOOK_GRABBED)
+			{
 				create_sound(pos, SOUND_HOOK_ATTACH);
+				hook_tick = server_tick();
+			}
 		}
 	}
 	else
 	{
 		release_hooked();
+		hook_state = HOOK_IDLE;
 		hook_pos = pos;
 	}
 		
 	if(hook_state == HOOK_GRABBED)
 	{
 		if(hooked_player)
+		{
 			hook_pos = hooked_player->pos;
 			
+			// keep players hooked for a max of 1.5sec
+			if(server_tick() > hook_tick+(server_tickspeed()*3)/2)
+				release_hooked();
+		}
+			
 		/*if(hooked_player)
 			hook_pos = hooked_player->pos;
 
diff --git a/src/game/server/game_server.h b/src/game/server/game_server.h
index 73b08794..2bc7796e 100644
--- a/src/game/server/game_server.h
+++ b/src/game/server/game_server.h
@@ -266,7 +266,8 @@ public:
 		HOOK_GRABBED
 	};
 	
-	int hook_state; 
+	int hook_state;
+	int hook_tick;
 	player *hooked_player;
 	baselib::vec2 hook_pos;
 	baselib::vec2 hook_dir;