Advertisement
charparodar

[Metin2]Pet Pick Up System

Aug 1st, 2017
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.75 KB | None | 0 0
  1. service.h:
  2.         add:
  3.                 #define __PET_PICKUP
  4. PetSystem.h:
  5.         search:
  6.                 void            SetSummonItem (LPITEM pItem);
  7.         add below:
  8.                 #ifdef __PET_PICKUP
  9.                         void            PickUpItems(int range);
  10.                         void            BringItem();
  11.                         void            SetPickup(bool is_pickup) { m_is_pickup = is_pickup; }
  12.                         bool            IsPickup(){ return m_is_pickup; }
  13.                         void            SetPickupItem(LPITEM item) { m_pickup_item = item; }
  14.                         LPITEM          GetPickupItem(){ return m_pickup_item; }
  15.                 #endif
  16.         search:
  17.             LPCHARACTER     m_pkOwner;
  18.         add below:
  19.             #ifdef __PET_PICKUP
  20.             bool            m_is_pickup;
  21.             LPITEM          m_pickup_item;
  22.             #endif
  23.  
  24.  
  25. char.h:
  26.         search:
  27.                 bool            PickupItem(DWORD vid);
  28.         add below:
  29.                 #ifdef __PET_PICKUP
  30.                         bool            PickupItemByPet(DWORD vid);
  31.                        
  32.                 #endif
  33.  
  34.  
  35. char_item.cpp:
  36.         search:
  37.             bool CHARACTER::PickupItem(DWORD dwVID)
  38.  
  39.         add above:
  40.             #ifdef __PET_PICKUP
  41.             bool CHARACTER::PickupItemByPet(DWORD dwVID)
  42.             {
  43.                 LPITEM item = ITEM_MANAGER::instance().FindByVID(dwVID);
  44.                 if (IsObserverMode())
  45.                     return false;
  46.                 if (!item || !item->GetSectree())
  47.                     return false;
  48.                 if (item->IsOwnership(this))
  49.                 {
  50.                     if (item->GetType() == ITEM_ELK)
  51.                     {
  52.                         GiveGold(item->GetCount());
  53.                         item->RemoveFromGround();
  54.  
  55.                         M2_DESTROY_ITEM(item);
  56.                         Save();
  57.                     }
  58.                     else
  59.                     {
  60.                         if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
  61.                         {
  62.                             BYTE bCount = item->GetCount();
  63.  
  64.                             for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  65.                             {
  66.                                 LPITEM item2 = GetInventoryItem(i);
  67.  
  68.                                 if (!item2)
  69.                                     continue;
  70.  
  71.                                 if (item2->GetVnum() == item->GetVnum())
  72.                                 {
  73.                                     int j;
  74.  
  75.                                     for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
  76.                                     if (item2->GetSocket(j) != item->GetSocket(j))
  77.                                         break;
  78.  
  79.                                     if (j != ITEM_SOCKET_MAX_NUM)
  80.                                         continue;
  81.  
  82.                                     BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
  83.                                     bCount -= bCount2;
  84.  
  85.                                     item2->SetCount(item2->GetCount() + bCount2);
  86.  
  87.                                     if (bCount == 0)
  88.                                     {
  89.                                         ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
  90.                                         M2_DESTROY_ITEM(item);
  91.                                         if (item2->GetType() == ITEM_QUEST)
  92.                                             quest::CQuestManager::instance().PickupItem(GetPlayerID(), item2);
  93.                                         return true;
  94.                                     }
  95.                                 }
  96.                             }
  97.  
  98.                             item->SetCount(bCount);
  99.                         }
  100.  
  101.                         int iEmptyCell;
  102.                         if (item->IsDragonSoul())
  103.                         {
  104.                             if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
  105.                             {
  106.                                 sys_log(0, "No empty ds inventory pid %u size
  107. itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
  108.                                 ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇÏ°í ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
  109.                                 return false;
  110.                             }
  111.                         }
  112.                         else
  113.                         {
  114.                             if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
  115.                             {
  116.                                 sys_log(0, "No empty inventory pid %u size
  117. itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
  118.                                 ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇÏ°í ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
  119.                                 return false;
  120.                             }
  121.                         }
  122.  
  123.                         item->RemoveFromGround();
  124.  
  125.                         if (item->IsDragonSoul())
  126.                             item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
  127.                         else
  128.                             item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
  129.  
  130.                         char szHint[32 + 1];
  131.                         snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
  132.                         LogManager::instance().ItemLog(this, item, "GET", szHint);
  133.                         ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item->GetName());
  134.  
  135.                         if (item->GetType() == ITEM_QUEST)
  136.                             quest::CQuestManager::instance().PickupItem(GetPlayerID(), item);
  137.                     }
  138.                     //Motion(MOTION_PICKUP);
  139.                     return true;
  140.                 }
  141.  
  142.                 return false;
  143.             }
  144.             #endif
  145. PetSystem.cpp:
  146.         search:
  147.                 bool CPetActor::Follow(float fMinDistance)
  148.         add above:
  149.                 #ifdef __PET_PICKUP
  150.                 struct PetPickUpItemStruct
  151.                 {
  152.                     CPetActor * pet;
  153.                     int range;
  154.                     PetPickUpItemStruct(CPetActor * p, int r){
  155.  
  156.                         pet = p;
  157.                         range = r;
  158.                     }
  159.                     void operator()(LPENTITY pEnt)
  160.                     {
  161.                         if (!pet->GetOwner() || !pet->GetCharacter())
  162.                             return;
  163.                         if (pet->IsPickup())
  164.                             return;
  165.                         if (pEnt->IsType(ENTITY_ITEM) == true)
  166.                         {
  167.                            
  168.                             LPITEM item = (LPITEM)pEnt;
  169.                             LPCHARACTER player = pet->GetOwner();
  170.                             if (!item->GetSectree() || !item->IsOwnership(player))
  171.                                 return;
  172.  
  173.                             int iDist = DISTANCE_APPROX(item->GetX() - player->GetX(), player->GetY() - player->GetY());
  174.  
  175.                             if (iDist > range)
  176.                                 return;
  177.                             pet->SetPickup(true);
  178.                             pet->SetPickupItem(item);
  179.                         }
  180.  
  181.                     }
  182.                 };
  183.                 void CPetActor::PickUpItems(int range){
  184.                     if (IsPickup())
  185.                         return;
  186.                     long map = m_pkChar->GetMapIndex();
  187.                     PIXEL_POSITION m = m_pkChar->GetXYZ();
  188.                     LPSECTREE tree = SECTREE_MANAGER::instance().Get(map, m.x, m.y);
  189.                     if (!tree)
  190.                     {
  191.                         sys_err("cannot find sectree by %dx%d", m.x, m.y);
  192.                         return;
  193.                     }
  194.                     PetPickUpItemStruct f(this, range);
  195.                     tree->ForEachAround(f);
  196.                 }
  197.  
  198.                 void CPetActor::BringItem(){
  199.                     if (!IsPickup())
  200.                         return;
  201.                     LPITEM item = GetPickupItem();
  202.                     if (!m_pkOwner || !m_pkChar || !item || !item->GetSectree())
  203.                         return;
  204.                    
  205.                     float fMinDistance = 20.0;
  206.                     float fPetX = m_pkChar->GetX();
  207.                     float fPetY = m_pkChar->GetY();
  208.  
  209.                     float itemX = item->GetX();
  210.                     float itemY = item->GetY();
  211.  
  212.                     float fDist = DISTANCE_SQRT(itemX - fPetX, itemY - fPetY);
  213.                     if (fDist <= 250.0)
  214.                     {
  215.                         SetPickup(false);
  216.                         m_pkOwner->PickupItemByPet(item->GetVID());
  217.                         SetPickupItem(NULL);
  218.                         m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0);
  219.                         return;
  220.                     }
  221.                     m_pkChar->SetRotationToXY(itemX, itemY);
  222.                     float fx, fy;
  223.  
  224.                     float fDistToGo = fDist - fMinDistance;
  225.                     GetDeltaByDegree(m_pkChar->GetRotation(), fDistToGo, &fx, &fy);
  226.  
  227.                     if (!m_pkChar->Goto((int)(fPetX + fx + 0.5f), (int)(fPetY + fy + 0.5f)))
  228.                         return;
  229.  
  230.                     m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0);
  231.                 }
  232.                 #endif
  233.  
  234.     search:
  235.         if (this->IsSummoned() && HasOption(EPetOption_Followable))
  236.  
  237.     add above:
  238.             #ifdef __PET_PICKUP
  239.                 if (this->IsSummoned()){
  240.                     this->BringItem();
  241.                     this->PickUpItems(900); // 900 = RANGE
  242.                 }  
  243.             #endif
  244.     search:
  245.         this->SetSummonItem(NULL);
  246.     add below:
  247.         #ifdef __PET_PICKUP
  248.                 this->SetPickupItem(NULL);
  249.                 this->SetPickup(false);
  250.         #endif
  251.  
  252.     search:
  253.         m_dwSummonItemVID = 0;
  254.         m_dwSummonItemVnum = 0;
  255.     add below:
  256.         #ifdef __PET_PICKUP
  257.                 this->SetPickupItem(NULL);
  258.                 this->SetPickup(false);
  259.         #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement