diff options
| author | Jakob Fries <jakob.fries@gmail.com> | 2007-07-26 09:21:47 +0000 |
|---|---|---|
| committer | Jakob Fries <jakob.fries@gmail.com> | 2007-07-26 09:21:47 +0000 |
| commit | 3769853ba47efd9ff761fc48539758dd4b0b8e74 (patch) | |
| tree | 5a8a6655b1c7db943db92a16c4db981295001da8 /src/game/server | |
| parent | c1da3b23b64e31eef6970a8eb021fc79bdd65e08 (diff) | |
| download | zcatch-3769853ba47efd9ff761fc48539758dd4b0b8e74.tar.gz zcatch-3769853ba47efd9ff761fc48539758dd4b0b8e74.zip | |
ctf flags
Diffstat (limited to 'src/game/server')
| -rw-r--r-- | src/game/server/game_server.cpp | 89 | ||||
| -rw-r--r-- | src/game/server/game_server.h | 19 |
2 files changed, 108 insertions, 0 deletions
diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp index 3dfa0773..09831ba5 100644 --- a/src/game/server/game_server.cpp +++ b/src/game/server/game_server.cpp @@ -1458,6 +1458,95 @@ void powerup::snap(int snapping_client) // POWERUP END /////////////////////// +////////////////////////////////////////////////// +// FLAG +////////////////////////////////////////////////// +flag::flag(int _team) +: entity(OBJTYPE_FLAG) +{ + team = _team; + proximity_radius = phys_size; + carrying_player = 0x0; + + reset(); + + // TODO: should this be done here? + world.insert_entity(this); +} + +void flag::reset() +{ + spawntick = -1; +} + +void flag::tick() +{ + // wait for respawn + if(spawntick > 0) + { + if(server_tick() > spawntick) + spawntick = -1; + else + return; + } + + // Check if a player intersected us + vec2 meh; + player* pplayer = intersect_player(pos, pos + vel, meh, 0); + if (pplayer) + { + if (!carrying_player) + carrying_player = pplayer; + + // TODO: something..? + } + + if (carrying_player) + { + if (carrying_player->dead) + carrying_player = 0x0; + else + { + vel = carrying_player->pos - pos; + pos = carrying_player->pos; + } + } + + if (!carrying_player) + { + vel.y += 0.25f; + vec2 new_pos = pos + vel; + + col_intersect_line(pos, new_pos, &new_pos); + + pos = new_pos; + + if (is_grounded()) + vel.x = vel.y = 0; + } +} + +bool flag::is_grounded() +{ + if(col_check_point((int)(pos.x+phys_size/2), (int)(pos.y+phys_size/2+5))) + return true; + if(col_check_point((int)(pos.x-phys_size/2), (int)(pos.y+phys_size/2+5))) + return true; + return false; +} + +void flag::snap(int snapping_client) +{ + if(spawntick != -1) + return; + + obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, id, sizeof(obj_flag)); + flag->x = (int)pos.x; + flag->y = (int)pos.y; + flag->team = team; +} +// FLAG END /////////////////////// + player *get_player(int index) { return &players[index]; diff --git a/src/game/server/game_server.h b/src/game/server/game_server.h index c285c4d5..d234bb13 100644 --- a/src/game/server/game_server.h +++ b/src/game/server/game_server.h @@ -294,3 +294,22 @@ public: }; extern player players[MAX_CLIENTS]; + +// TODO: move to seperate file +class flag : public entity +{ +public: + static const int phys_size = 14; + player *carrying_player; + baselib::vec2 vel; + + int team; + int spawntick; + flag(int _team); + + bool is_grounded(); + + virtual void reset(); + virtual void tick(); + virtual void snap(int snapping_client); +}; |