Core/LFG:
Fix priority of the player when its added to the lfg group
Better implementation of the Dungeon Deserter debuff
Rewrite the NeedBeforeGreed loot
Fixed players being shown as Unknown Entity when entering the lfg group
Some incremental optimizations after original patch
Thanks to Retriman and Paecman for base implementation
Signed-off-by: Machiavelli <[email protected]>
This commit is contained in:
@@ -2305,9 +2305,14 @@ bool Player::TeleportToBGEntryPoint()
|
||||
if (m_bgData.joinPos.m_mapId == MAPID_INVALID)
|
||||
return false;
|
||||
|
||||
Group* group = GetGroup();
|
||||
if (group && group->isLFGGroup() && group->GetMembersCount() == 1)
|
||||
group->Disband();
|
||||
else
|
||||
ScheduleDelayedOperation(DELAYED_BG_GROUP_RESTORE);
|
||||
|
||||
ScheduleDelayedOperation(DELAYED_BG_MOUNT_RESTORE);
|
||||
ScheduleDelayedOperation(DELAYED_BG_TAXI_RESTORE);
|
||||
ScheduleDelayedOperation(DELAYED_BG_GROUP_RESTORE);
|
||||
return TeleportTo(m_bgData.joinPos);
|
||||
}
|
||||
|
||||
@@ -7371,6 +7376,22 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
|
||||
SendInitWorldStates(newZone, newArea); // only if really enters to new zone, not just area change, works strange...
|
||||
}
|
||||
|
||||
// group update
|
||||
if (GetGroup())
|
||||
{
|
||||
SetGroupUpdateFlag(GROUP_UPDATE_FULL);
|
||||
Group* grp = GetGroup();
|
||||
if (GetSession() && grp->isLFGGroup() && sLFGMgr->IsTeleported(GetGUID()))
|
||||
{
|
||||
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
Player* tempplr = itr->getSource();
|
||||
if (tempplr)
|
||||
GetSession()->SendNameQueryOpcode(tempplr->GetGUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_zoneUpdateId = newZone;
|
||||
m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL;
|
||||
|
||||
@@ -7458,10 +7479,6 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
|
||||
// recent client version not send leave/join channel packets for built-in local channels
|
||||
UpdateLocalChannels(newZone);
|
||||
|
||||
// group update
|
||||
if (GetGroup())
|
||||
SetGroupUpdateFlag(GROUP_UPDATE_FULL);
|
||||
|
||||
UpdateZoneDependentAuras(newZone);
|
||||
}
|
||||
|
||||
@@ -11794,6 +11811,75 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const
|
||||
return EQUIP_ERR_ITEM_NOT_FOUND;
|
||||
}
|
||||
|
||||
InventoryResult Player::CanRollForItem(ItemTemplate const* proto) const
|
||||
{
|
||||
if (!proto)
|
||||
return EQUIP_ERR_ITEM_NOT_FOUND;
|
||||
// Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
|
||||
|
||||
const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
|
||||
{
|
||||
SKILL_AXES, SKILL_2H_AXES, SKILL_BOWS, SKILL_GUNS, SKILL_MACES,
|
||||
SKILL_2H_MACES, SKILL_POLEARMS, SKILL_SWORDS, SKILL_2H_SWORDS, 0,
|
||||
SKILL_STAVES, 0, 0, SKILL_FIST_WEAPONS, 0,
|
||||
SKILL_DAGGERS, SKILL_THROWN, SKILL_ASSASSINATION, SKILL_CROSSBOWS, SKILL_WANDS,
|
||||
SKILL_FISHING
|
||||
}; //Copy from function Item::GetSkill()
|
||||
|
||||
if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
|
||||
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
|
||||
|
||||
if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
|
||||
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
|
||||
|
||||
if (proto->RequiredSkill != 0)
|
||||
{
|
||||
if (!GetSkillValue(proto->RequiredSkill))
|
||||
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
|
||||
else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
|
||||
return EQUIP_ERR_CANT_EQUIP_SKILL;
|
||||
}
|
||||
|
||||
uint8 _class = getClass();
|
||||
|
||||
if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
|
||||
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
|
||||
|
||||
if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER && proto->InventoryType != INVTYPE_CLOAK)
|
||||
{
|
||||
if (_class == CLASS_WARRIOR || _class == CLASS_PALADIN || _class == CLASS_DEATH_KNIGHT)
|
||||
{
|
||||
if (getLevel() < 40)
|
||||
{
|
||||
if (proto->SubClass != ITEM_SUBCLASS_ARMOR_MAIL)
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
else if (proto->SubClass != ITEM_SUBCLASS_ARMOR_PLATE)
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
else if (_class == CLASS_HUNTER || _class == CLASS_SHAMAN)
|
||||
{
|
||||
if (getLevel() < 40)
|
||||
{
|
||||
if (proto->SubClass != ITEM_SUBCLASS_ARMOR_LEATHER)
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
else if (proto->SubClass != ITEM_SUBCLASS_ARMOR_MAIL)
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
|
||||
if (_class == CLASS_ROGUE || _class == CLASS_DRUID)
|
||||
if (proto->SubClass != ITEM_SUBCLASS_ARMOR_LEATHER)
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
|
||||
if (_class == CLASS_MAGE || _class == CLASS_PRIEST || _class == CLASS_WARLOCK)
|
||||
if (proto->SubClass != ITEM_SUBCLASS_ARMOR_CLOTH)
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
|
||||
return EQUIP_ERR_OK;
|
||||
}
|
||||
|
||||
InventoryResult Player::CanUseAmmo(uint32 item) const
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "STORAGE: CanUseAmmo item = %u", item);
|
||||
|
||||
Reference in New Issue
Block a user