Browse Source

Linux fixes for ChestTraps

Image 4 years ago
parent
commit
de0979f2ec

+ 11 - 12
EQ2/source/WorldServer/Zone/ChestTrap.cpp

@@ -1,6 +1,7 @@
 #include "ChestTrap.h"
 #include <vector>
 #include <algorithm>    // std::random_shuffle
+#include <string.h>
 
 int32 ChestTrapList::Size() {
 
@@ -26,31 +27,30 @@ void ChestTrapList::AddChestTrap(ChestTrap* trap) {
 	MChestTrapList.releasewritelock(__FUNCTION__, __LINE__);
 }
 
-ChestTrap::ChestTrapInfo ChestTrapList::GetChestTrap(int32 id) {
+bool ChestTrapList::GetChestTrap(int32 id, ChestTrap::ChestTrapInfo* cti) {
 	ChestTrap* res = 0;
 	MChestTrapList.readlock(__FUNCTION__, __LINE__);
 	if (chesttrap_list.count(id) > 0)
 		res = chesttrap_list[id];
 
-	ChestTrap::ChestTrapInfo cti;
-	memset(&cti, 0, sizeof(ChestTrap::ChestTrapInfo));
+	memset(cti, 0, sizeof(ChestTrap::ChestTrapInfo));
 	if (res)
-		memcpy(&cti, &res->GetChestTrapInfo(), sizeof(ChestTrap::ChestTrapInfo));
+		memcpy(cti, &res->GetChestTrapInfo(), sizeof(ChestTrap::ChestTrapInfo));
 	MChestTrapList.releasereadlock(__FUNCTION__, __LINE__);
 
 	return cti;
 }
 
-ChestTrap::ChestTrapInfo ChestTrapList::GetNextTrap(int32 zoneid, int32 chest_difficulty)
+bool ChestTrapList::GetNextTrap(int32 zoneid, int32 chest_difficulty, ChestTrap::ChestTrapInfo* cti)
 {
 	MChestListsInUse.writelock(__FUNCTION__, __LINE__);
 	ChestTrapList* zoneTrapList = GetChestListByZone(zoneid);
 	ChestTrapList* zoneDifficultyTrapList = zoneTrapList->GetChestListByDifficulty(chest_difficulty);
 
-	ChestTrap::ChestTrapInfo nextTrap = zoneTrapList->GetNextChestTrap();
+	zoneTrapList->GetNextChestTrap(cti);
 	MChestListsInUse.releasewritelock(__FUNCTION__, __LINE__);
 
-	return nextTrap;
+	return true;
 }
 
 void ChestTrapList::Clear() {
@@ -60,7 +60,7 @@ void ChestTrapList::Clear() {
 	MChestListsInUse.releasewritelock(__FUNCTION__, __LINE__);
 }
 
-ChestTrap::ChestTrapInfo ChestTrapList::GetNextChestTrap() {
+bool ChestTrapList::GetNextChestTrap(ChestTrap::ChestTrapInfo* cti) {
 	MChestTrapList.readlock(__FUNCTION__, __LINE__);
 	if (cycleItr == chesttrap_list.end())
 	{
@@ -74,15 +74,14 @@ ChestTrap::ChestTrapInfo ChestTrapList::GetNextChestTrap() {
 	MChestTrapList.writelock(__FUNCTION__, __LINE__);
 	ChestTrap* trap = cycleItr->second;
 
-	ChestTrap::ChestTrapInfo cti;
-	memset(&cti, 0, sizeof(ChestTrap::ChestTrapInfo));
+	memset(cti, 0, sizeof(ChestTrap::ChestTrapInfo));
 	if (trap)
-		memcpy(&cti, &trap->GetChestTrapInfo(), sizeof(ChestTrap::ChestTrapInfo));
+		memcpy(cti, &trap->GetChestTrapInfo(), sizeof(ChestTrap::ChestTrapInfo));
 
 	cycleItr++;
 	MChestTrapList.releasewritelock(__FUNCTION__, __LINE__);
 
-	return cti;
+	return true;
 }
 
 ChestTrapList* ChestTrapList::GetChestListByDifficulty(int32 difficulty) {

+ 3 - 3
EQ2/source/WorldServer/Zone/ChestTrap.h

@@ -88,14 +88,14 @@ public:
 
 	void AddChestTrap(ChestTrap* trap);
 
-	ChestTrap::ChestTrapInfo GetChestTrap(int32 id);
+	bool GetChestTrap(int32 id, ChestTrap::ChestTrapInfo* cti);
 
-	ChestTrap::ChestTrapInfo GetNextTrap(int32 zoneid, int32 chest_difficulty);
+	bool GetNextTrap(int32 zoneid, int32 chest_difficulty, ChestTrap::ChestTrapInfo* cti);
 
 	void Clear();
 private:
 	// randomized maps so we just iterate the map for our next 'random' result
-	ChestTrap::ChestTrapInfo GetNextChestTrap();
+	bool GetNextChestTrap(ChestTrap::ChestTrapInfo* cti);
 
 	ChestTrapList* GetChestListByDifficulty(int32 difficulty);
 

+ 3 - 1
EQ2/source/WorldServer/client.cpp

@@ -4107,7 +4107,9 @@ void Client::OpenChest(Entity* entity)
 
 	if (chest_difficulty > 0 && !entity->HasTrapTriggered())
 	{
-		ChestTrap::ChestTrapInfo nextTrap = chest_trap_list.GetNextTrap(GetCurrentZone()->GetZoneID(), chest_difficulty);
+		ChestTrap::ChestTrapInfo nextTrap;
+		
+		chest_trap_list.GetNextTrap(GetCurrentZone()->GetZoneID(), chest_difficulty, &nextTrap);
 
 		Skill* disarmSkill = GetPlayer()->GetSkillByName("Disarm Trap", false);
 		firstChestOpen = true;