diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-19 23:08:26 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-19 23:08:26 +0000 |
| commit | 6c972078ca1f5951b5e442fefb16a8e0b69b60c5 (patch) | |
| tree | 7ed2bd8f480531bf891edaf2fa1166d4595bc4ad /src/game/server | |
| parent | 7229789d58726ccea5c462dbe35a65f7388da658 (diff) | |
| download | zcatch-6c972078ca1f5951b5e442fefb16a8e0b69b60c5.tar.gz zcatch-6c972078ca1f5951b5e442fefb16a8e0b69b60c5.zip | |
fixed non-intersecting hook problem. hook length is more visible now. fixed damange system (thanks to shootme)
Diffstat (limited to 'src/game/server')
| -rw-r--r-- | src/game/server/gs_server.cpp | 55 |
1 files changed, 25 insertions, 30 deletions
diff --git a/src/game/server/gs_server.cpp b/src/game/server/gs_server.cpp index 3b7d4392..1993aa90 100644 --- a/src/game/server/gs_server.cpp +++ b/src/game/server/gs_server.cpp @@ -1439,20 +1439,30 @@ bool player::take_damage(vec2 force, int dmg, int from, int weapon) create_damageind(pos, 0, dmg); } - if(armor) + if(dmg) { - armor -= 1; - dmg--; - } - - if(dmg > armor) - { - dmg -= armor; - armor = 0; + if(armor) + { + if(dmg > 1) + { + health--; + dmg--; + } + + if(dmg > armor) + { + dmg -= armor; + armor = 0; + } + else + { + armor -= dmg; + dmg = 0; + } + } + health -= dmg; } - else - armor -= dmg; damage_taken_tick = server_tick(); @@ -1822,25 +1832,11 @@ void create_sound_global(int sound, int target) server_send_msg(target); } -float closest_point_on_line(vec2 line_point0, vec2 line_point1, vec2 target_point) -{ - vec2 c = target_point - line_point0; - vec2 v = (line_point1 - line_point0); - v = normalize(v); - float d = length(line_point0-line_point1); - float t = dot(v, c); - - if (t < 0) return 0; - if (t > d) return 1; - - return t; -} - // TODO: should be more general player *intersect_player(vec2 pos0, vec2 pos1, float radius, vec2& new_pos, entity *notthis) { // Find other players - float closest_time = distance(pos0, pos1) * 100.0f; + float closest_len = distance(pos0, pos1) * 100.0f; vec2 line_dir = normalize(pos1-pos0); player *closest = 0; @@ -1852,15 +1848,14 @@ player *intersect_player(vec2 pos0, vec2 pos1, float radius, vec2& new_pos, enti if(!(players[i].flags&entity::FLAG_PHYSICS)) continue; - float t = closest_point_on_line(pos0, pos1, players[i].pos); - vec2 intersect_pos = pos0 + line_dir*t; + vec2 intersect_pos = closest_point_on_line(pos0, pos1, players[i].pos); float len = distance(players[i].pos, intersect_pos); if(len < player::phys_size+radius) { - if(t < closest_time) + if(len < closest_len) { new_pos = intersect_pos; - closest_time = t; + closest_len = len; closest = &players[i]; } } |