diff options
-rw-r--r-- | src/client/keyboard.cc | 7 | ||||
-rw-r--r-- | src/client/targets.cc | 153 |
2 files changed, 150 insertions, 10 deletions
diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index baef74c..d5a14ec 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -140,9 +140,10 @@ Keyboard::Keyboard() add_key("u", SDLK_u, 'u'); key = add_key("v", SDLK_v, 'v', "view_next"); key->assign(Key::Shift, "view_prev"); - - add_key("w", SDLK_w, 'w', "+afterburner"); - add_key("x", SDLK_x, 'x', "target_center"); + add_key("w", SDLK_w, 'w', "+afterburner"); + key = add_key("x", SDLK_x, 'x', "target_controlable_next"); + key->assign(Key::Shift, "target_controlable_prev"); + key->assign(Key::Ctrl, "target_center"); add_key("y", SDLK_y, 'y'); add_key("z", SDLK_z, 'z'); diff --git a/src/client/targets.cc b/src/client/targets.cc index 1e5b831..5ec1abe 100644 --- a/src/client/targets.cc +++ b/src/client/targets.cc @@ -134,13 +134,15 @@ void func_target_next(std::string const &args) // first entity it = zone->content().begin(); - while (!is_valid_hud_target((*it)) && it != zone->content().end()) + while ((it != zone->content().end()) && !is_valid_hud_target((*it))) { it++; + } } else { // current entity - while (it != zone->content().end() && ((*it)->id() != current_target_id)) + while ((it != zone->content().end()) && ((*it)->id() != current_target_id)) { ++it; + } // next legal entity if (it != zone->content().end()) @@ -160,7 +162,7 @@ void func_target_next(std::string const &args) } } - if (it != zone->content().end()) { + if (it != zone->content().end() && is_valid_hud_target((*it))) { set_target((*it)); } else { current_target = 0; @@ -187,12 +189,14 @@ void func_target_prev(std::string const &args) if (!current_target_id) { // last entity rit = zone->content().rbegin(); - while (!is_valid_hud_target((*rit)) && rit != zone->content().rend()) - rit++; + while ((rit != zone->content().rend()) && !is_valid_hud_target((*rit))) { + ++rit; + } } else { // current entity - while (rit != zone->content().rend() && ((*rit)->id() != current_target_id)) + while ((rit != zone->content().rend()) && ((*rit)->id() != current_target_id)) { ++rit; + } // previous legal entity if (rit != zone->content().rend()) @@ -212,7 +216,7 @@ void func_target_prev(std::string const &args) } } - if (rit != zone->content().rend()) { + if (rit != zone->content().rend() && is_valid_hud_target((*rit))) { set_target((*rit)); } else { current_target = 0; @@ -220,6 +224,133 @@ void func_target_prev(std::string const &args) } } +void func_target_controlable_next(std::string const &args) +{ + if (!core::localcontrol()) + return; + core::Zone *zone = core::localcontrol()->zone(); + if (!zone) + return; + + if (!zone->content().size()) { + current_target = 0; + current_target_id = 0; + return; + } + + core::Zone::Content::iterator it = zone->content().begin(); + + if (!current_target_id) { + // first entity + it = zone->content().begin(); + while ((it != zone->content().end()) && (((*it)->type() != core::Entity::Controlable) || !is_valid_hud_target((*it)))) { + ++it; + } + + if (it == zone->content().end()) { + current_target = 0; + current_target_id = 0; + } else { + set_target((*it)); + } + + return; + + } else { + // current entity + while (it != zone->content().end() && ((*it)->id() != current_target_id)) { + ++it; + } + + // next legal entity + if (it != zone->content().end()) + it++; + if (it == zone->content().end()) { + it = zone->content().begin(); + } + while (!( ((*it)->type() == core::Entity::Controlable) && is_valid_hud_target((*it))) ) { + it++; + if (it == zone->content().end()) + it = zone->content().begin(); + + if ((*it)->id() == current_target_id) { + current_target = (*it); + return; + } + } + } + + if ((it != zone->content().end()) && ((*it)->type() == core::Entity::Controlable) && is_valid_hud_target((*it))) { + set_target((*it)); + } else { + current_target = 0; + current_target_id = 0; + } +} + +void func_target_controlable_prev(std::string const &args) +{ + if (!core::localcontrol()) + return; + core::Zone *zone = core::localcontrol()->zone(); + if (!zone) + return; + + if (!zone->content().size()) { + current_target = 0; + current_target_id = 0; + return; + } + + core::Zone::Content::reverse_iterator rit = zone->content().rbegin(); + if (!current_target_id) { + // last entity + rit = zone->content().rbegin(); + while ((rit != zone->content().rend()) && (((*rit)->type() != core::Entity::Controlable) || !is_valid_hud_target((*rit)))) { + ++rit; + } + + if (rit == zone->content().rend()) { + current_target = 0; + current_target_id = 0; + } else { + set_target((*rit)); + } + + return; + + } else { + // current entity + while (rit != zone->content().rend() && ((*rit)->id() != current_target_id)) { + ++rit; + } + + // previous legal entity + if (rit != zone->content().rend()) + ++rit; + if (rit == zone->content().rend()) { + rit = zone->content().rbegin(); + } + while (!(((*rit)->type() == core::Entity::Controlable) && is_valid_hud_target((*rit))) ) { + ++rit; + if (rit == zone->content().rend()) + rit = zone->content().rbegin(); + + if ((*rit)->id() == current_target_id) { + current_target = (*rit); + return; + } + } + } + + if ((rit != zone->content().rend()) && ((*rit)->type() == core::Entity::Controlable) && is_valid_hud_target((*rit))) { + set_target((*rit)); + } else { + current_target = 0; + current_target_id = 0; + } +} + void func_target_none(std::string const &args) { current_target = 0; @@ -282,6 +413,12 @@ void init() core::Func::add("target_center", func_target_center); func->set_info("select target near center"); + + func = core::Func::add("target_controlable_next", func_target_controlable_next); + func->set_info("select next controlable target"); + + core::Func::add("target_controlable_prev", func_target_controlable_prev); + func->set_info("select previous controlable target"); reset(); } @@ -294,6 +431,8 @@ void shutdown() core::Func::remove("target_prev"); core::Func::remove("target_none"); core::Func::remove("target_center"); + core::Func::remove("target_controlable_next"); + core::Func::remove("target_controlable_next"); } const math::Vector3f & aim() |