Просмотр полной версии : [patch] Mysterious Egg (item 39878)
Итем спустя 7 дней пропадает, но новый не появляется.
Должно работать так. Покупаем Таинственное яйцо (http://ru.wowhead.com/item=39878#comments), через 7 дней оно превращается в Треснутое яйцо (http://ru.wowhead.com/item=39883#contains) у которого есть интересный лут.
Патч реализует работу данного итема.
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,6 +282,19 @@ void Item::UpdateDuration(Player* owner, uint32 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_BAG, NULL_SLOT, dest, itemId, count) == EQUIP_ERR_OK)
+ {
+ Item* item = owner->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
+ owner->SendNewItem(item, count, true, false);
+ }
+ return;
+ }
owner->DestroyItem(GetBagSlot(), GetSlot(), true);
return;
}
Спасибо LordJZ за подсказку по коду! ;)
Может лучше так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_BAG, NULL_SLOT, dest, itemId, count) == EQUIP_ERR_OK)
+ {
+ Item* item = owner->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
+ owner->SendNewItem(item, count, true, false);
+ }
+ }
return;
}Или может стоит создать для этого отдельную таблицу?
Может лучше так***Или может стоит создать для этого отдельную таблицу?
А разве после дестроя мы не потеряем GetEntry()? Я исходил из этого когда писал. Таблица? А много ли таких вещей?
Может и потеряем, не знаю.
Ну item entry все-равно не примут в код...
NeatElves
26.06.2010, 17:04
Вот с таблицей..)
http://getmangos.com/community/showthread.php?12943-Patch-Item-changes-after-duration-expires
таких вещей всего две, думаю таблица незачем
Мой старый код. Работает с полгода, всё нормально.
if (GetUInt32Value(ITEM_FIELD_DURATION) <= diff)
{
uint8 bagSlot = GetBagSlot();
uint8 slot = GetSlot();
uint32 ItemId = GetProto()->ItemId;
owner->DestroyItem(bagSlot, slot, true);
// 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(bagSlot, slot, dest, newItemId, 1);
if (msg == EQUIP_ERR_OK)
{
owner->StoreNewItem(dest, newItemId, 1, true);
}
else
{
// try store new item in any slot
if (Item* pItem = owner->StoreNewItemInInventorySlot(newItemId, 1))
owner->SendNewItem(pItem, 1, true, false);
// on any case... send error
else
owner->SendEquipError(msg, NULL, NULL);
}
}
return;
}
Ради двух итемов действительно таблица ни к чему.
xex, спасибо, значит после дестроя итема мы не теряем его ид? Хорошо...
Здесь он сначала запоминается:
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
Вот вам еще цепочки по году в реале.))
44623-44625-44627
44632-44626-44629
Спасибо, пофиксено:
--- 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),di ff);
- 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(bagSlot, slot, true);
+ owner->HandleDestroyItemReplace(itemId, bagSlot, slot, pos);
return;
}
SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff);
SetState(ITEM_CHANGED, owner); // save new time in database
}
--- Player.cpp
+++ Player.cpp
@@ -11539,12 +11539,69 @@
pItem->SetGuidValue(ITEM_FIELD_CONTAINED, ObjectGuid());
pItem->SetSlot( NULL_SLOT );
pItem->SetState(ITEM_REMOVED, this);
}
}
+void Player::HandleDestroyItemReplace(uint32 itemId, uint8 bag, uint8 slot, uint16 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(bag, slot, dest, newItemId, 1);
+ if (msg == EQUIP_ERR_OK)
+ {
+ StoreNewItem(dest, newItemId, 1, true);
+ return;
+ }
+ }
+ else if (IsBankPos(pos))
+ {
+ Item* pNewItem = Item::CreateItem(newItemId, 1, this);
+ if (!pNewItem)
+ return;
+
+ uint8 msg = CanBankItem(bag, slot, dest, pNewItem, true);
+ if (msg == EQUIP_ERR_OK)
+ {
+ BankItem(dest, pNewItem, true);
+ return;
+ }
+ else
+ delete pNewItem;
+ }
+}
+
void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool unequip_check)
{
DEBUG_LOG( "STORAGE: DestroyItemCount item = %u, count = %u", item, count);
uint32 remcount = 0;
// in inventory
--- Player.h
+++ Player.h
@@ -1258,12 +1258,13 @@
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update);
// in trade, auction, guild bank, mail....
void MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool update, bool in_characterInventoryDB = false);
// in trade, guild bank, mail....
void RemoveItemDependentAurasAndCasts( Item * pItem );
void DestroyItem( uint8 bag, uint8 slot, bool update );
+ void HandleDestroyItemReplace(uint32 itemId, uint8 bag, uint8 slot, uint16 pos);
void DestroyItemCount( uint32 item, uint32 count, bool update, bool unequip_check = false);
void DestroyItemCount( Item* item, uint32& count, bool update );
void DestroyConjuredItems( bool update );
void DestroyZoneLimitedItem( bool update, uint32 new_zone );
void SplitItem( uint16 src, uint16 dst, uint32 count );
void SwapItem( uint16 src, uint16 dst );
Vladimir
18.06.2011, 05:09
https://gist.github.com/1032722 обновленная версия с использованием существующего кода аналогичной таблицы. Не тестировал еще.
Если все нормально добавлю вечером.
Vladimir
18.06.2011, 20:16
Патч в форме приведенной в прев. посте добавлен в [11646]
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot