Linux fixes for ChestTraps

This commit is contained in:
Image 2020-03-16 14:54:54 -04:00
parent efc95eb208
commit de0979f2ec
3 changed files with 17 additions and 16 deletions
EQ2/source/WorldServer

View file

@ -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) {

View file

@ -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);

View file

@ -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;