diff options
author | Stijn Buys <ingar@osirion.org> | 2013-11-05 13:17:27 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2013-11-05 13:17:27 +0000 |
commit | 9a16c4b433bba4837bc98a90b446aa0726f0d447 (patch) | |
tree | 162f257f40a83ae46eddbe1fa0289b2d3e496e44 /src/game/base/game.cc | |
parent | cbb34af067be07ad28349e64d8670c97785c53c0 (diff) |
Correct a bug where launch timeout is ignored for patrols with only a single member,
increase dampening for cargo pods,
added 'explode' cheat function to self-destruct,
cleaned up cargo pod eject code,
eject cargo on ship destruction,
added g_cargoloss game variable.
Diffstat (limited to 'src/game/base/game.cc')
-rw-r--r-- | src/game/base/game.cc | 139 |
1 files changed, 49 insertions, 90 deletions
diff --git a/src/game/base/game.cc b/src/game/base/game.cc index b3fb415..6921f72 100644 --- a/src/game/base/game.cc +++ b/src/game/base/game.cc @@ -63,6 +63,7 @@ core::Cvar *Game::g_jumppointrange = 0; core::Cvar *Game::g_devel = 0; core::Cvar *Game::g_damping = 0; core::Cvar *Game::g_deplete = 0; +core::Cvar *Game::g_cargoloss = 0; core::Module *factory() { @@ -121,8 +122,9 @@ void Game::func_spectate(core::Player *player, std::string const &args) player->remove_asset(player->control()); } - if (!player->zone()) + if (!player->zone()) { player->set_zone(Default::zone); + } player->set_view(0); } @@ -1229,109 +1231,38 @@ void Game::func_eject(core::Player *player, const std::string &args) return; } - core::EntityControlable *ejector = player->control(); + if (player->control()->moduletype() != ship_enttype) { + return; + } + Ship * ship = static_cast<Ship *>(player->control()); + // cannot eject while jumping - if ((ejector->state() == core::Entity::Jump) || (ejector->state() == core::Entity::JumpInitiate)) { - if (ejector->owner()) { - ejector->owner()->send("^WCan not eject while hyperspace jump drive is active"); + if ((ship->state() == core::Entity::Jump) || (ship->state() == core::Entity::JumpInitiate)) { + if (ship->owner()) { + ship->owner()->send("^WCan not eject while hyperspace jump drive is active"); } return; } // find the item in the inventory - core::Item *item = ejector->inventory()->find(id); + core::Item *item = ship->inventory()->find(id); if (!item) { - if (ejector->owner()) { + if (ship->owner()) { std::stringstream msgstr; msgstr << "^WItem " << id << " not in inventory"; - ejector->owner()->send(msgstr.str()); + ship->owner()->send(msgstr.str()); } return; } if (!item->amount()) { - if (ejector->owner()) { - ejector->owner()->send("^WYou do not own any " + item->info()->name()); + if (ship->owner()) { + ship->owner()->send("^WYou do not own any " + item->info()->name()); } return; - } - - if ((amount < 0) || (amount > item->amount())) { - amount = item->amount(); } - item->dec_amount(amount); - if (ejector->state() == core::Entity::Docked) { - if (ejector->owner()) { - std::stringstream msgstr; - msgstr << "^BDestroyed " << amount << " " << aux::plural("unit", amount) << " of " << item->info()->name(); - ejector->owner()->send(msgstr.str()); - ejector->owner()->sound("game/eject"); - } - } else { - // create cargo pod - CargoPod *pod = new CargoPod(); - - if (item->info()->modelname().size()) { - pod->set_name(item->info()->name()); - // setting item modesl looks silly, but can be uncommented server-side - //pod->set_modelname(item->info()->modelname()); - } - pod->set_color(ejector->color()); - pod->set_color_second(ejector->color_second()); - pod->set_location(ejector->location() + ejector->axis().up() * (ejector->radius() + pod->radius())); - pod->set_axis(ejector->axis()); - pod->set_zone(ejector->zone()); - pod->set_info(item->info()); - - // add loot to inventory - pod->add_inventory(); - pod->inventory()->set_capacity(item->info()->volume() * amount); - - core::Item *loot = new core::Item(item->info()); - loot->set_amount(amount); - loot->set_flags(item->flags()); - loot->unset_flag(core::Item::Mounted); - - pod->inventory()->add(loot); - pod->inventory()->set_dirty(); - - if (ejector->owner()) { - std::stringstream msgstr; - if (item->unique()) { - msgstr << "^BEjected " << item->info()->name(); - } else { - msgstr << "^BEjected " << amount << " " << aux::plural("unit", amount) << " of " << item->info()->name(); - } - ejector->owner()->send(msgstr.str()); - ejector->owner()->sound("game/eject"); - } - - pod->reset(); - } - - if (item->amount() == 0) { - if (item->has_flag(core::Item::Mounted)) { - // unmount - core::Slot *slot = 0; - - for(core::Slots::iterator it = ejector->slots()->begin(); (!slot) && (it != ejector->slots()->end()); ++it) { - if ((*it)->item() == item) { - slot = (*it); - } - } - - if (slot) { - slot->set_item(0); - slot->unset_flag(core::Slot::Active); - slot->unset_flag(core::Slot::Mounted); - item->unset_flag(core::Item::Mounted); - } - - } - ejector->inventory()->erase(item->id()); - } - ejector->inventory()->set_dirty(); + ship->eject(item, amount, true); } // mount weapons into slots @@ -1617,16 +1548,19 @@ void Game::func_respawn(core::Player *player, std::string const &args) // instantaniously goto a specified entity within the zone void Game::func_goto(core::Player *player, const std::string &args) { - if (!args.size()) - return; - if (!g_devel->value()) { player->send("Cheats disabled"); return; } - if (!player->control()) + if (!player->control()) { + player->send("^WYou need to join the game first!"); return; + } + + if (!args.size()) { + return; + } core::Entity *dock = player->control()->zone()->search_entity(args); Ship *ship = static_cast<Ship *>(player->control()); @@ -1662,6 +1596,25 @@ void Game::func_goto(core::Player *player, const std::string &args) } } +// self-destruct +void Game::func_explode(core::Player *player, const std::string &args) +{ + if (!g_devel->value()) { + player->send("Cheats disabled"); + return; + } + + if (!player->control()) { + player->send("^WYou need to join the game first!"); + return; + } + + assert(player->control()->moduletype() == ship_enttype); + Ship *ship = static_cast<Ship *>(player->control()); + + ship->explode(); +} + /* -- class Game -------------------------------------------------- */ Game::Game() : core::Module("Project::OSiRiON", true) @@ -1762,6 +1715,9 @@ Game::Game() : core::Module("Project::OSiRiON", true) func = core::Func::add("respawn", Game::func_respawn); func->set_info("respawn when your ship has been destroyed"); + func = core::Func::add("explode", Game::func_explode); + func->set_info("self-destruct"); + func = core::Func::add("goto", Game::func_goto); func->set_info("[string] goto to an entity within the zone"); @@ -1795,6 +1751,9 @@ Game::Game() : core::Module("Project::OSiRiON", true) g_deplete = core::Cvar::get("g_deplete", "60", core::Cvar::Game | core::Cvar::Archive); g_deplete->set_info("[int] number of seconds to deplete 1 unit of cargo from inventories"); + + g_cargoloss = core::Cvar::get("g_cargoloss", "100", core::Cvar::Game | core::Cvar::Archive); + g_cargoloss->set_info("[int] percentage of cargo to drop on player death"); } Game::~Game() |