diff --git a/src/bindings/universal/Scripts/sc_defines.cpp b/src/bindings/universal/Scripts/sc_defines.cpp index 0f12248d2..62e848913 100644 --- a/src/bindings/universal/Scripts/sc_defines.cpp +++ b/src/bindings/universal/Scripts/sc_defines.cpp @@ -18,7 +18,7 @@ #include "sc_defines.h" -#include "../../game/Player.h" +#include "../../../game/Player.h" uint32 GetSkillLevel(Player *player,uint32 trskill) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index d2b458558..16c6c310a 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -11210,12 +11210,12 @@ void Player::SwapItem( uint16 src, uint16 dst ) Item *pSrcItem = GetItemByPos( srcbag, srcslot ); Item *pDstItem = GetItemByPos( dstbag, dstslot ); - if( !pSrcItem ) + if (!pSrcItem) return; sLog.outDebug( "STORAGE: SwapItem bag = %u, slot = %u, item = %u", dstbag, dstslot, pSrcItem->GetEntry()); - if(!isAlive() ) + if (!isAlive()) { SendEquipError( EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem ); return; @@ -11223,7 +11223,7 @@ void Player::SwapItem( uint16 src, uint16 dst ) // SRC checks - if(pSrcItem->m_lootGenerated) // prevent swap looting item + if (pSrcItem->m_lootGenerated) // prevent swap looting item { //best error message found for attempting to swap while looting SendEquipError( EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, NULL ); @@ -11231,11 +11231,11 @@ void Player::SwapItem( uint16 src, uint16 dst ) } // check unequip potability for equipped items and bank bags - if(IsEquipmentPos ( src ) || IsBagPos ( src )) + if (IsEquipmentPos(src) || IsBagPos(src)) { // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later) uint8 msg = CanUnequipItem( src, !IsBagPos ( src ) || IsBagPos ( dst ) || (pDstItem && pDstItem->IsBag() && ((Bag*)pDstItem)->IsEmpty())); - if(msg != EQUIP_ERR_OK) + if (msg != EQUIP_ERR_OK) { SendEquipError( msg, pSrcItem, pDstItem ); return; @@ -11243,12 +11243,19 @@ void Player::SwapItem( uint16 src, uint16 dst ) } // prevent put equipped/bank bag in self - if( IsBagPos ( src ) && srcslot == dstbag) + if (IsBagPos(src) && srcslot == dstbag) { SendEquipError( EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem ); return; } + // prevent put equipped/bank bag in self + if (IsBagPos(dst) && dstslot == srcbag) + { + SendEquipError( EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pDstItem, pSrcItem ); + return; + } + // DST checks if (pDstItem) diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index a35898ae3..23032b34d 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2649,4 +2649,11 @@ enum PetTameFailureReason #define EXPECTED_MANGOSD_CLIENT_BUILD {11159, 0} +// max supported expansion level in mangosd +// NOTE: not set it more that supported by targeted client version with all expansions installed +// account with expansion > client supported will rejected at connection by client +// because if client receive unsupported expansion level it think +// that it not have expansion installed and reject +#define MAX_EXPANSION 2 + #endif diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 9f141df99..b4c2a665e 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2390,13 +2390,21 @@ void Spell::prepare(SpellCastTargets const* targets, Aura* triggeredByAura) m_caster->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); } - if(m_IsTriggeredSpell) - cast(true); - else + // add non-triggered (with cast time and without) + if (!m_IsTriggeredSpell) { + // add to cast type slot m_caster->SetCurrentCastedSpell( this ); + + // will show cast bar SendSpellStart(); } + // execute triggered without cast time explicitly in call point + else if(m_timer == 0) + cast(true); + // else triggered with cast time will execute execute at next tick or later + // without adding to cast type slot + // will not show cast bar but will show effects at casting time etc } void Spell::cancel() @@ -3463,14 +3471,11 @@ void Spell::SendChannelUpdate(uint32 time) m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0); } - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return; - WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 ); data.append(m_caster->GetPackGUID()); data << uint32(time); - ((Player*)m_caster)->GetSession()->SendPacket( &data ); + m_caster->SendMessageToSet(&data, true); } void Spell::SendChannelStart(uint32 duration) @@ -3501,15 +3506,12 @@ void Spell::SendChannelStart(uint32 duration) } } - if (m_caster->GetTypeId() == TYPEID_PLAYER) - { - WorldPacket data( MSG_CHANNEL_START, (8+4+4) ); - data.append(m_caster->GetPackGUID()); - data << uint32(m_spellInfo->Id); - data << uint32(duration); + WorldPacket data( MSG_CHANNEL_START, (8+4+4) ); + data.append(m_caster->GetPackGUID()); + data << uint32(m_spellInfo->Id); + data << uint32(duration); - ((Player*)m_caster)->GetSession()->SendPacket( &data ); - } + m_caster->SendMessageToSet(&data, true); m_timer = duration; if(target) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 8e7da8013..da4754842 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1401,6 +1401,7 @@ void Aura::HandleAddModifier(bool apply, bool Real) case 51124: // Killing Machine case 54741: // Firestarter case 57761: // Fireball! + case 64823: // Elune's Wrath (Balance druid t8 set SetAuraCharges(1); break; } @@ -2418,6 +2419,16 @@ void Aura::HandleAuraDummy(bool apply, bool Real) } } + // Living Bomb + if (m_spellProto->SpellFamilyName == SPELLFAMILY_MAGE && (m_spellProto->SpellFamilyFlags & UI64LIT(0x2000000000000))) + { + // Zero duration is equal to AURA_REMOVE_BY_DEFAULT. We can't use it directly, as it is set even + // when removing aura from one target due to casting Living Bomb at other. + if (m_duration == 0 || m_removeMode == AURA_REMOVE_BY_DISPEL) + m_target->CastSpell(m_target,m_modifier.m_amount,true,NULL,this); + return; + } + if (m_removeMode == AURA_REMOVE_BY_DEATH) { // Stop caster Arcane Missle chanelling on death @@ -3029,16 +3040,17 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real) } } - if(!furorChance) - break; - if (m_modifier.m_miscvalue == FORM_CAT) { - m_target->SetPower(POWER_ENERGY, 0); - // Furor chance is now amount of energy for cat form - m_target->CastCustomSpell(m_target, 17099, &furorChance, NULL, NULL, this); + // Furor chance is now amount allowed to save energy for cat form + // without talent it reset to 0 + if (m_target->GetPower(POWER_ENERGY) > furorChance) + { + m_target->SetPower(POWER_ENERGY, 0); + m_target->CastCustomSpell(m_target, 17099, &furorChance, NULL, NULL, this); + } } - else + else if(furorChance) // only if talent known { m_target->SetPower(POWER_RAGE, 0); if(urand(1,100) <= furorChance) @@ -5908,6 +5920,7 @@ void Aura::HandleSpellSpecificBoosts(bool apply) } else return; + break; } case SPELLFAMILY_WARRIOR: { @@ -5931,6 +5944,7 @@ void Aura::HandleSpellSpecificBoosts(bool apply) break; } case SPELLFAMILY_WARLOCK: + { // Fear (non stacking) if (m_spellProto->SpellFamilyFlags & UI64LIT(0x0000040000000000)) { @@ -5965,6 +5979,7 @@ void Aura::HandleSpellSpecificBoosts(bool apply) else return; break; + } case SPELLFAMILY_PRIEST: { // Shadow Word: Pain (need visual check fro skip improvement talent) or Vampiric Touch diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index bdcbf71c5..b361a2825 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -1454,6 +1454,16 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2) cons if( (spellInfo_1->SpellFamilyFlags & UI64LIT(0x0000000000010000)) && (spellInfo_2->SpellVisual[0] == 72 && spellInfo_2->SpellIconID == 1499) || (spellInfo_2->SpellFamilyFlags & UI64LIT(0x0000000000010000)) && (spellInfo_1->SpellVisual[0] == 72 && spellInfo_1->SpellIconID == 1499) ) return false; + + // Living Bomb & Ignite (Dots) + if( (spellInfo_1->SpellFamilyFlags & UI64LIT(0x2000000000000)) && (spellInfo_2->SpellFamilyFlags & UI64LIT(0x8000000)) || + (spellInfo_2->SpellFamilyFlags & UI64LIT(0x2000000000000)) && (spellInfo_1->SpellFamilyFlags & UI64LIT(0x8000000)) ) + return false; + + // Fireball & Pyroblast (Dots) + if( (spellInfo_1->SpellFamilyFlags & UI64LIT(0x1)) && (spellInfo_2->SpellFamilyFlags & UI64LIT(0x400000)) || + (spellInfo_2->SpellFamilyFlags & UI64LIT(0x1)) && (spellInfo_1->SpellFamilyFlags & UI64LIT(0x400000)) ) + return false; } // Detect Invisibility and Mana Shield (multi-family check) if( spellInfo_2->Id == 132 && spellInfo_1->SpellIconID == 209 && spellInfo_1->SpellVisual[0] == 968 ) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 65275da7b..c2baad92e 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -7741,7 +7741,6 @@ void Unit::setPowerType(Powers new_powertype) break; case POWER_ENERGY: SetMaxPower(POWER_ENERGY,GetCreatePowers(POWER_ENERGY)); - SetPower( POWER_ENERGY,0); break; case POWER_HAPPINESS: SetMaxPower(POWER_HAPPINESS,GetCreatePowers(POWER_HAPPINESS)); diff --git a/src/game/World.cpp b/src/game/World.cpp index 36d53bd3c..5af45d949 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -895,12 +895,18 @@ void World::LoadConfigSettings(bool reload) if(reload) { - uint32 val = sConfig.GetIntDefault("Expansion",1); + uint32 val = sConfig.GetIntDefault("Expansion",MAX_EXPANSION); if(val!=m_configs[CONFIG_EXPANSION]) sLog.outError("Expansion option can't be changed at mangosd.conf reload, using current value (%u).",m_configs[CONFIG_EXPANSION]); } else - m_configs[CONFIG_EXPANSION] = sConfig.GetIntDefault("Expansion",1); + m_configs[CONFIG_EXPANSION] = sConfig.GetIntDefault("Expansion",MAX_EXPANSION); + + if(m_configs[CONFIG_EXPANSION] > MAX_EXPANSION) + { + sLog.outError("Expansion option can't be greater %u but set to %u, used %u",MAX_EXPANSION,m_configs[CONFIG_EXPANSION],MAX_EXPANSION); + m_configs[CONFIG_EXPANSION] = MAX_EXPANSION; + } m_configs[CONFIG_CHATFLOOD_MESSAGE_COUNT] = sConfig.GetIntDefault("ChatFlood.MessageCount",10); m_configs[CONFIG_CHATFLOOD_MESSAGE_DELAY] = sConfig.GetIntDefault("ChatFlood.MessageDelay",1); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index a2bc8953f..343a65f99 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9045" + #define REVISION_NR "9055" #endif // __REVISION_NR_H__ diff --git a/win/VC100/script.vcxproj b/win/VC100/script.vcxproj index cd0a48fae..09c3d4e27 100644 --- a/win/VC100/script.vcxproj +++ b/win/VC100/script.vcxproj @@ -321,6 +321,7 @@ + diff --git a/win/VC80/script.vcproj b/win/VC80/script.vcproj index 37ae2ce5a..235db2bb0 100644 --- a/win/VC80/script.vcproj +++ b/win/VC80/script.vcproj @@ -533,6 +533,10 @@ RelativePath="..\..\src\bindings\universal\Scripts\sc_default.cpp" > + + + +