aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/SpellEffects.cpp165
1 files changed, 135 insertions, 30 deletions
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 0d656e5b5cb..4829ab2d95c 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -556,12 +556,12 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
if (AuraEffect const * aurEff = unitTarget->GetAura(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0, 0, m_caster->GetGUID()))
{
// count consumed deadly poison doses at target
- Aura *poison = 0;
+ //Aura *poison = 0;
uint32 spellId = aurEff->GetId();
uint32 doses = aurEff->GetParentAura()->GetStackAmount();
if (doses > combo)
doses = combo;
- for (int i=0; i< doses; i++)
+ for (uint32 i = 0; i < doses; ++i)
unitTarget->RemoveAuraFromStack(spellId);
damage *= doses;
damage += int32(((Player*)m_caster)->GetTotalAttackPowerValue(BASE_ATTACK) * 0.03f * doses);
@@ -818,6 +818,18 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(unitTarget,spell_id,true,NULL);
return;
}
+ case 13280: // Gnomish Death Ray
+ {
+ if (!unitTarget)
+ return;
+
+ if (urand(0, 99) < 15)
+ m_caster->CastSpell(m_caster, 13493, true, NULL); // failure
+ else
+ m_caster->CastSpell(unitTarget, 13279, true, NULL);
+
+ return;
+ }
case 13567: // Dummy Trigger
{
// can be used for different aura triggering, so select by aura
@@ -1068,6 +1080,11 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastCustomSpell(unitTarget, 37675, &basepoints0, NULL, NULL, true);
return;
}
+ case 40109: // Knockdown Fel Cannon: The Bolt
+ {
+ unitTarget->CastSpell(unitTarget, 40075, true);
+ return;
+ }
case 40802: // Mingo's Fortune Generator (Mingo's Fortune Giblets)
{
// selecting one from Bloodstained Fortune item
@@ -1159,6 +1176,18 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(m_caster, 45088, true);
return;
}
+ case 49625: // Brave's Flare
+ {
+ //Trigger Brave's Flare Effect (with EffectTarget)
+ m_caster->CastSpell(m_caster, 43106, true);
+ return;
+ }
+ case 49634: // Sergeant's Flare
+ {
+ //Trigger Sergeant's Flare Effect (with EffectTarget)
+ m_caster->CastSpell(m_caster, 43068, true);
+ return;
+ }
case 55004: // Nitro Boosts
if(!m_CastItem) return;
if(roll_chance_i(95)) // Nitro Boosts - success
@@ -1256,6 +1285,7 @@ void Spell::EffectDummy(uint32 i)
return;
}
case 62324: // Throw Passenger
+ {
if(m_targets.HasTraj())
{
if(Vehicle *vehicle = m_caster->GetVehicleKit())
@@ -1293,6 +1323,15 @@ void Spell::EffectDummy(uint32 i)
}
}
return;
+ }
+ case 64385: // Unusual Compass
+ {
+ m_caster->SetOrientation(float(urand(0,62832)) / 10000.0f);
+ WorldPacket data;
+ m_caster->BuildHeartBeatMsg(&data);
+ m_caster->SendMessageToSet(&data,true);
+ return;
+ }
}
//All IconID Check in there
@@ -1609,6 +1648,21 @@ void Spell::EffectDummy(uint32 i)
case SPELLFAMILY_HUNTER:
switch(m_spellInfo->Id)
{
+ case 781: // Disengage
+ {
+ if (m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ WorldPacket data(SMSG_MOVE_KNOCK_BACK, 50);
+ data.append(m_caster->GetPackGUID());
+ data << getMSTime();
+ data << float(cosf(m_caster->GetOrientation()+M_PI));
+ data << float(sinf(m_caster->GetOrientation()+M_PI));
+ data << float(15);
+ data << float(-7.0f);
+ ((Player*)m_caster)->GetSession()->SendPacket(&data);
+ return;
+ }
case 23989: // Readiness talent
{
if(m_caster->GetTypeId() != TYPEID_PLAYER)
@@ -3287,92 +3341,94 @@ void Spell::EffectOpenLock(uint32 effIndex)
void Spell::EffectSummonChangeItem(uint32 i)
{
- if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
Player *player = (Player*)m_caster;
// applied only to using item
- if(!m_CastItem)
+ if (!m_CastItem)
return;
// ... only to item in own inventory/bank/equip_slot
- if(m_CastItem->GetOwnerGUID()!=player->GetGUID())
+ if (m_CastItem->GetOwnerGUID() != player->GetGUID())
return;
uint32 newitemid = m_spellInfo->EffectItemType[i];
- if(!newitemid)
+ if (!newitemid)
return;
uint16 pos = m_CastItem->GetPos();
- Item *pNewItem = Item::CreateItem( newitemid, 1, player);
- if( !pNewItem )
+ Item *pNewItem = Item::CreateItem(newitemid, 1, player);
+ if (!pNewItem)
return;
- for (uint8 j= PERM_ENCHANTMENT_SLOT; j<=TEMP_ENCHANTMENT_SLOT; ++j)
- {
- if(m_CastItem->GetEnchantmentId(EnchantmentSlot(j)))
+ for (uint8 j = PERM_ENCHANTMENT_SLOT; j <= TEMP_ENCHANTMENT_SLOT; ++j)
+ if (m_CastItem->GetEnchantmentId(EnchantmentSlot(j)))
pNewItem->SetEnchantment(EnchantmentSlot(j), m_CastItem->GetEnchantmentId(EnchantmentSlot(j)), m_CastItem->GetEnchantmentDuration(EnchantmentSlot(j)), m_CastItem->GetEnchantmentCharges(EnchantmentSlot(j)));
- }
- if(m_CastItem->GetUInt32Value(ITEM_FIELD_DURABILITY) < m_CastItem->GetUInt32Value(ITEM_FIELD_MAXDURABILITY))
+ if (m_CastItem->GetUInt32Value(ITEM_FIELD_DURABILITY) < m_CastItem->GetUInt32Value(ITEM_FIELD_MAXDURABILITY))
{
double loosePercent = 1 - m_CastItem->GetUInt32Value(ITEM_FIELD_DURABILITY) / double(m_CastItem->GetUInt32Value(ITEM_FIELD_MAXDURABILITY));
player->DurabilityLoss(pNewItem, loosePercent);
}
- if( player->IsInventoryPos( pos ) )
+ if (player->IsInventoryPos(pos))
{
ItemPosCountVec dest;
- uint8 msg = player->CanStoreItem( m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true );
- if( msg == EQUIP_ERR_OK )
+ uint8 msg = player->CanStoreItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true );
+ if (msg == EQUIP_ERR_OK)
{
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
// prevent crash at access and unexpected charges counting with item update queue corrupt
- if(m_CastItem==m_targets.getItemTarget())
+ if (m_CastItem == m_targets.getItemTarget())
m_targets.setItemTarget(NULL);
m_CastItem = NULL;
- player->StoreItem( dest, pNewItem, true);
+ player->StoreItem(dest, pNewItem, true);
return;
}
}
- else if( player->IsBankPos ( pos ) )
+ else if (player->IsBankPos(pos))
{
ItemPosCountVec dest;
- uint8 msg = player->CanBankItem( m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true );
- if( msg == EQUIP_ERR_OK )
+ uint8 msg = player->CanBankItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true);
+ if (msg == EQUIP_ERR_OK)
{
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
// prevent crash at access and unexpected charges counting with item update queue corrupt
- if(m_CastItem==m_targets.getItemTarget())
+ if (m_CastItem == m_targets.getItemTarget())
m_targets.setItemTarget(NULL);
m_CastItem = NULL;
- player->BankItem( dest, pNewItem, true);
+ player->BankItem(dest, pNewItem, true);
return;
}
}
- else if( player->IsEquipmentPos ( pos ) )
+ else if (player->IsEquipmentPos(pos))
{
uint16 dest;
- uint8 msg = player->CanEquipItem( m_CastItem->GetSlot(), dest, pNewItem, true );
- if( msg == EQUIP_ERR_OK )
+
+ player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
+
+ uint8 msg = player->CanEquipItem(m_CastItem->GetSlot(), dest, pNewItem, true);
+
+ if (msg == EQUIP_ERR_OK || msg == EQUIP_ERR_CANT_DO_RIGHT_NOW)
{
- player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
+ if (msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) dest = EQUIPMENT_SLOT_MAINHAND;
// prevent crash at access and unexpected charges counting with item update queue corrupt
- if(m_CastItem==m_targets.getItemTarget())
+ if (m_CastItem == m_targets.getItemTarget())
m_targets.setItemTarget(NULL);
m_CastItem = NULL;
- player->EquipItem( dest, pNewItem, true);
+ player->EquipItem(dest, pNewItem, true);
player->AutoUnequipOffhandIfNeed();
return;
}
@@ -5032,6 +5088,20 @@ void Spell::EffectScriptEffect(uint32 effIndex)
unitTarget->RemoveMovementImpairingAuras();
break;
}
+ // Plant Warmaul Ogre Banner
+ case 32307:
+ {
+ Player *p_caster = dynamic_cast<Player*>(m_caster);
+ if (!p_caster)
+ break;
+ p_caster->RewardPlayerAndGroupAtEvent(18388, unitTarget);
+ Creature *cTarget = dynamic_cast<Creature*>(unitTarget);
+ if (!cTarget)
+ break;
+ cTarget->setDeathState(CORPSE);
+ cTarget->RemoveCorpse();
+ break;
+ }
// Tidal Surge
case 38358:
if(unitTarget)
@@ -5172,6 +5242,28 @@ void Spell::EffectScriptEffect(uint32 effIndex)
break;
}
+ // Roll Dice - Decahedral Dwarven Dice
+ case 47770:
+ {
+ char buf[128];
+ char *gender = "his";
+ if(m_caster->getGender() > 0)
+ gender = "her";
+ sprintf(buf, "%s rubs %s [Decahedral Dwarven Dice] between %s hands and rolls. One %u and one %u.", m_caster->GetName(), gender, gender, urand(1,10), urand(1,10));
+ m_caster->MonsterTextEmote(buf, 0);
+ break;
+ }
+ // Roll 'dem Bones - Worn Troll Dice
+ case 47776:
+ {
+ char buf[128];
+ char *gender = "his";
+ if(m_caster->getGender() > 0)
+ gender = "her";
+ sprintf(buf, "%s causually tosses %s [Worn Troll Dice]. One %u and one %u.", m_caster->GetName(), gender, urand(1,6), urand(1,6));
+ m_caster->MonsterTextEmote(buf, 0);
+ break;
+ }
// Vigilance
case 50725:
{
@@ -5229,6 +5321,19 @@ void Spell::EffectScriptEffect(uint32 effIndex)
m_originalCaster->CastSpell(m_originalCaster, damage, false);
break;
}
+ // Deathbolt from Thalgran Blightbringer
+ // reflected by Freya's Ward
+ // Retribution by Sevenfold Retribution
+ case 51854:
+ {
+ if (!m_caster || !unitTarget)
+ return;
+ if (unitTarget->HasAura(51845))
+ unitTarget->CastSpell(m_caster, 51856, true);
+ else
+ m_caster->CastSpell(unitTarget, 51855, true);
+ break;
+ }
// Summon Ghouls On Scarlet Crusade
case 51904:
{
@@ -5237,7 +5342,7 @@ void Spell::EffectScriptEffect(uint32 effIndex)
float x, y, z;
float radius = GetSpellRadius(m_spellInfo, effIndex, true);
- for (uint32 i = 0; i < 15; ++i)
+ for (uint8 i = 0; i < 15; ++i)
{
m_caster->GetRandomPoint(m_targets.m_dstPos, radius, x, y, z);
m_caster->CastSpell(x, y, z, 54522, true);