diff options
Diffstat (limited to 'src/game')
| -rw-r--r-- | src/game/base/cargo.cc | 14 | ||||
| -rw-r--r-- | src/game/base/game.cc | 68 | ||||
| -rw-r--r-- | src/game/base/game.h | 1 | ||||
| -rw-r--r-- | src/game/base/planet.cc | 2 | 
4 files changed, 79 insertions, 6 deletions
| diff --git a/src/game/base/cargo.cc b/src/game/base/cargo.cc index cc358f6..3571b22 100644 --- a/src/game/base/cargo.cc +++ b/src/game/base/cargo.cc @@ -330,7 +330,7 @@ void Cargo::eject(core::EntityControlable *ejector, const int amount)  	}  	item->dec_amount(negotiated_amount); -	ejector->owner()->set_dirty(); +	ejector->inventory()->set_dirty();  	if (!ejector->state() == core::Entity::Docked) {  		std::stringstream msgstr; @@ -342,8 +342,7 @@ void Cargo::eject(core::EntityControlable *ejector, const int amount)  		return;  	} -	// create cargo pod -	 +	// create cargo pod	  	CargoPod *pod = new CargoPod();  	pod->set_color(ejector->color()); @@ -351,10 +350,15 @@ void Cargo::eject(core::EntityControlable *ejector, const int amount)  	pod->set_zone(ejector->zone());  	pod->set_location(ejector->location() + ejector->axis().up() * ejector->radius());  	pod->set_axis(ejector->axis()); -		 +	 +	// add loot to inventory  	pod->set_inventory(new core::Inventory());  	pod->inventory()->set_capacity(item->info()->volume() * negotiated_amount); -	pod->inventory()->add(new core::Item(*item)); +	 +	core::Item *loot = new core::Item(item->info()); +	loot->set_amount(negotiated_amount); +	 +	pod->inventory()->add(loot);  	pod->inventory()->set_dirty();  	if (ejector->owner()) { diff --git a/src/game/base/game.cc b/src/game/base/game.cc index b426989..3c84d58 100644 --- a/src/game/base/game.cc +++ b/src/game/base/game.cc @@ -478,6 +478,71 @@ void Game::func_eject(core::Player *player, const std::string &args)  	}  } +// beam in nearby cargo pods +void Game::func_beam(core::Player *player, const std::string &args) +{ +	const float beam_range_squared = 5.0f * 5.0f; +	 +	if (!player->control()) +		return; + +	if (player->control()->state() != core::Entity::Normal) +		return; + +	core::Zone *zone = player->control()->zone(); +	core::Inventory *inventory = player->control()->inventory(); +	 +	// entity iterator +	for (core::Zone::Content::iterator eit = zone->content().begin(); eit != zone->content().end(); eit++) { +		// if the entity is a cargo pod and within beaming range +		if (((*eit)->moduletype() == cargopod_enttype) && (math::distancesquared(player->control()->location(), (*eit)->location()) <= beam_range_squared)) { +			core::Inventory *loot = (*eit)->inventory(); +			if (!inventory || !loot) +				continue; + +			// item iterator +			int loot_left = 0; +			for (core::Inventory::Items::iterator iit = loot->items().begin(); iit != loot->items().end(); iit++) { +				core::Item *item = (*iit); +				int negotiated_amount = item->amount(); + +				assert(item->info()); +				 +				if (inventory->capacity_available() < negotiated_amount * item->info()->volume()) { +					negotiated_amount = (int) floorf( inventory->capacity_available() / item->info()->volume()); +				} +				 +				if (negotiated_amount > 0) { +					core::Item *iteminv = inventory->find(item->info()); +					if (!iteminv) { +						iteminv = new core::Item(item->info()); +						inventory->add(iteminv); +					} +					 +					item->dec_amount(negotiated_amount); +					iteminv->inc_amount(negotiated_amount); +					 +					// this will recalculate inventory capacity +					inventory->set_dirty(); +					loot->set_dirty(); +					 +					std::stringstream msgstr; +					msgstr << "^BBeamed in " << negotiated_amount << " " << aux::plural("unit", negotiated_amount) << " of " << item->info()->name(); +					player->send(msgstr.str());	 +					player->sound("game/beam"); +				} +				 +				loot_left += item->amount(); +			} +			 +			// if there's no loot left, the cargo pod will be destroyed +			if (!loot_left) { +				(*eit)->die(); +			} +		} +	} +} +  // launch request  void Game::func_launch(core::Player *player, std::string const &args)  { @@ -665,6 +730,9 @@ Game::Game() : core::Module("Project::OSiRiON", true)  	func = core::Func::add("eject", Game::func_eject);  	func->set_info("[string] [string] [int] eject an item from inventory: specify type, label and amount"); +	 +	func = core::Func::add("beam", Game::func_beam); +	func->set_info("beam nearby cargo pods in");  	func = core::Func::add("give", Game::func_give);  	func->set_info("cheat functions"); diff --git a/src/game/base/game.h b/src/game/base/game.h index f4ce8c0..3f67a25 100644 --- a/src/game/base/game.h +++ b/src/game/base/game.h @@ -111,6 +111,7 @@ private:  	static void func_sell(core::Player *player, const std::string &args);  	static void func_give(core::Player *player, const std::string &args);  	static void func_eject(core::Player *player, const std::string &args); +	static void func_beam(core::Player *player, const std::string &args);  };  /// factory function diff --git a/src/game/base/planet.cc b/src/game/base/planet.cc index ad1aa47..7a648db 100644 --- a/src/game/base/planet.cc +++ b/src/game/base/planet.cc @@ -37,7 +37,7 @@ void Planet::dock(core::Entity *entity)  	Ship * ship = static_cast<Ship *>(entity); -	// fixed 50 km docking radius +	// fixed 5 km docking radius  	if (math::distance(location(), ship->location()) > radius() + ship->radius() + 50.0f) {  		if (ship->owner())  			ship->owner()->send("Planet out of range"); | 
