mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-10-31 04:32:06 +00:00 
			
		
		
		
	feat: hardcore limit % coins dropped on death (#1898)
* feat: hardcore limit % coins dropped on death Update EntityManager.cpp * fix log msg
This commit is contained in:
		| @@ -87,6 +87,8 @@ void EntityManager::ReloadConfig() { | ||||
| 	auto hcXpReduction = Game::config->GetValue("hardcore_uscore_reduction"); | ||||
| 	m_HardcoreUscoreReduction = hcXpReduction.empty() ? 1.0f : GeneralUtils::TryParse<float>(hcXpReduction).value_or(1.0f); | ||||
| 	m_HardcoreMode = GetHardcoreDisabledWorlds().contains(Game::zoneManager->GetZoneID().GetMapID()) ? false : m_HardcoreMode; | ||||
| 	auto hcCoinKeep = Game::config->GetValue("hardcore_coin_keep"); | ||||
| 	m_HardcoreCoinKeep = hcCoinKeep.empty() ? false : GeneralUtils::TryParse<float>(hcCoinKeep).value_or(0.0f); | ||||
| } | ||||
|  | ||||
| void EntityManager::Initialize() { | ||||
|   | ||||
| @@ -81,6 +81,7 @@ public: | ||||
| 	const std::set<LOT>& GetHardcoreUscoreReducedLots() const { return m_HardcoreUscoreReducedLots; }; | ||||
| 	const std::set<LOT>& GetHardcoreUscoreExcludedEnemies() const { return m_HardcoreUscoreExcludedEnemies; }; | ||||
| 	const std::set<LWOMAPID>& GetHardcoreDisabledWorlds() const { return m_HardcoreDisabledWorlds; }; | ||||
| 	float GetHardcoreCoinKeep() const { return m_HardcoreCoinKeep; } | ||||
|  | ||||
| 	// Messaging | ||||
| 	bool SendMessage(GameMessages::GameMsg& msg) const; | ||||
| @@ -125,6 +126,7 @@ private: | ||||
| 	std::set<LOT> m_HardcoreUscoreReducedLots{}; | ||||
| 	std::set<LOT> m_HardcoreUscoreExcludedEnemies{}; | ||||
| 	std::set<LWOMAPID> m_HardcoreDisabledWorlds{}; | ||||
| 	float m_HardcoreCoinKeep{}; | ||||
| }; | ||||
|  | ||||
| #endif // ENTITYMANAGER_H | ||||
|   | ||||
| @@ -786,7 +786,7 @@ void DestroyableComponent::Smash(const LWOOBJID source, const eKillType killType | ||||
| 		} | ||||
| 	} else { | ||||
| 		//Check if this zone allows coin drops | ||||
| 		if (Game::zoneManager->GetPlayerLoseCoinOnDeath()) { | ||||
| 		if (Game::zoneManager->GetPlayerLoseCoinOnDeath() && !Game::entityManager->GetHardcoreMode()) { | ||||
| 			auto* character = m_Parent->GetCharacter(); | ||||
| 			uint64_t coinsTotal = character->GetCoins(); | ||||
| 			const uint64_t minCoinsToLose = Game::zoneManager->GetWorldConfig().coinsLostOnDeathMin; | ||||
| @@ -1012,13 +1012,23 @@ void DestroyableComponent::DoHardcoreModeDrops(const LWOOBJID source) { | ||||
| 		//get character: | ||||
| 		auto* chars = m_Parent->GetCharacter(); | ||||
| 		if (chars) { | ||||
| 			auto coins = chars->GetCoins(); | ||||
| 			auto oldCoins = chars->GetCoins(); | ||||
| 			// Floor this so there arent coins generated from rounding | ||||
| 			auto coins = static_cast<uint64_t>(oldCoins * Game::entityManager->GetHardcoreCoinKeep()); | ||||
| 			auto coinsToDrop = oldCoins - coins; | ||||
| 			LOG("Player had %llu coins, will lose %i coins to have %i", oldCoins, coinsToDrop, coins); | ||||
|  | ||||
| 			//lose all coins: | ||||
| 			chars->SetCoins(0, eLootSourceType::NONE); | ||||
| 			chars->SetCoins(coins, eLootSourceType::NONE); | ||||
|  | ||||
| 			//drop all coins: | ||||
| 			GameMessages::SendDropClientLoot(m_Parent, source, LOT_NULL, coins, m_Parent->GetPosition()); | ||||
| 			constexpr auto MAX_TO_DROP_PER_GM = 100'000; | ||||
| 			while (coinsToDrop > MAX_TO_DROP_PER_GM) { | ||||
| 				LOG("Dropping 100,000, %llu left", coinsToDrop); | ||||
| 				GameMessages::SendDropClientLoot(m_Parent, source, LOT_NULL, MAX_TO_DROP_PER_GM, m_Parent->GetPosition()); | ||||
| 				coinsToDrop -= MAX_TO_DROP_PER_GM; | ||||
| 			} | ||||
| 			GameMessages::SendDropClientLoot(m_Parent, source, LOT_NULL, coinsToDrop, m_Parent->GetPosition()); | ||||
| 		} | ||||
| 		return; | ||||
| 	} | ||||
|   | ||||
| @@ -99,3 +99,6 @@ hardcore_uscore_excluded_enemies= | ||||
|  | ||||
| # Disables hardcore mode for specific worlds, if hardcore is enabled | ||||
| hardcore_disabled_worlds= | ||||
|  | ||||
| # Keeps this percentage of a players' coins on death in hardcore | ||||
| hardcore_coin_keep= | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 David Markowitz
					David Markowitz