Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Отвергнутые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=50)
-   -   [patch] Mysterious Egg (item 39878) (http://mangos.ytdb.ru/showthread.php?t=1601)

KiriX 26.06.2010 15:51

[patch] Mysterious Egg (item 39878)
 
Итем спустя 7 дней пропадает, но новый не появляется.
Должно работать так. Покупаем Таинственное яйцо, через 7 дней оно превращается в Треснутое яйцо у которого есть интересный лут.
Патч реализует работу данного итема.
PHP код:

diff --git a/src/game/Item.cpp b/src/game/Item.cpp 
index e94bdf3
..b5a7655 100644 
--- a/src/game/Item.cpp 
+++ b/src/game/Item.cpp 
@@ -282,+282,19 @@ void Item::UpdateDuration(Playerowneruint32 diff
  
     if (
GetUInt32Value(ITEM_FIELD_DURATION)<=diff
     { 
+        if (
GetEntry() == 39878
+        { 
+            
owner->DestroyItem(GetBagSlot(), GetSlot(), true); 
+            
uint32 itemId 39883
+            
uint8 count 1
+            
ItemPosCountVec dest
+            if(
owner->CanStoreNewItem(NULL_BAGNULL_SLOTdestitemIdcount) == EQUIP_ERR_OK
+            { 
+                
Itemitem owner->StoreNewItem(destitemIdtrueItem::GenerateItemRandomPropertyId(itemId)); 
+                
owner->SendNewItem(itemcounttruefalse); 
+            } 
+            return; 
+        } 
         
owner->DestroyItem(GetBagSlot(), GetSlot(), true); 
         return; 
     } 

Спасибо LordJZ за подсказку по коду! ;)

LordJZ 26.06.2010 16:20

Может лучше так
PHP код:

diff
  
     if (
GetUInt32Value(ITEM_FIELD_DURATION)<=diff
     { 
         
owner->DestroyItem(GetBagSlot(), GetSlot(), true); 
+        if (
GetEntry() == 39878
+        { 
+            
uint32 itemId 39883
+            
uint8 count 1
+            
ItemPosCountVec dest
+            if(
owner->CanStoreNewItem(NULL_BAGNULL_SLOTdestitemIdcount) == EQUIP_ERR_OK
+            { 
+                
Itemitem owner->StoreNewItem(destitemIdtrueItem::GenerateItemRandomPropertyId(itemId)); 
+                
owner->SendNewItem(itemcounttruefalse); 
+            } 
+        } 
         return; 
     } 

Или может стоит создать для этого отдельную таблицу?

KiriX 26.06.2010 16:24

Цитата:

Сообщение от LordJZ (Сообщение 9654)
Может лучше так
PHP код:

*** 

Или может стоит создать для этого отдельную таблицу?

А разве после дестроя мы не потеряем GetEntry()? Я исходил из этого когда писал. Таблица? А много ли таких вещей?

LordJZ 26.06.2010 16:43

Может и потеряем, не знаю.

Ну item entry все-равно не примут в код...

NeatElves 26.06.2010 17:04

Вот с таблицей..)
http://getmangos.com/community/showt...ration-expires

Viste 26.06.2010 20:45

таких вещей всего две, думаю таблица незачем

xex 28.06.2010 04:38

Мой старый код. Работает с полгода, всё нормально.
PHP код:

    if (GetUInt32Value(ITEM_FIELD_DURATION) <= diff)
    {
        
uint8 bagSlot GetBagSlot();
        
uint8 slot GetSlot();
        
uint32 ItemId GetProto()->ItemId;

        
owner->DestroyItem(bagSlotslottrue);

        
// Mysterious Egg (39878) & Disgusting Jar (44717)
        
if (ItemId == 39878 || ItemId == 44717)
        {
            
// Cracked Egg (39883) & Ripe Disgusting Jar (44718)
            
uint32 newItemId = (ItemId == 39878) ? 39883 44718;

            
// first try store new item instead of deleted
            
ItemPosCountVec dest;
            
uint8 msg owner->CanStoreNewItem(bagSlotslotdestnewItemId1);
            if (
msg == EQUIP_ERR_OK)
            {
                
owner->StoreNewItem(destnewItemId1true);
            }
            else
            {
                
// try store new item in any slot
                
if (ItempItem owner->StoreNewItemInInventorySlot(newItemId1))
                    
owner->SendNewItem(pItem1truefalse);
                
// on any case... send error
                
else
                    
owner->SendEquipError(msgNULLNULL);
            }
        }
        return;
    } 


KiriX 28.06.2010 10:20

Ради двух итемов действительно таблица ни к чему.
xex, спасибо, значит после дестроя итема мы не теряем его ид? Хорошо...

xex 28.06.2010 15:10

Здесь он сначала запоминается:
uint32 ItemId = GetProto()->ItemId;

а потом уже удаляется айтем:
owner->DestroyItem(bagSlot, slot, true);

И удаляется он только из сумки. Мы же в Item объекте находимся =)
Текущий объект будет удалён на следующем тике обновления.

Можно и так написать:
owner->DestroyItem(bagSlot, slot, true);

if (GetProto()->ItemId == 39878 || GetProto()->ItemId == 44717)

но предпочитаю сначала переменные обозначать.

NeatElves 13.05.2011 18:48

Вот вам еще цепочки по году в реале.))

44623-44625-44627
44632-44626-44629

xex 15.05.2011 00:36

Цитата:

Сообщение от NeatElves (Сообщение 22340)
Вот вам еще цепочки по году в реале.))

44623-44625-44627
44632-44626-44629

Спасибо, пофиксено:
PHP код:

--- Item.cpp
+++ Item.cpp
@@ -275,15 +275,20 @@
 {
     if (!
GetUInt32Value(ITEM_FIELD_DURATION))
         return;

     
//DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff);

-    if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff)
+    if (
GetUInt32Value(ITEM_FIELD_DURATION) <= diff)
     {
-        
owner->DestroyItem(GetBagSlot(), GetSlot(), true);
+        
uint32 itemId GetEntry();
+        
uint8 bagSlot GetBagSlot();
+        
uint8 slot GetSlot();
+        
uint16 pos GetPos();
+        
owner->DestroyItem(bagSlotslottrue);
+        
owner->HandleDestroyItemReplace(itemIdbagSlotslotpos);
         return;
     }

     
SetUInt32Value(ITEM_FIELD_DURATIONGetUInt32Value(ITEM_FIELD_DURATION) - diff);
     
SetState(ITEM_CHANGEDowner);                          // save new time in database
 
}

--- 
Player.cpp
+++ Player.cpp
@@ -11539,12 +11539,69 @@
         
pItem->SetGuidValue(ITEM_FIELD_CONTAINEDObjectGuid());
         
pItem->SetSlotNULL_SLOT );
         
pItem->SetState(ITEM_REMOVEDthis);
     }
 }

+
void Player::HandleDestroyItemReplace(uint32 itemIduint8 baguint8 slotuint16 pos)
+{
+    if (!
itemId || !bag || !slot)
+        return;
+
+    
uint32 newItemId;
+    switch(
itemId)
+    {
+        case 
39878:             // Mysterious Unhatched Egg
+            newItemId 39883;  // Cracked Egg
+            break;
+        case 
44623:             // Bottle of Dalaran Red
+            newItemId 44625;
+            break;
+        case 
44625:             // Bottle of Aged Dalaran Red
+            newItemId 44627;  // Bottle of Peaked Dalaran Red
+            break;
+        case 
44626:             // Cask of Aged Dalaran Red
+            newItemId 44629;  // Cask of Peaked Dalaran Red
+            break;
+        case 
44632:             // Cask of Dalaran Red
+            newItemId 44626;
+            break;
+        case 
44717:             // Disgusting Jar
+            newItemId 44718;  // Ripe Disgusting Jar
+            break;
+        default:
+            return;
+    }
+
+    
ItemPosCountVec dest;
+    if (
IsInventoryPos(pos))
+    {
+        
uint8 msg CanStoreNewItem(bagslotdestnewItemId1);
+        if (
msg == EQUIP_ERR_OK)
+        {
+            
StoreNewItem(destnewItemId1true);
+            return;
+        }
+    }
+    else if (
IsBankPos(pos))
+    {
+        
ItempNewItem Item::CreateItem(newItemId1this);
+        if (!
pNewItem)
+            return;
+
+        
uint8 msg CanBankItem(bagslotdestpNewItemtrue);
+        if (
msg == EQUIP_ERR_OK)
+        {
+            
BankItem(destpNewItemtrue);
+            return;
+        }
+        else
+            
delete pNewItem;
+    }
+}
+
 
void Player::DestroyItemCountuint32 itemuint32 countbool updatebool unequip_check)
 {
     
DEBUG_LOG"STORAGE: DestroyItemCount item = %u, count = %u"itemcount);
     
uint32 remcount 0;

     
// in inventory

--- Player.h
+++ Player.h
@@ -1258,12 +1258,13 @@
         
void MoveItemFromInventory(uint8 baguint8 slotbool update);
                                                             
// in trade, auction, guild bank, mail....
         
void MoveItemToInventory(ItemPosCountVec const& destItempItembool updatebool in_characterInventoryDB false);
                                                             
// in trade, guild bank, mail....
         
void RemoveItemDependentAurasAndCastsItem pItem );
         
void DestroyItemuint8 baguint8 slotbool update );
+        
void HandleDestroyItemReplace(uint32 itemIduint8 baguint8 slotuint16 pos);
         
void DestroyItemCountuint32 itemuint32 countbool updatebool unequip_check false);
         
void DestroyItemCountItemitemuint32countbool update );
         
void DestroyConjuredItemsbool update );
         
void DestroyZoneLimitedItembool updateuint32 new_zone );
         
void SplitItemuint16 srcuint16 dstuint32 count );
         
void SwapItemuint16 srcuint16 dst ); 


Vladimir 18.06.2011 05:09

https://gist.github.com/1032722 обновленная версия с использованием существующего кода аналогичной таблицы. Не тестировал еще.

Если все нормально добавлю вечером.

Vladimir 18.06.2011 20:16

Патч в форме приведенной в прев. посте добавлен в [11646]


Текущее время: 18:40. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS