1. void CHARACTER::AddClMaterial(TItemPos tPos, BYTE bPos)
  2. {
  3. if (!isChangeLookOpened())
  4. return;
  5. else if (bPos >= CL_WINDOW_MAX_MATERIALS)
  6. {
  7. if (bPos != 255)
  8. return;
  9. LPITEM pkScroll = GetItem(tPos);
  10. if (!pkScroll)
  11. return;
  12. //@fixme
  13. if (pkScroll->GetVnum() == CL_SCROLL_VNUM)
  14. bPos = 2;
  15. else
  16. bPos = CheckClEmptyMaterialSlot();
  17. //@fixme
  18. if (bPos >= CL_WINDOW_MAX_MATERIALS)
  19. return;
  20. }
  21. LPITEM pkItem = GetItem(tPos);
  22. if (!pkItem)
  23. return;
  24. if ((pkItem->GetCell() >= INVENTORY_MAX_NUM) || (tPos.IsBeltInventoryPosition()))
  25. return;
  26. if (pkItem->IsEquipped())
  27. {
  28. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] You cannot transmute an item while it is equipped."));
  29. return;
  30. }
  31. if ((bPos == 2 && pkItem->GetVnum() != CL_SCROLL_VNUM) || bPos != 2 && pkItem->GetVnum() == CL_SCROLL_VNUM)
  32. {
  33. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] This item cannot be transmuted."));
  34. return;
  35. }
  36. if (pkItem->GetVnum() != CL_SCROLL_VNUM)
  37. {
  38. if ((pkItem->GetType() != ITEM_WEAPON) && (pkItem->GetType() != ITEM_ARMOR) && (pkItem->GetType() != ITEM_COSTUME) && (pkItem->GetType() != ITEM_UNIQUE) && (!pkItem->IsPetItem()))
  39. {
  40. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] This item cannot be transmuted."));
  41. return;
  42. }
  43. #ifdef __QUIVER_SYSTEM__
  44. else if ((pkItem->GetType() == ITEM_WEAPON) && ((pkItem->GetSubType() == WEAPON_ARROW) || (pkItem->GetSubType() == WEAPON_MOUNT_SPEAR) || (pkItem->GetSubType() == WEAPON_QUIVER)))
  45. #else
  46. else if ((pkItem->GetType() == ITEM_WEAPON) && ((pkItem->GetSubType() == WEAPON_ARROW) || (pkItem->GetSubType() == WEAPON_MOUNT_SPEAR)))
  47. #endif
  48. {
  49. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] This item cannot be transmuted."));
  50. return;
  51. }
  52. else if ((pkItem->GetType() == ITEM_ARMOR) && (pkItem->GetSubType() != ARMOR_BODY))
  53. {
  54. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] This item cannot be transmuted."));
  55. return;
  56. }
  57. else if ((pkItem->GetType() == ITEM_COSTUME) && (pkItem->GetSubType() != COSTUME_BODY) && (pkItem->GetSubType() != COSTUME_HAIR) && (pkItem->GetSubType() != COSTUME_WEAPON))
  58. {
  59. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] This item cannot be transmuted."));
  60. return;
  61. }
  62. else if ((pkItem->GetType() == ITEM_UNIQUE) && (pkItem->GetSubType() != USE_MOUNT))
  63. {
  64. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] This item cannot be transmuted."));
  65. return;
  66. }
  67. #ifdef __ENABLE_SOULBIND_SYSTEM__
  68. else if ((pkItem->IsSealed()))
  69. {
  70. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] You can't add binded items."));
  71. return;
  72. }
  73. #endif
  74. else if (pkItem->IsBasicItem())
  75. {
  76. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_IS_BASIC_CANNOT_DO"));
  77. return;
  78. }
  79. else if (pkItem->GetTransmutation() != 0)
  80. {
  81. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] You can't add items which are transmuted yet."));
  82. return;
  83. }
  84. }
  85. LPITEM * pkItemMaterial;
  86. pkItemMaterial = GetClWindowMaterials();
  87. if ((bPos == 1) && (!pkItemMaterial[0]))
  88. return;
  89. if (pkItemMaterial[bPos])
  90. return;
  91. if (bPos == 1)
  92. {
  93. bool bStop = false;
  94. if ((pkItem->GetType() != pkItemMaterial[0]->GetType()))
  95. {
  96. if ((pkItem->GetType() == ITEM_COSTUME && pkItem->GetSubType() == COSTUME_BODY) && (pkItemMaterial[0]->GetType() == ITEM_ARMOR && pkItemMaterial[0]->GetSubType() == ARMOR_BODY))
  97. bStop = false;
  98. else if ((pkItem->GetType() == ITEM_COSTUME && pkItem->GetSubType() == COSTUME_WEAPON) && (pkItemMaterial[0]->GetType() == ITEM_WEAPON))
  99. bStop = false;
  100. else if ((pkItem->GetType() == ITEM_COSTUME && pkItem->GetSubType() == COSTUME_BODY) && (pkItemMaterial[0]->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetSubType() == COSTUME_BODY))
  101. bStop = false;
  102. else if ((pkItem->GetType() == ITEM_COSTUME && pkItem->GetSubType() == COSTUME_HAIR) && (pkItemMaterial[0]->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetSubType() == COSTUME_HAIR))
  103. bStop = false;
  104. else if ((pkItem->GetType() == ITEM_COSTUME && pkItem->GetSubType() == COSTUME_WEAPON) && (pkItemMaterial[0]->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetSubType() == COSTUME_WEAPON))
  105. bStop = false;
  106. else if ((pkItem->GetType() == ITEM_ARMOR && pkItem->GetSubType() == ARMOR_BODY) && (pkItemMaterial[0]->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetSubType() == COSTUME_BODY))
  107. bStop = false;
  108. else if ((pkItem->GetType() == ITEM_WEAPON) && (pkItemMaterial[0]->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetSubType() == COSTUME_WEAPON))
  109. bStop = false;
  110. else if ((pkItem->GetType() == ITEM_UNIQUE) && (pkItem->GetSubType() == USE_MOUNT) && pkItemMaterial[0]->GetType() == ITEM_UNIQUE && pkItemMaterial[0]->GetSubType() == USE_MOUNT)
  111. bStop = false;
  112. else if ((pkItem->IsPetItem()) && pkItemMaterial[0]->IsPetItem())
  113. bStop = false;
  114. else
  115. bStop = true;
  116. }
  117. else
  118. {
  119. if (pkItemMaterial[0]->GetType() != pkItem->GetType())
  120. bStop = true;
  121. else if (pkItemMaterial[0]->GetSubType() != pkItem->GetSubType())
  122. bStop = true;
  123. }
  124. if (pkItemMaterial[0]->GetOriginalVnum() == pkItem->GetOriginalVnum())
  125. bStop = true;
  126. else if (((IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_FEMALE)) && (!IS_SET(pkItem->GetAntiFlag(), ITEM_ANTIFLAG_FEMALE))) || ((IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_MALE)) && (!IS_SET(pkItem->GetAntiFlag(), ITEM_ANTIFLAG_MALE))))
  127. bStop = true;
  128. else if ((pkItem->GetAntiFlag() & ITEM_ANTIFLAG_WARRIOR) && (!IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_WARRIOR)))
  129. bStop = true;
  130. else if ((pkItem->GetAntiFlag() & ITEM_ANTIFLAG_ASSASSIN) && (!IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_ASSASSIN)))
  131. bStop = true;
  132. else if ((pkItem->GetAntiFlag() & ITEM_ANTIFLAG_SHAMAN) && (!IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_SHAMAN)))
  133. bStop = true;
  134. else if ((pkItem->GetAntiFlag() & ITEM_ANTIFLAG_SURA) && (!IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_SURA)))
  135. bStop = true;
  136. else if ((pkItem->GetAntiFlag() & ITEM_ANTIFLAG_WOLFMAN) && (!IS_SET(pkItemMaterial[0]->GetAntiFlag(), ITEM_ANTIFLAG_WOLFMAN)))
  137. bStop = true;
  138. else if ((pkItem->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetType() == ITEM_COSTUME) && ((pkItem->GetType() == ITEM_COSTUME && pkItem->GetSubType() == COSTUME_WEAPON) && (pkItemMaterial[0]->GetType() == ITEM_COSTUME && pkItemMaterial[0]->GetSubType() == COSTUME_WEAPON)))
  139. if (pkItem->GetValue(3) != pkItemMaterial[0]->GetValue(3))
  140. bStop = true;
  141. if (bStop)
  142. {
  143. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[Transmutation] You cannot submit this item."));
  144. return;
  145. }
  146. }
  147. pkItemMaterial[bPos] = pkItem;
  148. pkItemMaterial[bPos]->Lock(true);
  149. TPacketChangeLook sPacket;
  150. sPacket.header = HEADER_GC_CL;
  151. sPacket.subheader = CL_SUBHEADER_ADD;
  152. sPacket.dwCost = 0;
  153. sPacket.bPos = bPos;
  154. sPacket.tPos = tPos;
  155. GetDesc()->Packet(&sPacket, sizeof(TPacketChangeLook));
  156. }