Clone of PhatAC @ https://github.com/floaterxk/PhatAC

Container.cpp 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #include "StdAfx.h"
  2. #include "PhysicsObj.h"
  3. #include "Item.h"
  4. #include "World.h"
  5. void CPhysicsObj::Container_Init()
  6. {
  7. m_cMaxEquipment = -1;
  8. m_cMaxInventory = -1;
  9. m_cMaxContainers = -1;
  10. m_pEquipment = NULL;
  11. m_pInventory = NULL;
  12. m_pContainers = NULL;
  13. m_cInventoryCount = -1;
  14. m_cContainerCount = -1;
  15. }
  16. void CPhysicsObj::Container_InitContents(char MaxEquipment, char MaxInventory, char MaxContainers)
  17. {
  18. m_cMaxEquipment = MaxEquipment;
  19. m_cMaxInventory = MaxInventory;
  20. m_cMaxContainers = MaxContainers;
  21. m_pEquipment = new CBaseItem*[m_cMaxEquipment];
  22. m_pInventory = new CBaseItem*[m_cMaxInventory];
  23. m_pContainers = new CBaseItem*[m_cMaxContainers];
  24. memset(m_pEquipment, 0, sizeof(CBaseItem*) * m_cMaxEquipment);
  25. memset(m_pInventory, 0, sizeof(CBaseItem*) * m_cMaxInventory);
  26. memset(m_pContainers, 0, sizeof(CBaseItem*) * m_cMaxContainers);
  27. m_cInventoryCount = 0;
  28. m_cContainerCount = 0;
  29. }
  30. BOOL CPhysicsObj::Container_HasContents()
  31. {
  32. if (m_cMaxEquipment > 0 ||
  33. m_cMaxInventory > 0 ||
  34. m_cMaxContainers > 0) return TRUE;
  35. return FALSE;
  36. }
  37. DWORD CPhysicsObj::Container_GetWeaponID()
  38. {
  39. if (m_pEquipment && m_cMaxEquipment >= 32)
  40. {
  41. //24 = 0x01
  42. //25 = 0x02
  43. //26 = 0x04
  44. //27 = 0x08
  45. //28 = 0x10
  46. //29 = 0x20
  47. //30 = 0x40
  48. //31 = 0x80
  49. if (m_pEquipment[24]) return m_pEquipment[24]->m_dwGUID; //Magic Weapon
  50. if (m_pEquipment[22]) return m_pEquipment[22]->m_dwGUID; //Missile Weapon
  51. if (m_pEquipment[20]) return m_pEquipment[20]->m_dwGUID; //Melee Weapon
  52. }
  53. return 0;
  54. }
  55. CPhysicsObj* CPhysicsObj::Container_FindContainer(DWORD dwContainer)
  56. {
  57. if (m_dwGUID == dwContainer)
  58. return this;
  59. for (unsigned char i = 0; i < m_cContainerCount; i++)
  60. {
  61. if (m_pContainers[i]->m_dwGUID == dwContainer)
  62. return m_pContainers[i];
  63. }
  64. return NULL;
  65. }
  66. void CPhysicsObj::Container_GetEquippedArmor(ItemVector *pVector)
  67. {
  68. if (!m_pEquipment)
  69. return;
  70. for (char index = 0; index < m_cMaxEquipment; index++)
  71. {
  72. CBaseItem* pItem = m_pEquipment[index];
  73. if (!pItem)
  74. continue;
  75. if (pItem->m_ItemType & (TYPE_ARMOR | TYPE_CLOTHING))
  76. pVector->push_back(pItem);
  77. }
  78. }
  79. void CPhysicsObj::Container_GetWieldedItems(ItemVector *pVector)
  80. {
  81. if (!m_pEquipment)
  82. return;
  83. for (char index = 0; index < m_cMaxEquipment; index++)
  84. {
  85. CBaseItem* pItem = m_pEquipment[index];
  86. if (!pItem)
  87. continue;
  88. if (pItem->IsWielded())
  89. pVector->push_back(pItem);
  90. }
  91. }
  92. void CPhysicsObj::Container_ReleaseItem(CBaseItem* pItem, BOOL bDirect)
  93. {
  94. if (!pItem)
  95. return;
  96. for (int i = 0; i < m_cMaxEquipment; i++)
  97. {
  98. if (m_pEquipment[i] == pItem)
  99. m_pEquipment[i] = NULL;
  100. }
  101. for (int i = 0; i < m_cInventoryCount; i++)
  102. {
  103. if (m_pInventory[i] == pItem)
  104. {
  105. m_cInventoryCount--;
  106. for (int j = i; j < m_cInventoryCount; j++)
  107. m_pInventory[j] = m_pInventory[j + 1];
  108. i--;
  109. }
  110. }
  111. for (int i = 0; i < m_cContainerCount; i++)
  112. {
  113. if (m_pContainers[i] == pItem)
  114. {
  115. m_cContainerCount--;
  116. for (int j = i; j < m_cContainerCount; j++)
  117. m_pContainers[j] = m_pContainers[j + 1];
  118. i--;
  119. }
  120. else
  121. {
  122. if (!bDirect)
  123. m_pContainers[i]->Container_ReleaseItem(pItem, FALSE);
  124. }
  125. }
  126. }
  127. BOOL CPhysicsObj::Container_CanEquip(CBaseItem* pItem, DWORD dwCoverage)
  128. {
  129. if (!m_pEquipment)
  130. return FALSE;
  131. if (!pItem)
  132. return FALSE;
  133. if (pItem->GetCoverage1() != dwCoverage)
  134. LOG(Temp, Normal, "Debug: GC1()==%08X and C==%08X\n", pItem->GetCoverage1(), dwCoverage);
  135. char index = 0;
  136. while (index < (sizeof(dwCoverage) << 3))
  137. {
  138. if ((dwCoverage >> index) & 1)
  139. {
  140. //It will need this slot.
  141. //The slot is out of range!
  142. if (index >= m_cMaxEquipment)
  143. return FALSE;
  144. //The slot is already in use!
  145. if (m_pEquipment[index] != NULL)
  146. return FALSE;
  147. }
  148. index++;
  149. }
  150. return TRUE;
  151. }
  152. void CPhysicsObj::Container_EquipItem(DWORD dwCell, CBaseItem* pItem, DWORD dwCoverage)
  153. {
  154. for (char index = 0; index < m_cMaxEquipment; index++)
  155. {
  156. if (dwCoverage & 1)
  157. m_pEquipment[index] = pItem;
  158. dwCoverage = dwCoverage >> 1;
  159. }
  160. if (!(pItem->m_ItemType & (TYPE_ARMOR | TYPE_CLOTHING)))
  161. {
  162. BinaryWriter Blah;
  163. Blah.WriteDWORD(0xF749);
  164. Blah.WriteDWORD(m_dwGUID);
  165. Blah.WriteDWORD(pItem->m_dwGUID);
  166. Blah.WriteDWORD(1);
  167. Blah.WriteDWORD(1);
  168. Blah.WriteWORD(m_wInstance);
  169. Blah.WriteWORD(++pItem->m_wNumMovements);
  170. g_pWorld->BroadcastPVS(dwCell, Blah.GetData(), Blah.GetSize());
  171. }
  172. }
  173. CBaseItem* CPhysicsObj::Container_FindItem(DWORD dwEID)
  174. {
  175. for (char i = 0; i < m_cMaxEquipment; i++)
  176. {
  177. CBaseItem* pItem = m_pEquipment[i];
  178. if (pItem)
  179. {
  180. if (pItem->m_dwGUID == dwEID)
  181. return m_pEquipment[i];
  182. }
  183. }
  184. for (char i = 0; i < m_cInventoryCount; i++)
  185. {
  186. if (m_pInventory[i]->m_dwGUID == dwEID)
  187. return m_pInventory[i];
  188. }
  189. for (char i = 0; i < m_cContainerCount; i++)
  190. {
  191. if (m_pContainers[i]->m_dwGUID == dwEID)
  192. return m_pContainers[i];
  193. CBaseItem *pItem;
  194. if (pItem = m_pContainers[i]->Container_FindItem(dwEID))
  195. return pItem;
  196. }
  197. return NULL;
  198. }
  199. BOOL CPhysicsObj::Container_CanStore(CBaseItem* pItem)
  200. {
  201. DWORD dwSlot = pItem->GetSlotType();
  202. switch (dwSlot)
  203. {
  204. case 0:
  205. if (m_cInventoryCount >= m_cMaxInventory)
  206. {
  207. for (char i = 0; i < m_cInventoryCount; i++)
  208. {
  209. if (m_pInventory[i] == pItem)
  210. return TRUE;
  211. }
  212. return FALSE;
  213. }
  214. return TRUE;
  215. case 1:
  216. if (m_cContainerCount >= m_cMaxContainers)
  217. {
  218. for (char i = 0; i < m_cContainerCount; i++)
  219. {
  220. if (m_pContainers[i] == pItem)
  221. return TRUE;
  222. }
  223. return FALSE;
  224. }
  225. return TRUE;
  226. case 2:
  227. //Should check if player already has this foci!
  228. return TRUE;
  229. default:
  230. return FALSE;
  231. }
  232. }
  233. char CPhysicsObj::Container_InsertInventoryItem(DWORD dwCell, CBaseItem* pItem, char cSlot)
  234. {
  235. // You should check if the inventory is full before calling this.
  236. if (cSlot >= m_cInventoryCount)
  237. cSlot = m_cInventoryCount;
  238. else
  239. {
  240. for (unsigned char i = m_cInventoryCount; i > cSlot; i--)
  241. {
  242. CBaseItem *pSlideItem = m_pInventory[i - 1];
  243. m_pInventory[i] = pSlideItem;
  244. }
  245. }
  246. m_pInventory[cSlot] = pItem;
  247. m_cInventoryCount++;
  248. pItem->m_wNumMovements++;
  249. BinaryWriter Blah;
  250. Blah.WriteDWORD(0xF74A);
  251. Blah.WriteDWORD(pItem->m_dwGUID);
  252. Blah.WriteWORD(pItem->m_wInstance);
  253. Blah.WriteWORD(pItem->m_wNumMovements);
  254. g_pWorld->BroadcastPVS(dwCell, Blah.GetData(), Blah.GetSize());
  255. return cSlot;
  256. }
  257. void CPhysicsObj::Container_Shutdown()
  258. {
  259. SafeDeleteArray(m_pEquipment);
  260. SafeDeleteArray(m_pInventory);
  261. SafeDeleteArray(m_pContainers);
  262. }