mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
*Implement spells: 781, 13280, 32307, 40109, 47770, 47776, 49625, 49634, 51854, 64385, by Warhead
--HG-- branch : trunk
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user