Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Отвергнутые патчи

Важная информация

Отвергнутые патчи Патчи, отвергнутые от приёма в GIT

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.06.2010, 15:51   #1
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию [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 за подсказку по коду!
KiriX вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
Ranger (18.05.2011), Viste (17.11.2019), Vladimir (18.06.2011)
Старый 26.06.2010, 16:20   #2
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Может лучше так
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; 
     } 
Или может стоит создать для этого отдельную таблицу?
LordJZ вне форума   Ответить с цитированием
Старый 26.06.2010, 16:24   #3
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
Может лучше так
PHP код:
*** 
Или может стоит создать для этого отдельную таблицу?
А разве после дестроя мы не потеряем GetEntry()? Я исходил из этого когда писал. Таблица? А много ли таких вещей?
KiriX вне форума   Ответить с цитированием
Старый 26.06.2010, 16:43   #4
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

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

Ну item entry все-равно не примут в код...
LordJZ вне форума   Ответить с цитированием
Старый 26.06.2010, 17:04   #5
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Вот с таблицей..)
http://getmangos.com/community/showt...ration-expires
NeatElves вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
KiriX (26.06.2010), Vladimir (18.06.2011)
Старый 26.06.2010, 20:45   #6
Viste
Новичок
 
Аватар для Viste
 
Регистрация: 07.03.2010
Сообщений: 13
Сказал(а) спасибо: 27
Поблагодарили 7 раз(а) в 5 сообщениях
Viste На верном пути
По умолчанию

таких вещей всего две, думаю таблица незачем
__________________
С недавних времен TrinityCore User
Viste вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (28.06.2010)
Старый 28.06.2010, 04:38   #7
xex
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 47
Сказал(а) спасибо: 45
Поблагодарили 29 раз(а) в 13 сообщениях
xex На верном пути
По умолчанию

Мой старый код. Работает с полгода, всё нормально.
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;
    } 
xex вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (28.06.2010)
Старый 28.06.2010, 10:20   #8
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Ради двух итемов действительно таблица ни к чему.
xex, спасибо, значит после дестроя итема мы не теряем его ид? Хорошо...
KiriX вне форума   Ответить с цитированием
Старый 28.06.2010, 15:10   #9
xex
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 47
Сказал(а) спасибо: 45
Поблагодарили 29 раз(а) в 13 сообщениях
xex На верном пути
По умолчанию

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

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

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

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

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

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

Последний раз редактировалось xex; 28.06.2010 в 15:18.
xex вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (30.06.2010)
Старый 13.05.2011, 18:48   #10
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

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

44623-44625-44627
44632-44626-44629
NeatElves вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
xex (15.05.2011)
Старый 15.05.2011, 00:36   #11
xex
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 47
Сказал(а) спасибо: 45
Поблагодарили 29 раз(а) в 13 сообщениях
xex На верном пути
По умолчанию

Цитата:
Сообщение от NeatElves Посмотреть сообщение
Вот вам еще цепочки по году в реале.))

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 ); 
xex вне форума   Ответить с цитированием
Старый 18.06.2011, 05:09   #12
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

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

Если все нормально добавлю вечером.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 18.06.2011, 20:16   #13
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Патч в форме приведенной в прев. посте добавлен в [11646]
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10883][patch] correct proc - item Heartpierce Den Принятые патчи 2 17.12.2010 15:23
[10680] Update item buy code for new way vendor item lists work. newsbot CMaNGOS Commits 0 04.11.2010 20:40
[10641] Fixed use item dynamic/item proto flags. newsbot CMaNGOS Commits 0 25.10.2010 15:30
item 37098 и item 45785 rsa Баг-репорты 1 29.05.2010 20:32
[9727] Build equiped item data only for item's owner newsbot CMaNGOS Commits 0 11.04.2010 07:50


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot