Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
SpellEffectsMisc.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "AccountMgr.h"
7#include "AreaTrigger.h"
8#include "Battleground.h"
9#include "BattlegroundMgr.h"
10#include "BattlePetMgr.h"
11#include "CellImpl.h"
12#include "Common.h"
13#include "Creature.h"
14#include "CreatureAI.h"
15#include "DatabaseEnv.h"
16#include "DynamicObject.h"
17#include "Formulas.h"
18#include "GameObject.h"
19#include "GameObjectAI.h"
20#include "GossipDef.h"
21#include "GridNotifiers.h"
22#include "GridNotifiersImpl.h"
23#include "Group.h"
24#include "Guild.h"
25#include "GuildMgr.h"
26#include "InstanceScript.h"
27#include "Language.h"
28#include "Log.h"
29#include "MapManager.h"
30#include "ObjectAccessor.h"
31#include "ObjectMgr.h"
32#include "Opcodes.h"
33#include "OutdoorPvPMgr.h"
34#include "PathGenerator.h"
35#include "Pet.h"
36#include "Player.h"
37#include "ReputationMgr.h"
38#include "ScriptMgr.h"
39#include "SharedDefines.h"
40#include "SkillDiscovery.h"
41#include "SkillExtraItems.h"
42#include "SocialMgr.h"
43#include "Spell.h"
44#include "SpellAuraEffects.h"
45#include "SpellAuras.h"
46#include "SpellMgr.h"
47#include "SpellValidation.h"
48#include "TemporarySummon.h"
49#include "Totem.h"
50#include "Unit.h"
51#include "UpdateData.h"
52#include "UpdateMask.h"
53#include "Util.h"
54#include "Vehicle.h"
55#include "VMapFactory.h"
56#include "World.h"
57#include "WorldPacket.h"
58
60{
62 return;
63
64 if (!unitTarget || m_caster->GetTypeId() != TypeID::TYPEID_PLAYER || unitTarget->GetTypeId() != TypeID::TYPEID_PLAYER)
65 return;
66
67 Player* caster = m_caster->ToPlayer();
68 Player* target = unitTarget->ToPlayer();
69
70 // caster or target already have requested duel
71 if (caster->duel || target->duel || !target->GetSocial() || target->GetSocial()->HasIgnore(caster->GetGUIDLow()))
72 return;
73
74 // Players can only fight a duel in zones with this flag
75 AreaTableEntry const* casterAreaEntry = GetAreaEntryByAreaID(caster->GetAreaId());
76 if (casterAreaEntry && !(casterAreaEntry->m_flags & AREA_FLAG_ALLOW_DUELS))
77 {
78 SendCastResult(SpellCastResult::SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here
79 return;
80 }
81
82 AreaTableEntry const* targetAreaEntry = GetAreaEntryByAreaID(target->GetAreaId());
83 if (targetAreaEntry && !(targetAreaEntry->m_flags & AREA_FLAG_ALLOW_DUELS))
84 {
85 SendCastResult(SpellCastResult::SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here
86 return;
87 }
88
89 //CREATE DUEL FLAG OBJECT
90 GameObject* pGameObj = new GameObject;
91
92 uint32 gameobject_id = m_spellInfo->Effects[effIndex].MiscValue;
93
94 Map* map = m_caster->GetMap();
95 if (!pGameObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), gameobject_id,
96 map,
97 m_caster->GetPositionX() + (unitTarget->GetPositionX() - m_caster->GetPositionX()) / 2,
98 m_caster->GetPositionY() + (unitTarget->GetPositionY() - m_caster->GetPositionY()) / 2,
99 m_caster->GetPositionZ(),
100 m_caster->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0, GOState::GO_STATE_READY))
101 {
102 delete pGameObj;
103 return;
104 }
105
106 for (auto phase : m_caster->GetPhases())
107 pGameObj->SetPhased(phase, false, true);
108
110 pGameObj->SetUInt32Value(GAMEOBJECT_FIELD_LEVEL, m_caster->getLevel() + 1);
111 int32 duration = m_spellInfo->GetDuration();
112 pGameObj->SetRespawnTime(duration > 0 ? duration / IN_MILLISECONDS : 0);
113 pGameObj->SetSpellId(m_spellInfo->Id);
114
115 ExecuteLogEffectSummonObject(effIndex, pGameObj);
116
117 m_caster->AddGameObject(pGameObj);
118 map->AddToMap(pGameObj);
119 //END
120
121 // Send request
122 ObjectGuid arbiterGuid = pGameObj->GetGUID();
123 ObjectGuid casterGuid = caster->GetGUID();
124
125 WorldPacket data(SMSG_DUEL_REQUESTED, 8 + 8);
126 data.WriteGuidMask(arbiterGuid, 5);
127 data.WriteGuidMask(casterGuid, 4, 2, 7);
128 data.WriteGuidMask(arbiterGuid, 0);
129 data.WriteGuidMask(casterGuid, 5);
130 data.WriteGuidMask(arbiterGuid, 4, 6);
131 data.WriteGuidMask(casterGuid, 1, 3, 6);
132 data.WriteGuidMask(arbiterGuid, 7, 3, 2, 1);
133 data.WriteGuidMask(casterGuid, 0);
134
135 data.WriteGuidBytes(arbiterGuid, 5, 3);
136 data.WriteGuidBytes(casterGuid, 7, 4);
137 data.WriteGuidBytes(arbiterGuid, 7);
138 data.WriteGuidBytes(casterGuid, 3, 6, 0);
139 data.WriteGuidBytes(arbiterGuid, 4);
140 data.WriteGuidBytes(casterGuid, 2, 1);
141 data.WriteGuidBytes(arbiterGuid, 0, 2, 6, 1);
142 data.WriteGuidBytes(casterGuid, 5);
143
144 caster->GetSession()->SendPacket(&data);
145 target->GetSession()->SendPacket(&data);
146
147 // create duel-info
148 DuelInfo* duel = new DuelInfo;
149 duel->initiator = caster;
150 duel->opponent = target;
151 duel->startTime = 0;
152 duel->startTimer = 0;
153 duel->isMounted = (GetSpellInfo()->Id == 62875); // Mounted Duel
154 caster->duel = duel;
155
156 DuelInfo* duel2 = new DuelInfo;
157 duel2->initiator = caster;
158 duel2->opponent = caster;
159 duel2->startTime = 0;
160 duel2->startTimer = 0;
161 duel2->isMounted = (GetSpellInfo()->Id == 62875); // Mounted Duel
162 target->duel = duel2;
163
166
167 sScriptMgr->OnPlayerDuelRequest(target, caster);
168}
169
171{
173 return;
174
175 if (!unitTarget || unitTarget->GetTypeId() != TypeID::TYPEID_PLAYER)
176 return;
177
178 Player* player = unitTarget->ToPlayer();
179 uint8 currentDrunk = player->GetDrunkValue();
180 uint8 drunkMod = damage;
181 if (currentDrunk + drunkMod > 100)
182 {
183 currentDrunk = 100;
184 if (rand_chance() < 25.0f)
185 player->CastSpell(player, 67468, false); // Drunken Vomit
186 }
187 else
188 currentDrunk += drunkMod;
189
190 player->SetDrunkValue(currentDrunk, m_CastItem ? m_CastItem->GetEntry() : 0);
191}
192
194{
196 return;
197
199 ObjectGuid CasterGUID = m_caster->GetGUID();
200 data.WriteGuidMask(CasterGUID, 6, 2, 0, 4, 7, 1, 3, 5);
201 data.WriteGuidBytes(CasterGUID, 4, 0, 3, 5, 2, 7, 6, 1);
202 m_caster->SendMessageToSet(&data, true);
203}
204
206{
208 return;
209
210 SF_LOG_DEBUG("spells", "Effect: SkinPlayerCorpse");
211
212 Player* player = m_caster->ToPlayer();
213 Player* target = unitTarget->ToPlayer();
214 if (!player || !target || target->IsAlive())
215 return;
216
217 target->RemovedInsignia(player);
218}
219
221{
223 return;
224
225 if (m_caster->GetTypeId() != TypeID::TYPEID_PLAYER)
226 return;
227
228 Player* p_caster = m_caster->ToPlayer();
229 uint32 button_id = m_spellInfo->Effects[effIndex].MiscValue + 132;
230 uint32 n_buttons = m_spellInfo->Effects[effIndex].MiscValueB;
231
232 for (; n_buttons; --n_buttons, ++button_id)
233 {
234 ActionButton const* ab = p_caster->GetActionButton(button_id);
236 continue;
237
240 uint32 spell_id = ab->GetAction();
241 if (!spell_id)
242 continue;
243
244 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
245 if (!spellInfo)
246 continue;
247
248 if (!p_caster->HasSpell(spell_id) || p_caster->HasSpellCooldown(spell_id))
249 continue;
250
252 continue;
253
254 int32 cost = m_powerCost;
255 if (m_caster->GetPower(POWER_MANA) < cost)
256 continue;
257
259 m_caster->CastSpell(m_caster, spell_id, triggerFlags);
260 }
261}
@ IN_MILLISECONDS
Definition Common.h:125
@ AREA_FLAG_ALLOW_DUELS
Definition DBCEnums.h:303
AreaTableEntry const * GetAreaEntryByAreaID(uint32 area_id)
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
@ GO_STATE_READY
Definition GameObject.h:577
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
@ TYPEID_PLAYER
Definition Object.h:55
@ HIGHGUID_GAMEOBJECT
#define sObjectMgr
Definition ObjectMgr.h:1617
#define sScriptMgr
Definition ScriptMgr.h:764
SpellEffIndex
@ POWER_MANA
@ SPELL_ATTR9_SUMMON_PLAYER_TOTEM
@ SPELL_EFFECT_HANDLE_HIT
Definition Spell.h:276
@ SPELL_EFFECT_HANDLE_HIT_TARGET
Definition Spell.h:277
#define sSpellMgr
Definition SpellMgr.h:744
TriggerCastFlags
Definition Unit.h:415
@ TRIGGERED_CAST_DIRECTLY
Will ignore combo point requirement.
Definition Unit.h:424
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will ignore aura scaling.
Definition Unit.h:422
@ TRIGGERED_IGNORE_GCD
Not triggered.
Definition Unit.h:417
@ GAMEOBJECT_FIELD_LEVEL
@ GAMEOBJECT_FIELD_FACTION_TEMPLATE
@ PLAYER_FIELD_DUEL_ARBITER
double rand_chance(void)
Definition Util.cpp:55
void WriteGuidBytes(const ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:264
void WriteGuidMask(const ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:248
bool Create(uint32 guidlow, uint32 name_id, Map *map, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, GOState go_state, uint32 artKit=0)
void SetRespawnTime(int32 respawn)
Definition GameObject.h:699
bool SetPhased(uint32 id, bool update, bool apply) OVERRIDE
void SetSpellId(uint32 id)
Definition GameObject.h:682
Definition Map.h:238
bool AddToMap(T *)
Definition Map.cpp:504
uint64 GetGUID() const
Definition Object.h:119
uint32 GetGUIDLow() const
Definition Object.h:120
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:1038
void SetUInt64Value(uint16 index, uint64 value)
Definition Object.cpp:1079
uint8 GetDrunkValue() const
Definition Player.h:2594
bool HasSpellCooldown(uint32 spell_id) const
Definition Player.cpp:17498
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId=0)
Definition Player.cpp:1357
WorldSession * GetSession() const
Definition Player.h:2417
ActionButton const * GetActionButton(uint8 button)
Definition Player.cpp:6834
PlayerSocial * GetSocial()
Definition Player.h:1346
bool HasSpell(uint32 spell) const override
Definition Player.cpp:4674
void RemovedInsignia(Player *looterPlr)
Definition Player.cpp:9282
DuelInfo * duel
Definition Player.h:2253
bool HasIgnore(uint32 ignore_guid)
SpellInfo const * GetSpellInfo() const
Definition Spell.h:565
void EffectInebriate(SpellEffIndex effIndex)
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE, Opcodes opcode=SMSG_CAST_FAILED)
Definition Spell.cpp:3874
int32 damage
Definition Spell.h:630
void ExecuteLogEffectSummonObject(uint8 effIndex, WorldObject *obj)
Definition Spell.cpp:4970
SpellEffectHandleMode effectHandleMode
Definition Spell.h:631
Unit *const m_caster
Definition Spell.h:581
void EffectDuel(SpellEffIndex effIndex)
void EffectCastButtons(SpellEffIndex effIndex)
Unit * unitTarget
Definition Spell.h:626
void EffectForceDeselect(SpellEffIndex effIndex)
Item * m_CastItem
Definition Spell.h:531
int32 m_powerCost
Definition Spell.h:597
SpellInfo const *const m_spellInfo
Definition Spell.h:530
void EffectSkinPlayerCorpse(SpellEffIndex effIndex)
uint32 Id
Definition SpellInfo.h:160
uint32 AttributesEx9
Definition SpellInfo.h:173
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
bool IsAlive() const
Definition Unit.h:2032
uint32 GetAreaId() const
Definition Object.cpp:1602
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
@ SMSG_CLEAR_TARGET
Definition Opcodes.h:616
@ SMSG_DUEL_REQUESTED
Definition Opcodes.h:644
uint32 GetAction() const
Definition Player.h:367
ActionButtonType GetType() const
Definition Player.h:359
uint32 m_flags
bool isMounted
Definition Player.h:463
Player * opponent
Definition Player.h:459
time_t startTimer
Definition Player.h:460
Player * initiator
Definition Player.h:458
time_t startTime
Definition Player.h:461