Предыстория:
Патч такой был, устарел кардинально. Нашел я его, поднял из архивов, просмотрел со всех сторон - вроде нормальный. Стал проверять - поставил, потыркался - не работает.
История:
1. Старый патч добавлял кусок в LootHandler.cpp:
Код:
diff --git a/src/game/LootHandler.cpp b/src/game/LootHandler.cpp
index 9731442..38d780d 100644
--- a/src/game/LootHandler.cpp
+++ b/src/game/LootHandler.cpp
@@ -29,6 +29,7 @@
#include "Group.h"
#include "World.h"
#include "Util.h"
+#include "ObjectAccessor.h"
void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data )
{
@@ -68,6 +69,16 @@ void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data )
loot = &pItem->loot;
}
+ else if (IS_CORPSE_GUID(lguid))
+ {
+ Corpse *bones = ObjectAccessor::GetCorpse(*player, lguid);
+ if (!bones)
+ {
+ player->SendLootRelease(lguid);
+ return;
+ }
+ loot = &bones->loot;
+ }
else
{
Creature* pCreature =
На данный момент такой кусок там уже есть. Значит его вставлять туда я не стал.
2. Старый патч правил много кусочков в Player.cpp:
Код:
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index ed23d9c..b88c33d 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -3764,8 +3764,7 @@ void Player::CreateCorpse()
flags |= CORPSE_FLAG_HIDE_HELM;
if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))
flags |= CORPSE_FLAG_HIDE_CLOAK;
- if(InBattleGround())
- flags |= CORPSE_FLAG_LOOTABLE; // to be able to remove insignia
+ flags |= CORPSE_FLAG_LOOTABLE; // to be able to remove insignia
corpse->SetUInt32Value( CORPSE_FIELD_FLAGS, flags );
corpse->SetUInt32Value( CORPSE_FIELD_DISPLAY_ID, GetNativeDisplayId() );
@@ -6993,8 +6992,8 @@ bool Player::CheckAmmoCompatibility(const ItemPrototype *ammo_proto) const
Called by remove insignia spell effect */
void Player::RemovedInsignia(Player* looterPlr)
{
- if (!GetBattleGroundId())
- return;
+// if (!GetBattleGroundId()) because we want lootable players everywhere
+// return;
// If not released spirit, do it !
if(m_deathTimer > 0)
@@ -7139,6 +7138,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
bones->lootForBody = true;
uint32 pLevel = bones->loot.gold;
bones->loot.clear();
+ loot->FillLoot(88888, LootTemplates_Creature, this, true); //88888 is the id in creature_template
// It may need a better formula
// Now it works like this: lvl10: ~6copper, lvl70: ~9silver
bones->loot.gold = (uint32)( urand(50, 150) * 0.016f * pow( ((float)pLevel)/5.76f, 2.5f) * sWorld.getRate(RATE_DROP_MONEY) );
Первое - раньше было два куска:
Код:
if(InBattleGround())
flags |= CORPSE_FLAG_LOOTABLE;
тут комментировался
Код:
if(InBattleGround())
и
Код:
if (!GetBattleGroundId())
return;
он комментировался весь.
Ну тут вроде все понятно - сейчас есть один кусок
Код:
if (InBattleGround() && !InArena())
flags |= CORPSE_FLAG_LOOTABLE;
тут комментим первую строку наф.
Второе - между
Код:
bones->loot.clear();
и
Код:
bones->loot.gold = (uint32)( urand(50, 150) * 0.016f * pow( ((float)pLevel)/5.76f, 2.5f) * sWorld.getRate(RATE_DROP_MONEY) );
вставляется
Код:
loot->FillLoot(88888, LootTemplates_Creature, this, true);
Вот только сейчас там уже стоит
Код:
if (GetBattleGround()->GetTypeID() == BATTLEGROUND_AV)
loot->FillLoot(0, LootTemplates_Creature, this, false);
Вставим выше, попробуем, вставим ниже, попробуем, переставим выше-ниже на пару строк... и результаты...
Проблема:
Ставим патч, заливаем в базу лут для creature 88888.
При убийстве игрока, и освобождении им духа, получаем курсор "снимай значки арены, пока не поздно!!!". Жмем лут, проходит таймер - лута нет, курсор лута не меняется. Жмем еще пару-тройку раз - просто для контроля - с тем же эффектом. Окей, лезем в код - переставляем строку
Код:
loot->FillLoot(88888, LootTemplates_Creature, this, true);
выше, ниже, еще чуть выше-выше-выше, с последующими тестами... И с тем же результатом. Видимо у кого-то либо руки не под то заточены, либо голова кривая.
Итог:
Билли, ай нид хелп!!!
Я просто не представляю что именно сделано не так, и почему оно не работает. Ведь по идее - ДОЛЖНО ЖЕ!!!
В аттаче два патча - старый (гарантированно полностью рабочий на тот момент и примерно тысячу ревизий вперед, проверенный) и новый (гарантированно нерабочий на данный момент, проверенный).