Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2013-11-05 13:17:27 +0000
committerStijn Buys <ingar@osirion.org>2013-11-05 13:17:27 +0000
commit9a16c4b433bba4837bc98a90b446aa0726f0d447 (patch)
tree162f257f40a83ae46eddbe1fa0289b2d3e496e44 /src/game/base/game.cc
parentcbb34af067be07ad28349e64d8670c97785c53c0 (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.cc139
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()