Merge pull request #82 from Olion17/develop21
Fixing crash at player leave map during loot roll
This commit is contained in:
commit
2acb9ffdd4
@ -1019,13 +1019,13 @@ void Group::CountTheRoll(Rolls::iterator& rollI)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// end of the roll
|
// end of the roll
|
||||||
|
bool won = false;
|
||||||
if (roll->totalNeed > 0)
|
if (roll->totalNeed > 0)
|
||||||
{
|
{
|
||||||
if (!roll->playerVote.empty())
|
if (!roll->playerVote.empty())
|
||||||
{
|
{
|
||||||
uint8 maxresul = 0;
|
uint8 maxresul = 0;
|
||||||
ObjectGuid maxguid = (*roll->playerVote.begin()).first;
|
ObjectGuid maxguid = (*roll->playerVote.begin()).first;
|
||||||
Player* player;
|
|
||||||
|
|
||||||
for (Roll::PlayerVote::const_iterator itr = roll->playerVote.begin(); itr != roll->playerVote.end(); ++itr)
|
for (Roll::PlayerVote::const_iterator itr = roll->playerVote.begin(); itr != roll->playerVote.end(); ++itr)
|
||||||
{
|
{
|
||||||
@ -1040,51 +1040,55 @@ void Group::CountTheRoll(Rolls::iterator& rollI)
|
|||||||
maxresul = randomN;
|
maxresul = randomN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SendLootRollWon(maxguid, maxresul, ROLL_NEED, *roll);
|
|
||||||
player = sObjectMgr.GetPlayer(maxguid);
|
|
||||||
|
|
||||||
if (player && player->GetSession())
|
if (Player* player = sObjectMgr.GetPlayer(maxguid))
|
||||||
{
|
{
|
||||||
ItemPosCountVec dest;
|
if (Object* object = player->GetMap()->GetWorldObject(roll->lootedTargetGUID))
|
||||||
LootItem* item = &(roll->getLoot()->items[roll->itemSlot]);
|
|
||||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
|
|
||||||
if (msg == EQUIP_ERR_OK)
|
|
||||||
{
|
{
|
||||||
item->is_looted = true;
|
SendLootRollWon(maxguid, maxresul, ROLL_NEED, *roll);
|
||||||
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
|
won = true;
|
||||||
--roll->getLoot()->unlootedCount;
|
if (player->GetSession())
|
||||||
Item* newitem = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId);
|
|
||||||
player->SendNewItem(newitem, uint32(item->count), false, false, true);
|
|
||||||
|
|
||||||
Object * object = player->GetMap()->GetWorldObject(roll->lootedTargetGUID);
|
|
||||||
|
|
||||||
if (object->GetTypeId() == TYPEID_UNIT)
|
|
||||||
{
|
{
|
||||||
/// Warn players about the loot status on the corpse.
|
ItemPosCountVec dest;
|
||||||
Creature * creature = player->GetMap()->GetCreature(roll->lootedTargetGUID);
|
LootItem* item = &(roll->getLoot()->items[roll->itemSlot]);
|
||||||
/// If creature has been fully looted, remove flag.
|
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
|
||||||
if (creature->loot.isLooted())
|
if (msg == EQUIP_ERR_OK)
|
||||||
{
|
{
|
||||||
creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
item->is_looted = true;
|
||||||
|
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
|
||||||
|
--roll->getLoot()->unlootedCount;
|
||||||
|
Item* newitem = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId);
|
||||||
|
player->SendNewItem(newitem, uint32(item->count), false, false, true);
|
||||||
|
|
||||||
|
if (object->GetTypeId() == TYPEID_UNIT)
|
||||||
|
{
|
||||||
|
/// Warn players about the loot status on the corpse.
|
||||||
|
Creature * creature = object->ToCreature();
|
||||||
|
/// If creature has been fully looted, remove flag.
|
||||||
|
if (creature->loot.isLooted())
|
||||||
|
{
|
||||||
|
creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->is_blocked = false;
|
||||||
|
player->SendEquipError(msg, NULL, NULL, roll->itemid);
|
||||||
|
item->winner = player->GetObjectGuid();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
item->is_blocked = false;
|
|
||||||
player->SendEquipError(msg, NULL, NULL, roll->itemid);
|
|
||||||
item->winner = player->GetObjectGuid();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (roll->totalGreed > 0)
|
|
||||||
|
if (!won && roll->totalGreed > 0)
|
||||||
{
|
{
|
||||||
if (!roll->playerVote.empty())
|
if (!roll->playerVote.empty())
|
||||||
{
|
{
|
||||||
uint8 maxresul = 0;
|
uint8 maxresul = 0;
|
||||||
ObjectGuid maxguid = (*roll->playerVote.begin()).first;
|
ObjectGuid maxguid = (*roll->playerVote.begin()).first;
|
||||||
Player* player;
|
|
||||||
RollVote rollvote = ROLL_PASS; // Fixed: Using uninitialized memory 'rollvote'
|
RollVote rollvote = ROLL_PASS; // Fixed: Using uninitialized memory 'rollvote'
|
||||||
|
|
||||||
Roll::PlayerVote::iterator itr;
|
Roll::PlayerVote::iterator itr;
|
||||||
@ -1101,50 +1105,58 @@ void Group::CountTheRoll(Rolls::iterator& rollI)
|
|||||||
maxresul = randomN;
|
maxresul = randomN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SendLootRollWon(maxguid, maxresul, ROLL_GREED, *roll);
|
|
||||||
player = sObjectMgr.GetPlayer(maxguid);
|
|
||||||
|
|
||||||
if (player && player->GetSession())
|
if (Player* player = sObjectMgr.GetPlayer(maxguid))
|
||||||
{
|
{
|
||||||
ItemPosCountVec dest;
|
if (Object * object = player->GetMap()->GetWorldObject(roll->lootedTargetGUID))
|
||||||
LootItem* item = &(roll->getLoot()->items[roll->itemSlot]);
|
|
||||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
|
|
||||||
if (msg == EQUIP_ERR_OK)
|
|
||||||
{
|
{
|
||||||
item->is_looted = true;
|
SendLootRollWon(maxguid, maxresul, ROLL_GREED, *roll);
|
||||||
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
|
won = true;
|
||||||
--roll->getLoot()->unlootedCount;
|
if (player->GetSession())
|
||||||
Item* newitem = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId);
|
|
||||||
player->SendNewItem(newitem, uint32(item->count), false, false, true);
|
|
||||||
|
|
||||||
Object * object = player->GetMap()->GetWorldObject(roll->lootedTargetGUID);
|
|
||||||
if (object->GetTypeId() == TYPEID_UNIT)
|
|
||||||
{
|
{
|
||||||
/// Warn players about the loot status on the corpse.
|
ItemPosCountVec dest;
|
||||||
Creature * creature = player->GetMap()->GetCreature(roll->lootedTargetGUID);
|
LootItem* item = &(roll->getLoot()->items[roll->itemSlot]);
|
||||||
/// If creature has been fully looted, remove flag.
|
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
|
||||||
if (creature->loot.isLooted())
|
if (msg == EQUIP_ERR_OK)
|
||||||
{
|
{
|
||||||
creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
item->is_looted = true;
|
||||||
|
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
|
||||||
|
--roll->getLoot()->unlootedCount;
|
||||||
|
Item* newitem = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId);
|
||||||
|
player->SendNewItem(newitem, uint32(item->count), false, false, true);
|
||||||
|
if (object->GetTypeId() == TYPEID_UNIT)
|
||||||
|
{
|
||||||
|
/// Warn players about the loot status on the corpse.
|
||||||
|
Creature * creature = object->ToCreature();
|
||||||
|
/// If creature has been fully looted, remove flag.
|
||||||
|
if (creature->loot.isLooted())
|
||||||
|
{
|
||||||
|
creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->is_blocked = false;
|
||||||
|
player->SendEquipError(msg, NULL, NULL, roll->itemid);
|
||||||
|
|
||||||
|
// Storing the winner to recall in LootView.
|
||||||
|
item->winner = player->GetObjectGuid();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
item->is_blocked = false;
|
|
||||||
player->SendEquipError(msg, NULL, NULL, roll->itemid);
|
|
||||||
|
|
||||||
// Storing the winner to recall in LootView.
|
|
||||||
item->winner = player->GetObjectGuid();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (!won)
|
||||||
{
|
{
|
||||||
SendLootAllPassed(*roll);
|
SendLootAllPassed(*roll);
|
||||||
LootItem* item = &(roll->getLoot()->items[roll->itemSlot]);
|
LootItem* item = &(roll->getLoot()->items[roll->itemSlot]);
|
||||||
if (item) { item->is_blocked = false; }
|
if (item)
|
||||||
|
{
|
||||||
|
item->is_blocked = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rollI = RollId.erase(rollI);
|
rollI = RollId.erase(rollI);
|
||||||
|
@ -385,7 +385,6 @@ class Group
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetTargetIcon(uint8 id, ObjectGuid targetGuid);
|
void SetTargetIcon(uint8 id, ObjectGuid targetGuid);
|
||||||
uint16 InInstance();
|
|
||||||
bool InCombatToInstance(uint32 instanceId);
|
bool InCombatToInstance(uint32 instanceId);
|
||||||
void ResetInstances(InstanceResetMethod method, Player* SendMsgTo);
|
void ResetInstances(InstanceResetMethod method, Player* SendMsgTo);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user