|
Патчи на рассмотрении Рассматриваемые к принятию патчи |
|
Опции темы | Поиск в этой теме | Опции просмотра |
13.10.2012, 20:41 | #1 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
[patch] Check cast spells Disarm.
У близав нельзя обезоруживать цель, если она не вооружена, роговским и варовским дисармом, это 100%.
Хорошо бы проверить http://www.wowhead.com/spell=64058 и узнать, вешается дисарм на цель без оружия. Таких заклинаний еще два или три есть, которые срвзу выполняют какое-то действие, а потом вешают дисарм. С остальными понятно, из списка их выбрать и тоже проверять. Код:
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index d079a72..7806d66 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1392,6 +1392,13 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force) SetVirtualItem(VirtualItemSlot(i), einfo->equipentry[i]); } +bool Creature::IsEquipmentWeapon() +{ + CreatureInfo const* creatureInfo = GetCreatureInfo(); + + return creatureInfo->equipmentId; +} + bool Creature::HasQuest(uint32 quest_id) const { QuestRelationsMapBounds bounds = sObjectMgr.GetCreatureQuestRelationsMapBounds(GetEntry()); diff --git a/src/game/Creature.h b/src/game/Creature.h index c2e99f9..8edc66c 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -484,6 +484,8 @@ class MANGOS_DLL_SPEC Creature : public Unit void GetRespawnCoord(float& x, float& y, float& z, float* ori = NULL, float* dist = NULL) const; uint32 GetEquipmentId() const { return m_equipmentId; } + virtual bool IsEquipmentWeapon(); + CreatureSubtype GetSubtype() const { return m_subtype; } bool IsPet() const { return m_subtype == CREATURE_SUBTYPE_PET; } bool IsTotem() const { return m_subtype == CREATURE_SUBTYPE_TOTEM; } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 9bdcc79..a63d570 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -11471,6 +11471,18 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) return pItem; } +bool Player::IsEquipmentWeapon() +{ + if (GetTypeId() != TYPEID_PLAYER) + return false; + + Item* mainHandWeapon = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + Item* offHandWeapon = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); + Item* rangedWeapon = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + + return mainHandWeapon || offHandWeapon || rangedWeapon; +} + void Player::QuickEquipItem(uint16 pos, Item* pItem) { if (pItem) diff --git a/src/game/Player.h b/src/game/Player.h index 8590d88..7b91b3f 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1263,6 +1263,9 @@ class MANGOS_DLL_SPEC Player : public Unit Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); return offItem && ((mainItem && mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON) || offItem->GetProto()->InventoryType == INVTYPE_2HWEAPON); } + + virtual bool IsEquipmentWeapon(); + void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false); bool BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot); diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 913f942..0c91b6a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4985,6 +4985,14 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_CASTER_AURASTATE; } + // Disarm + if (m_spellInfo->IsFitToFamily(SPELLFAMILY_WARRIOR, UI64LIT(0x0000000000000200)) || + m_spellInfo->IsFitToFamily(SPELLFAMILY_ROGUE, UI64LIT(0x0010000000000000))) + { + if (!((Player*)target)->IsEquipmentWeapon() || !((Creature*)target)->IsEquipmentWeapon()) + return SPELL_FAILED_TARGET_NO_WEAPONS; + } + // totem immunity for channeled spells(needs to be before spell cast) // spell attribs for player channeled spells if (m_spellInfo->HasAttribute(SPELL_ATTR_EX_UNK14) diff --git a/src/game/Unit.h b/src/game/Unit.h index 2d3305c..960b8fd 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1118,6 +1118,9 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool isAttackReady(WeaponAttackType type = BASE_ATTACK) const { return m_attackTimer[type] == 0; } bool haveOffhandWeapon() const; bool UpdateMeleeAttackingState(); + + virtual bool IsEquipmentWeapon() { return true; } + bool CanUseEquippedWeapon(WeaponAttackType attackType) const { if (IsInFeralForm()) |
15.10.2012, 09:38 | #2 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
http://www.wowhead.com/spell=64058 должен вешаться на цель без оружия
нужно не просто проверять, если ли любое оружие, а надо проверять в зависимости от ауры дизарма мейн хенд дизарм - проверять мейн хенд, офф хенд дизарм - проверять оффхенд и тп |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[patch] Check cast Killing Spree | Den | Принятые патчи | 1 | 21.05.2013 17:53 |
Check cast Disengage | Den | Принятые патчи | 3 | 17.10.2012 23:22 |
[patch] Check cast Distract | Den | Принятые патчи | 3 | 17.10.2012 23:22 |
Check cast Mend Pet | Den | Принятые патчи | 13 | 26.04.2012 20:49 |
Disarm Trap | VENOM | Баг-репорты | 0 | 17.03.2011 11:11 |