mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-10-31 04:32:06 +00:00 
			
		
		
		
	Fix trading taking the wrong item (#900)
* Fix trading taking the wrong item * Add missing returns * Improve further Do all verification first. Then actually do the trade. Prevents possible cheating attempts
This commit is contained in:
		| @@ -103,6 +103,7 @@ void Trade::SetAccepted(LWOOBJID participant, bool value) { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		Complete(); | 		Complete(); | ||||||
|  | 		TradingManager::Instance()->CancelTrade(m_TradeId); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -121,33 +122,59 @@ void Trade::Complete() { | |||||||
|  |  | ||||||
| 	if (inventoryA == nullptr || inventoryB == nullptr || characterA == nullptr || characterB == nullptr || missionsA == nullptr || missionsB == nullptr) return; | 	if (inventoryA == nullptr || inventoryB == nullptr || characterA == nullptr || characterB == nullptr || missionsA == nullptr || missionsB == nullptr) return; | ||||||
|  |  | ||||||
|  | 	// First verify both players have the coins and items requested for the trade. | ||||||
|  | 	if (characterA->GetCoins() < m_CoinsA || characterB->GetCoins() < m_CoinsB) { | ||||||
|  | 		Game::logger->Log("TradingManager", "Possible coin trade cheating attempt! Aborting trade."); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (const auto& tradeItem : m_ItemsA) { | ||||||
|  | 		auto* itemToRemove = inventoryA->FindItemById(tradeItem.itemId); | ||||||
|  | 		if (itemToRemove) { | ||||||
|  | 			if (itemToRemove->GetCount() < tradeItem.itemCount) { | ||||||
|  | 				Game::logger->Log("TradingManager", "Possible cheating attempt from %s in trading!!! Aborting trade", characterA->GetName().c_str()); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			Game::logger->Log("TradingManager", "Possible cheating attempt from %s in trading due to item not being available!!!", characterA->GetName().c_str()); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (const auto& tradeItem : m_ItemsB) { | ||||||
|  | 		auto* itemToRemove = inventoryB->FindItemById(tradeItem.itemId); | ||||||
|  | 		if (itemToRemove) { | ||||||
|  | 			if (itemToRemove->GetCount() < tradeItem.itemCount) { | ||||||
|  | 				Game::logger->Log("TradingManager", "Possible cheating attempt from %s in trading!!! Aborting trade", characterB->GetName().c_str()); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			Game::logger->Log("TradingManager", "Possible cheating attempt from %s in trading due to item not being available!!!  Aborting trade", characterB->GetName().c_str()); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Now actually do the trade. | ||||||
| 	characterA->SetCoins(characterA->GetCoins() - m_CoinsA + m_CoinsB, eLootSourceType::LOOT_SOURCE_TRADE); | 	characterA->SetCoins(characterA->GetCoins() - m_CoinsA + m_CoinsB, eLootSourceType::LOOT_SOURCE_TRADE); | ||||||
| 	characterB->SetCoins(characterB->GetCoins() - m_CoinsB + m_CoinsA, eLootSourceType::LOOT_SOURCE_TRADE); | 	characterB->SetCoins(characterB->GetCoins() - m_CoinsB + m_CoinsA, eLootSourceType::LOOT_SOURCE_TRADE); | ||||||
|  |  | ||||||
| 	for (const auto& tradeItem : m_ItemsA) { | 	for (const auto& tradeItem : m_ItemsA) { | ||||||
| 		inventoryA->RemoveItem(tradeItem.itemLot, tradeItem.itemCount, INVALID, true); | 		auto* itemToRemove = inventoryA->FindItemById(tradeItem.itemId); | ||||||
|  | 		if (itemToRemove) itemToRemove->SetCount(itemToRemove->GetCount() - tradeItem.itemCount); | ||||||
| 		missionsA->Progress(MissionTaskType::MISSION_TASK_TYPE_ITEM_COLLECTION, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount); | 		missionsA->Progress(MissionTaskType::MISSION_TASK_TYPE_ITEM_COLLECTION, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount); | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for (const auto& tradeItem : m_ItemsB) { |  | ||||||
| 		inventoryB->RemoveItem(tradeItem.itemLot, tradeItem.itemCount, INVALID, true); |  | ||||||
|  |  | ||||||
| 		missionsB->Progress(MissionTaskType::MISSION_TASK_TYPE_ITEM_COLLECTION, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for (const auto& tradeItem : m_ItemsA) { |  | ||||||
| 		inventoryB->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE); | 		inventoryB->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (const auto& tradeItem : m_ItemsB) { | 	for (const auto& tradeItem : m_ItemsB) { | ||||||
|  | 		auto* itemToRemove = inventoryB->FindItemById(tradeItem.itemId); | ||||||
|  | 		if (itemToRemove) itemToRemove->SetCount(itemToRemove->GetCount() - tradeItem.itemCount); | ||||||
|  | 		missionsB->Progress(MissionTaskType::MISSION_TASK_TYPE_ITEM_COLLECTION, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount); | ||||||
| 		inventoryA->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE); | 		inventoryA->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	TradingManager::Instance()->CancelTrade(m_TradeId); |  | ||||||
|  |  | ||||||
| 	characterA->SaveXMLToDatabase(); | 	characterA->SaveXMLToDatabase(); | ||||||
| 	characterB->SaveXMLToDatabase(); | 	characterB->SaveXMLToDatabase(); | ||||||
|  | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Trade::Cancel() { | void Trade::Cancel() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 David Markowitz
					David Markowitz