Browse Source

fixed second depth of chest lists

allows all difficulty levels to be tracked individually in the 2nd layer (zone->difficulty or difficulty->zone)
Image 4 years ago
parent
commit
172065b60a
2 changed files with 70 additions and 14 deletions
  1. 67 10
      EQ2/source/WorldServer/Zone/ChestTrap.cpp
  2. 3 4
      EQ2/source/WorldServer/Zone/ChestTrap.h

+ 67 - 10
EQ2/source/WorldServer/Zone/ChestTrap.cpp

@@ -85,11 +85,27 @@ bool ChestTrapList::GetNextChestTrap(ChestTrap::ChestTrapInfo* cti) {
 }
 
 ChestTrapList* ChestTrapList::GetChestListByDifficulty(int32 difficulty) {
-	ChestTrapList* usedList = GetChestTrapList(ChestTrapBaseList::DIFFICULTY);
+		ChestTrapList* usedList = 0;
+
+		int32 id = 0;
+		if (ChestTrapParent)
+		{
+			usedList = GetChestTrapList(ChestTrapBaseList::DIFFICULTY);
+			id = ChestTrapBaseList::DIFFICULTY;
+		}
+		else
+		{
+			usedList = GetChestTrapListByID(difficulty);
+			id = difficulty;
+		}
+
 	if (usedList && usedList->IsListLoaded())
 		return usedList;
 	else if (!usedList)
-		return NULL;
+	{
+		usedList = new ChestTrapList();
+		AddChestTrapList(usedList, id);
+	}
 
 	MChestTrapList.writelock(__FUNCTION__, __LINE__);
 	map<int32, ChestTrap*>::iterator itr;
@@ -109,11 +125,27 @@ ChestTrapList* ChestTrapList::GetChestListByDifficulty(int32 difficulty) {
 }
 
 ChestTrapList* ChestTrapList::GetChestListByZone(int32 zoneid) {
-	ChestTrapList* usedList = GetChestTrapList(ChestTrapBaseList::ZONE);
+	ChestTrapList* usedList = 0;
+
+	int32 id = 0;
+	if (ChestTrapParent)
+	{
+		usedList = GetChestTrapList(ChestTrapBaseList::ZONE);
+		id = ChestTrapBaseList::ZONE;
+	}
+	else
+	{
+		usedList = GetChestTrapListByID(zoneid);
+		id = zoneid;
+	}
+
 	if (usedList && usedList->IsListLoaded())
 		return usedList;
 	else if (!usedList)
-		return NULL;
+	{
+		usedList = new ChestTrapList();
+		AddChestTrapList(usedList, id);
+	}
 
 	MChestTrapList.writelock(__FUNCTION__, __LINE__);
 	map<int32, ChestTrap*>::iterator itr;
@@ -135,6 +167,18 @@ map<int32, ChestTrap*>* ChestTrapList::GetAllChestTraps() { return &chesttrap_li
 bool	ChestTrapList::IsListLoaded() { return ListLoaded; }
 void	ChestTrapList::SetListLoaded(bool val) { ListLoaded = val; }
 
+void ChestTrapList::AddChestTrapList(ChestTrapList* traplist, int32 id) {
+	if (chesttrap_innerlist.count(id) > 0)
+	{
+		ChestTrapList* tmpTrapList = chesttrap_innerlist[id];
+		chesttrap_innerlist.erase(id);
+		safe_delete(tmpTrapList);
+	}
+
+	chesttrap_innerlist[id] = traplist;
+}
+
+
 ChestTrapList* ChestTrapList::GetChestTrapList(ChestTrapBaseList listName) {
 	ChestTrapList* ctl = 0;
 	MChestTrapInnerList.readlock(__FUNCTION__, __LINE__);
@@ -145,6 +189,16 @@ ChestTrapList* ChestTrapList::GetChestTrapList(ChestTrapBaseList listName) {
 	return ctl;
 }
 
+ChestTrapList* ChestTrapList::GetChestTrapListByID(int32 id) {
+	ChestTrapList* ctl = 0;
+	MChestTrapInnerList.readlock(__FUNCTION__, __LINE__);
+	if (chesttrap_innerlist.count(id) > 0)
+		ctl = chesttrap_innerlist[id];
+	MChestTrapInnerList.releasereadlock(__FUNCTION__, __LINE__);
+
+	return ctl;
+}
+
 void ChestTrapList::ClearTraps() {
 	MChestTrapList.writelock(__FUNCTION__, __LINE__);
 	map<int32, ChestTrap*>::iterator itr;
@@ -175,12 +229,15 @@ void ChestTrapList::SetupMutexes()
 
 void ChestTrapList::InstantiateLists(bool parent)
 {
-	difficultyList = new ChestTrapList(parent);
-	zoneList = new ChestTrapList(parent);
-	MChestTrapInnerList.writelock(__FUNCTION__, __LINE__);
-	chesttrap_innerlist[ChestTrapBaseList::DIFFICULTY] = difficultyList;
-	chesttrap_innerlist[ChestTrapBaseList::ZONE] = zoneList;
-	MChestTrapInnerList.releasewritelock(__FUNCTION__, __LINE__);
+	if (parent)
+	{
+		difficultyList = new ChestTrapList(false);
+		zoneList = new ChestTrapList(false);
+		MChestTrapInnerList.writelock(__FUNCTION__, __LINE__);
+		chesttrap_innerlist[ChestTrapBaseList::DIFFICULTY] = difficultyList;
+		chesttrap_innerlist[ChestTrapBaseList::ZONE] = zoneList;
+		MChestTrapInnerList.releasewritelock(__FUNCTION__, __LINE__);
+	}
 }
 
 void ChestTrapList::shuffleMap(ChestTrapList* list) {

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

@@ -73,10 +73,6 @@ public:
 
 		ChestTrapParent = parentClass;
 
-		// instantiates one inner layer to the top layer of chest trap lists
-		if (parentClass)
-			InstantiateLists(false);
-
 		ListLoaded = false;
 	}
 
@@ -105,9 +101,12 @@ private:
 	bool	IsListLoaded();
 	void	SetListLoaded(bool val);
 
+	void	AddChestTrapList(ChestTrapList* trap, int32 id);
+
 	void	SetCycleIterator(map<int32, ChestTrap*>::iterator itr);
 
 	ChestTrapList* GetChestTrapList(ChestTrapBaseList listName);
+	ChestTrapList* GetChestTrapListByID(int32 id);
 
 	void ClearTraps();
 	void ClearTrapList();