Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cObjectDB.cpp 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "stdafx.h"
  2. #include "cObjectDB.h"
  3. cObjectDB::cObjectDB()
  4. {
  5. ObjectList.clear();
  6. }
  7. cObjectDB::~cObjectDB()
  8. {
  9. for (std::unordered_map<DWORD, cWObject *>::iterator i = ObjectList.begin(); i != ObjectList.end(); i++)
  10. delete i->second;
  11. for (std::unordered_map<DWORD, std::list<DWORD> *>::iterator i = m_mPackContents.begin(); i != m_mPackContents.end(); i++)
  12. delete i->second;
  13. }
  14. void cObjectDB::AddObject(cWObject * NewObject)
  15. {
  16. Lock();
  17. if (ObjectList.find(NewObject->GetGUID()) != ObjectList.end())
  18. {
  19. Unlock();
  20. DeleteObject(NewObject->GetGUID());
  21. Lock();
  22. }
  23. ObjectList[NewObject->GetGUID()] = NewObject;
  24. Unlock();
  25. }
  26. cWObject * cObjectDB::FindObject(DWORD GUID)
  27. {
  28. Lock();
  29. cWObject * toret = 0;
  30. if (ObjectList.find(GUID) != ObjectList.end())
  31. toret = ObjectList[GUID];
  32. Unlock();
  33. return toret;
  34. }
  35. void cObjectDB::DeleteObject(DWORD GUID)
  36. {
  37. cWObject *tpObj = FindObject(GUID);
  38. Lock();
  39. if (tpObj)
  40. {
  41. delete tpObj;
  42. ObjectList.erase(GUID);
  43. }
  44. Unlock();
  45. }
  46. std::list<cWObject *> * cObjectDB::GetObjectsWithin(cPoint3D Position, float fDistance)
  47. {
  48. Lock();
  49. std::list<cWObject *> *ObjList = new std::list<cWObject *>;
  50. for (std::unordered_map<DWORD, cWObject *>::iterator i = ObjectList.begin(); i != ObjectList.end(); i++)
  51. {
  52. i->second->Lock();
  53. cPoint3D tpPos = i->second->GetPosition();
  54. if ((tpPos == cPoint3D(0,0,0)) ||
  55. (i->second->GetWielder() != 0) ||
  56. ((tpPos - Position).Abs() > fDistance))
  57. {
  58. i->second->Unlock();
  59. continue;
  60. }
  61. i->second->Unlock();
  62. ObjList->push_back(i->second);
  63. }
  64. Unlock();
  65. return ObjList;
  66. }
  67. void cObjectDB::UpdateObjects(float fTimeDiff)
  68. {
  69. Lock();
  70. for (std::unordered_map<DWORD, cWObject *>::iterator i = ObjectList.begin(); i != ObjectList.end(); i++)
  71. {
  72. (*i).second->UpdatePosition(fTimeDiff);
  73. }
  74. Unlock();
  75. }
  76. void cObjectDB::ParsePackContents(cMessage *Msg)
  77. {
  78. Lock();
  79. std::list<DWORD> *NewPack = new std::list<DWORD>();
  80. DWORD pack = Msg->ReadDWORD();
  81. if (m_mPackContents.find(pack) != m_mPackContents.end())
  82. delete m_mPackContents[pack];
  83. int itemCount = Msg->ReadDWORD();
  84. for (int i=0;i<itemCount;i++)
  85. {
  86. DWORD item = Msg->ReadDWORD();
  87. DWORD type = Msg->ReadDWORD();
  88. NewPack->push_back(item);
  89. }
  90. m_mPackContents[pack] = NewPack;
  91. Unlock();
  92. }