*Implement spells: 781, 13280, 32307, 40109, 47770, 47776, 49625, 49634, 51854, 64385, by Warhead
--HG-- branch : trunk
This commit is contained in:
+135
-30
@@ -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()))
|
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
|
// count consumed deadly poison doses at target
|
||||||
Aura *poison = 0;
|
//Aura *poison = 0;
|
||||||
uint32 spellId = aurEff->GetId();
|
uint32 spellId = aurEff->GetId();
|
||||||
uint32 doses = aurEff->GetParentAura()->GetStackAmount();
|
uint32 doses = aurEff->GetParentAura()->GetStackAmount();
|
||||||
if (doses > combo)
|
if (doses > combo)
|
||||||
doses = combo;
|
doses = combo;
|
||||||
for (int i=0; i< doses; i++)
|
for (uint32 i = 0; i < doses; ++i)
|
||||||
unitTarget->RemoveAuraFromStack(spellId);
|
unitTarget->RemoveAuraFromStack(spellId);
|
||||||
damage *= doses;
|
damage *= doses;
|
||||||
damage += int32(((Player*)m_caster)->GetTotalAttackPowerValue(BASE_ATTACK) * 0.03f * 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);
|
m_caster->CastSpell(unitTarget,spell_id,true,NULL);
|
||||||
return;
|
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
|
case 13567: // Dummy Trigger
|
||||||
{
|
{
|
||||||
// can be used for different aura triggering, so select by aura
|
// 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);
|
m_caster->CastCustomSpell(unitTarget, 37675, &basepoints0, NULL, NULL, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case 40109: // Knockdown Fel Cannon: The Bolt
|
||||||
|
{
|
||||||
|
unitTarget->CastSpell(unitTarget, 40075, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
case 40802: // Mingo's Fortune Generator (Mingo's Fortune Giblets)
|
case 40802: // Mingo's Fortune Generator (Mingo's Fortune Giblets)
|
||||||
{
|
{
|
||||||
// selecting one from Bloodstained Fortune item
|
// selecting one from Bloodstained Fortune item
|
||||||
@@ -1159,6 +1176,18 @@ void Spell::EffectDummy(uint32 i)
|
|||||||
m_caster->CastSpell(m_caster, 45088, true);
|
m_caster->CastSpell(m_caster, 45088, true);
|
||||||
return;
|
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
|
case 55004: // Nitro Boosts
|
||||||
if(!m_CastItem) return;
|
if(!m_CastItem) return;
|
||||||
if(roll_chance_i(95)) // Nitro Boosts - success
|
if(roll_chance_i(95)) // Nitro Boosts - success
|
||||||
@@ -1256,6 +1285,7 @@ void Spell::EffectDummy(uint32 i)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case 62324: // Throw Passenger
|
case 62324: // Throw Passenger
|
||||||
|
{
|
||||||
if(m_targets.HasTraj())
|
if(m_targets.HasTraj())
|
||||||
{
|
{
|
||||||
if(Vehicle *vehicle = m_caster->GetVehicleKit())
|
if(Vehicle *vehicle = m_caster->GetVehicleKit())
|
||||||
@@ -1293,6 +1323,15 @@ void Spell::EffectDummy(uint32 i)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
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
|
//All IconID Check in there
|
||||||
@@ -1609,6 +1648,21 @@ void Spell::EffectDummy(uint32 i)
|
|||||||
case SPELLFAMILY_HUNTER:
|
case SPELLFAMILY_HUNTER:
|
||||||
switch(m_spellInfo->Id)
|
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
|
case 23989: // Readiness talent
|
||||||
{
|
{
|
||||||
if(m_caster->GetTypeId() != TYPEID_PLAYER)
|
if(m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||||
@@ -3287,92 +3341,94 @@ void Spell::EffectOpenLock(uint32 effIndex)
|
|||||||
|
|
||||||
void Spell::EffectSummonChangeItem(uint32 i)
|
void Spell::EffectSummonChangeItem(uint32 i)
|
||||||
{
|
{
|
||||||
if(m_caster->GetTypeId() != TYPEID_PLAYER)
|
if (m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Player *player = (Player*)m_caster;
|
Player *player = (Player*)m_caster;
|
||||||
|
|
||||||
// applied only to using item
|
// applied only to using item
|
||||||
if(!m_CastItem)
|
if (!m_CastItem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// ... only to item in own inventory/bank/equip_slot
|
// ... only to item in own inventory/bank/equip_slot
|
||||||
if(m_CastItem->GetOwnerGUID()!=player->GetGUID())
|
if (m_CastItem->GetOwnerGUID() != player->GetGUID())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32 newitemid = m_spellInfo->EffectItemType[i];
|
uint32 newitemid = m_spellInfo->EffectItemType[i];
|
||||||
if(!newitemid)
|
if (!newitemid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint16 pos = m_CastItem->GetPos();
|
uint16 pos = m_CastItem->GetPos();
|
||||||
|
|
||||||
Item *pNewItem = Item::CreateItem( newitemid, 1, player);
|
Item *pNewItem = Item::CreateItem(newitemid, 1, player);
|
||||||
if( !pNewItem )
|
if (!pNewItem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (uint8 j= PERM_ENCHANTMENT_SLOT; j<=TEMP_ENCHANTMENT_SLOT; ++j)
|
for (uint8 j = PERM_ENCHANTMENT_SLOT; j <= TEMP_ENCHANTMENT_SLOT; ++j)
|
||||||
{
|
if (m_CastItem->GetEnchantmentId(EnchantmentSlot(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)));
|
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));
|
double loosePercent = 1 - m_CastItem->GetUInt32Value(ITEM_FIELD_DURABILITY) / double(m_CastItem->GetUInt32Value(ITEM_FIELD_MAXDURABILITY));
|
||||||
player->DurabilityLoss(pNewItem, loosePercent);
|
player->DurabilityLoss(pNewItem, loosePercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( player->IsInventoryPos( pos ) )
|
if (player->IsInventoryPos(pos))
|
||||||
{
|
{
|
||||||
ItemPosCountVec dest;
|
ItemPosCountVec dest;
|
||||||
uint8 msg = player->CanStoreItem( m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true );
|
uint8 msg = player->CanStoreItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true );
|
||||||
if( msg == EQUIP_ERR_OK )
|
if (msg == EQUIP_ERR_OK)
|
||||||
{
|
{
|
||||||
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
|
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
|
||||||
|
|
||||||
// prevent crash at access and unexpected charges counting with item update queue corrupt
|
// 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_targets.setItemTarget(NULL);
|
||||||
|
|
||||||
m_CastItem = NULL;
|
m_CastItem = NULL;
|
||||||
|
|
||||||
player->StoreItem( dest, pNewItem, true);
|
player->StoreItem(dest, pNewItem, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( player->IsBankPos ( pos ) )
|
else if (player->IsBankPos(pos))
|
||||||
{
|
{
|
||||||
ItemPosCountVec dest;
|
ItemPosCountVec dest;
|
||||||
uint8 msg = player->CanBankItem( m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true );
|
uint8 msg = player->CanBankItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), dest, pNewItem, true);
|
||||||
if( msg == EQUIP_ERR_OK )
|
if (msg == EQUIP_ERR_OK)
|
||||||
{
|
{
|
||||||
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
|
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
|
||||||
|
|
||||||
// prevent crash at access and unexpected charges counting with item update queue corrupt
|
// 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_targets.setItemTarget(NULL);
|
||||||
|
|
||||||
m_CastItem = NULL;
|
m_CastItem = NULL;
|
||||||
|
|
||||||
player->BankItem( dest, pNewItem, true);
|
player->BankItem(dest, pNewItem, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( player->IsEquipmentPos ( pos ) )
|
else if (player->IsEquipmentPos(pos))
|
||||||
{
|
{
|
||||||
uint16 dest;
|
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
|
// 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_targets.setItemTarget(NULL);
|
||||||
|
|
||||||
m_CastItem = NULL;
|
m_CastItem = NULL;
|
||||||
|
|
||||||
player->EquipItem( dest, pNewItem, true);
|
player->EquipItem(dest, pNewItem, true);
|
||||||
player->AutoUnequipOffhandIfNeed();
|
player->AutoUnequipOffhandIfNeed();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -5032,6 +5088,20 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
|||||||
unitTarget->RemoveMovementImpairingAuras();
|
unitTarget->RemoveMovementImpairingAuras();
|
||||||
break;
|
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
|
// Tidal Surge
|
||||||
case 38358:
|
case 38358:
|
||||||
if(unitTarget)
|
if(unitTarget)
|
||||||
@@ -5172,6 +5242,28 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
|||||||
|
|
||||||
break;
|
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
|
// Vigilance
|
||||||
case 50725:
|
case 50725:
|
||||||
{
|
{
|
||||||
@@ -5229,6 +5321,19 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
|||||||
m_originalCaster->CastSpell(m_originalCaster, damage, false);
|
m_originalCaster->CastSpell(m_originalCaster, damage, false);
|
||||||
break;
|
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
|
// Summon Ghouls On Scarlet Crusade
|
||||||
case 51904:
|
case 51904:
|
||||||
{
|
{
|
||||||
@@ -5237,7 +5342,7 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
|||||||
|
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
float radius = GetSpellRadius(m_spellInfo, effIndex, true);
|
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->GetRandomPoint(m_targets.m_dstPos, radius, x, y, z);
|
||||||
m_caster->CastSpell(x, y, z, 54522, true);
|
m_caster->CastSpell(x, y, z, 54522, true);
|
||||||
|
|||||||
Reference in New Issue
Block a user