Guest User

Untitled

a guest
Sep 15th, 2024
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.00 KB | None | 0 0
  1. void CItem::ModifyPoints(bool bAdd)
  2. {
  3.     int accessoryGrade;
  4.  
  5.     if (false == IsAccessoryForSocket())
  6.     {
  7.         if (m_pProto->bType == ITEM_WEAPON || m_pProto->bType == ITEM_ARMOR)
  8.         {
  9.             for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  10.             {
  11.                 DWORD dwVnum;
  12.  
  13.                 if ((dwVnum = GetSocket(i)) <= 2)
  14.                     continue;
  15.  
  16.                 TItemTable * p = ITEM_MANAGER::instance().GetTable(dwVnum);
  17.  
  18.                 if (!p)
  19.                 {
  20.                     sys_err("cannot find table by vnum %u", dwVnum);
  21.                     continue;
  22.                 }
  23.  
  24.                 if (ITEM_METIN == p->bType)
  25.                 {
  26.                     for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  27.                     {
  28.                         if (p->aApplies[i].bType == APPLY_NONE)
  29.                             continue;
  30.  
  31.                         if (p->aApplies[i].bType == APPLY_SKILL)
  32.                             m_pOwner->ApplyPoint(p->aApplies[i].bType, bAdd ? p->aApplies[i].lValue : p->aApplies[i].lValue ^ 0x00800000);
  33.                         else
  34.                             m_pOwner->ApplyPoint(p->aApplies[i].bType, bAdd ? p->aApplies[i].lValue : -p->aApplies[i].lValue);
  35.                     }
  36.                 }
  37.             }
  38.         }
  39.  
  40.         accessoryGrade = 0;
  41.     }
  42.     else
  43.     {
  44.         accessoryGrade = MIN(GetAccessorySocketGrade(), ITEM_ACCESSORY_SOCKET_MAX_NUM);
  45.     }
  46.  
  47. #ifdef __SASH_SYSTEM__
  48.     if ((GetType() == ITEM_COSTUME) && (GetSubType() == COSTUME_SASH) && (GetSocket(SASH_ABSORBED_SOCKET)))
  49.     {
  50.         TItemTable * pkItemAbsorbed = ITEM_MANAGER::instance().GetTable(GetSocket(SASH_ABSORBED_SOCKET));
  51.         if (pkItemAbsorbed)
  52.         {
  53.             if ((pkItemAbsorbed->bType == ITEM_ARMOR) && (pkItemAbsorbed->bSubType == ARMOR_BODY))
  54.             {
  55.                 long lDefGrade = pkItemAbsorbed->alValues[1] + long(pkItemAbsorbed->alValues[5] * 2);
  56.                 double dValue = lDefGrade * GetSocket(SASH_ABSORPTION_SOCKET);
  57.                 dValue = (double)dValue / 100;
  58.                 dValue = (double)dValue + .5;
  59.                 lDefGrade = (long) dValue;
  60.                 if ((pkItemAbsorbed->alValues[1] > 0) && (lDefGrade <= 0) || (pkItemAbsorbed->alValues[5] > 0) && (lDefGrade < 1))
  61.                     lDefGrade += 1;
  62.                 else if ((pkItemAbsorbed->alValues[1] > 0) || (pkItemAbsorbed->alValues[5] > 0))
  63.                     lDefGrade += 1;
  64.                
  65.                 m_pOwner->ApplyPoint(APPLY_DEF_GRADE_BONUS, bAdd ? lDefGrade : -lDefGrade);
  66.                
  67.                 long lDefMagicBonus = pkItemAbsorbed->alValues[0];
  68.                 dValue = lDefMagicBonus * GetSocket(SASH_ABSORPTION_SOCKET);
  69.                 dValue = (double)dValue / 100;
  70.                 dValue = (double)dValue + .5;
  71.                 lDefMagicBonus = (long) dValue;
  72.                 if ((pkItemAbsorbed->alValues[0] > 0) && (lDefMagicBonus < 1))
  73.                     lDefMagicBonus += 1;
  74.                 else if (pkItemAbsorbed->alValues[0] > 0)
  75.                     lDefMagicBonus += 1;
  76.                
  77.                 m_pOwner->ApplyPoint(APPLY_MAGIC_DEF_GRADE, bAdd ? lDefMagicBonus : -lDefMagicBonus);
  78.             }
  79.             else if (pkItemAbsorbed->bType == ITEM_WEAPON)
  80.             {
  81.                 long lAttGrade = pkItemAbsorbed->alValues[4] + pkItemAbsorbed->alValues[5];
  82.                 if (pkItemAbsorbed->alValues[3] > pkItemAbsorbed->alValues[4])
  83.                     lAttGrade = pkItemAbsorbed->alValues[3] + pkItemAbsorbed->alValues[5];
  84.                
  85.                 double dValue = lAttGrade * GetSocket(SASH_ABSORPTION_SOCKET);
  86.                 dValue = (double)dValue / 100;
  87.                 dValue = (double)dValue + .5;
  88.                 lAttGrade = (long) dValue;
  89.                 if (((pkItemAbsorbed->alValues[3] > 0) && (lAttGrade < 1)) || ((pkItemAbsorbed->alValues[4] > 0) && (lAttGrade < 1)))
  90.                     lAttGrade += 1;
  91.                 else if ((pkItemAbsorbed->alValues[3] > 0) || (pkItemAbsorbed->alValues[4] > 0))
  92.                     lAttGrade += 1;
  93.                
  94.                 m_pOwner->ApplyPoint(APPLY_ATT_GRADE_BONUS, bAdd ? lAttGrade : -lAttGrade);
  95.                
  96.                 long lAttMagicGrade = pkItemAbsorbed->alValues[2] + pkItemAbsorbed->alValues[5];
  97.                 if (pkItemAbsorbed->alValues[1] > pkItemAbsorbed->alValues[2])
  98.                     lAttMagicGrade = pkItemAbsorbed->alValues[1] + pkItemAbsorbed->alValues[5];
  99.                
  100.                 dValue = lAttMagicGrade * GetSocket(SASH_ABSORPTION_SOCKET);
  101.                 dValue = (double)dValue / 100;
  102.                 dValue = (double)dValue + .5;
  103.                 lAttMagicGrade = (long) dValue;
  104.                 if (((pkItemAbsorbed->alValues[1] > 0) && (lAttMagicGrade < 1)) || ((pkItemAbsorbed->alValues[2] > 0) && (lAttMagicGrade < 1)))
  105.                     lAttMagicGrade += 1;
  106.                 else if ((pkItemAbsorbed->alValues[1] > 0) || (pkItemAbsorbed->alValues[2] > 0))
  107.                     lAttMagicGrade += 1;
  108.                
  109.                 m_pOwner->ApplyPoint(APPLY_MAGIC_ATT_GRADE, bAdd ? lAttMagicGrade : -lAttMagicGrade);
  110.             }
  111.         }
  112.     }
  113. #endif
  114.  
  115.     for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  116.     {
  117. #ifdef __SASH_SYSTEM__
  118.         if ((m_pProto->aApplies[i].bType == APPLY_NONE) && (GetType() != ITEM_COSTUME) && (GetSubType() != COSTUME_SASH))
  119. #else
  120.         if (m_pProto->aApplies[i].bType == APPLY_NONE)
  121. #endif
  122.             continue;
  123.  
  124.         long value = m_pProto->aApplies[i].lValue;
  125.  
  126. #ifdef __SASH_SYSTEM__
  127.         BYTE bType = m_pProto->aApplies[i].bType;
  128.         if ((GetType() == ITEM_COSTUME) && (GetSubType() == COSTUME_SASH))
  129.         {
  130.             TItemTable * pkItemAbsorbed = ITEM_MANAGER::instance().GetTable(GetSocket(SASH_ABSORBED_SOCKET));
  131.             if (pkItemAbsorbed)
  132.             {
  133.                 if (pkItemAbsorbed->aApplies[i].bType == APPLY_NONE)
  134.                     continue;
  135.                
  136.                 bType = pkItemAbsorbed->aApplies[i].bType;
  137.                 value = pkItemAbsorbed->aApplies[i].lValue;
  138.                 if (value < 0)
  139.                     continue;
  140.                
  141.                 double dValue = value * GetSocket(SASH_ABSORPTION_SOCKET);
  142.                 dValue = (double)dValue / 100;
  143.                 dValue = (double)dValue + .5;
  144.                 value = (long) dValue;
  145.                 if ((pkItemAbsorbed->aApplies[i].lValue > 0) && (value <= 0))
  146.                     value += 1;
  147.             }
  148.             else
  149.                 continue;
  150.         }
  151. #endif
  152.        
  153.         if (m_pProto->aApplies[i].bType == APPLY_SKILL)
  154.         {
  155.             m_pOwner->ApplyPoint(m_pProto->aApplies[i].bType, bAdd ? value : value ^ 0x00800000);
  156.         }
  157.         else
  158.         {
  159.             if (0 != accessoryGrade)
  160.                 value += MAX(accessoryGrade, value * aiAccessorySocketEffectivePct[accessoryGrade] / 100);
  161.  
  162.             m_pOwner->ApplyPoint(m_pProto->aApplies[i].bType, bAdd ? value : -value);
  163.         }
  164.     }
  165.     if (true == CItemVnumHelper::IsRamadanMoonRing(GetVnum()) || true == CItemVnumHelper::IsHalloweenCandy(GetVnum())
  166.         || true == CItemVnumHelper::IsHappinessRing(GetVnum()) || true == CItemVnumHelper::IsLovePendant(GetVnum()))
  167.     {
  168.         // Do not anything.
  169.     }
  170.     else
  171.     {
  172.         for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; ++i)
  173.         {
  174.             if (GetAttributeType(i))
  175.             {
  176.                 const TPlayerItemAttribute& ia = GetAttribute(i);
  177.  
  178. #ifdef __SASH_SYSTEM__
  179.                 long sValue = ia.sValue;
  180.                 if ((GetType() == ITEM_COSTUME) && (GetSubType() == COSTUME_SASH))
  181.                 {
  182.                     double dValue = sValue * GetSocket(SASH_ABSORPTION_SOCKET);
  183.                     dValue = (double)dValue / 100;
  184.                     dValue = (double)dValue + .5;
  185.                     sValue = (long) dValue;
  186.                     if ((ia.sValue > 0) && (sValue <= 0))
  187.                         sValue += 1;
  188.                 }
  189. #endif
  190.  
  191.                 if (ia.bType == APPLY_SKILL)
  192.                     m_pOwner->ApplyPoint(ia.bType, bAdd ? ia.sValue : ia.sValue ^ 0x00800000);
  193.                 else
  194.                     m_pOwner->ApplyPoint(ia.bType, bAdd ? ia.sValue : -ia.sValue);
  195.             }
  196.         }
  197.     }
  198.  
  199.     switch (m_pProto->bType)
  200.     {
  201.         case ITEM_PICK:
  202.         case ITEM_ROD:
  203.             {
  204.                 if (bAdd)
  205.                 {
  206.                     if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON)
  207.                         m_pOwner->SetPart(PART_WEAPON, GetVnum());
  208.                 }
  209.                 else
  210.                 {
  211.                     if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON)
  212. #ifdef __WEAPON_COSTUME_SYSTEM__
  213.                         m_pOwner->SetPart(PART_WEAPON, 0);
  214. #else
  215.                         m_pOwner->SetPart(PART_WEAPON, m_pOwner->GetOriginalPart(PART_WEAPON));
  216. #endif
  217.                 }
  218.             }
  219.             break;
  220.  
  221.         case ITEM_WEAPON:
  222.             {
  223. #ifdef __WEAPON_COSTUME_SYSTEM__
  224.                 if (m_pOwner->GetWear(WEAR_COSTUME_WEAPON) != 0)
  225.                     break;
  226. #endif
  227.                 if (bAdd)
  228.                 {
  229.                     if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON)
  230.                         m_pOwner->SetPart(PART_WEAPON, GetVnum());
  231.                 }
  232.                 else
  233.                 {
  234.                     if (m_wCell == INVENTORY_MAX_NUM + WEAR_WEAPON)
  235. #ifdef __WEAPON_COSTUME_SYSTEM__
  236.                         m_pOwner->SetPart(PART_WEAPON, 0);
  237. #else
  238.                         m_pOwner->SetPart(PART_WEAPON, m_pOwner->GetOriginalPart(PART_WEAPON));
  239. #endif
  240.                 }
  241.             }
  242.             break;
  243.  
  244.         case ITEM_ARMOR:
  245.             {
  246.                 if (0 != m_pOwner->GetWear(WEAR_COSTUME_BODY))
  247.                     break;
  248.  
  249.                 if (GetSubType() == ARMOR_BODY || GetSubType() == ARMOR_HEAD || GetSubType() == ARMOR_FOOTS || GetSubType() == ARMOR_SHIELD)
  250.                 {
  251.                     if (bAdd)
  252.                     {
  253.                         if (GetProto()->bSubType == ARMOR_BODY)
  254.                             m_pOwner->SetPart(PART_MAIN, GetVnum());
  255.                     }
  256.                     else
  257.                     {
  258.                         if (GetProto()->bSubType == ARMOR_BODY)
  259.                             m_pOwner->SetPart(PART_MAIN, m_pOwner->GetOriginalPart(PART_MAIN));
  260.                     }
  261.                 }
  262.             }
  263.             break;
  264.  
  265.         case ITEM_COSTUME:
  266.             {
  267.                 DWORD toSetValue = this->GetVnum();
  268.                 EParts toSetPart = PART_MAX_NUM;
  269.  
  270.                 if (GetSubType() == COSTUME_BODY)
  271.                 {
  272.                     toSetPart = PART_MAIN;
  273.  
  274.                     if (false == bAdd)
  275.                     {
  276.                         const CItem* pArmor = m_pOwner->GetWear(WEAR_BODY);
  277.                         toSetValue = (NULL != pArmor) ? pArmor->GetVnum() : m_pOwner->GetOriginalPart(PART_MAIN);                      
  278.                     }
  279.                    
  280.                 }
  281. #ifdef __WEAPON_COSTUME_SYSTEM__
  282.                 else if (GetSubType() == COSTUME_WEAPON)
  283.                 {
  284.                     toSetPart = PART_WEAPON;
  285.                     if (!bAdd)
  286.                     {
  287.                         const CItem* pWeapon = m_pOwner->GetWear(WEAR_WEAPON);
  288.                         toSetValue = (NULL != pWeapon) ? pWeapon->GetVnum() : m_pOwner->GetPart(PART_WEAPON);                      
  289.                     }
  290.                 }
  291. #endif
  292.  
  293.                 else if (GetSubType() == COSTUME_HAIR)
  294.                 {
  295.                     toSetPart = PART_HAIR;
  296.  
  297.                     toSetValue = (true == bAdd) ? this->GetValue(3) : 0;
  298.                 }
  299.  
  300. #ifdef __SASH_SYSTEM__
  301.                 else if (GetSubType() == COSTUME_SASH)
  302.                 {
  303.                     toSetValue -= 85000;
  304.                     if (GetSocket(SASH_ABSORPTION_SOCKET) >= SASH_EFFECT_FROM_ABS)
  305.                         toSetValue += 1000;
  306.                    
  307.                     toSetValue = (bAdd == true) ? toSetValue : 0;
  308.                     toSetPart = PART_SASH;
  309.                 }
  310. #endif
  311.                
  312.                 if (PART_MAX_NUM != toSetPart)
  313.                 {
  314.                     m_pOwner->SetPart((BYTE)toSetPart, toSetValue);
  315.                     m_pOwner->UpdatePacket();
  316.                 }
  317.             }
  318.             break;
  319.         case ITEM_UNIQUE:
  320.             {
  321.                 if (0 != GetSIGVnum())
  322.                 {
  323.                     const CSpecialItemGroup* pItemGroup = ITEM_MANAGER::instance().GetSpecialItemGroup(GetSIGVnum());
  324.                     if (NULL == pItemGroup)
  325.                         break;
  326.                     DWORD dwAttrVnum = pItemGroup->GetAttrVnum(GetVnum());
  327.                     const CSpecialAttrGroup* pAttrGroup = ITEM_MANAGER::instance().GetSpecialAttrGroup(dwAttrVnum);
  328.                     if (NULL == pAttrGroup)
  329.                         break;
  330.                     for (itertype (pAttrGroup->m_vecAttrs) it = pAttrGroup->m_vecAttrs.begin(); it != pAttrGroup->m_vecAttrs.end(); it++)
  331.                     {
  332.                         m_pOwner->ApplyPoint(it->apply_type, bAdd ? it->apply_value : -it->apply_value);
  333.                     }
  334.                 }
  335.             }
  336.             break;
  337.     }
  338. }
Advertisement
Add Comment
Please, Sign In to add comment