aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp19
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp2
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h8
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp30
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp103
-rwxr-xr-xsrc/server/shared/Packets/ByteBuffer.h2
6 files changed, 90 insertions, 74 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index a1fb2147cc2..61f848cd04c 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -472,6 +472,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
+ // Special handling for vehicles
+ if (IsUnit(*itr))
+ if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
+ for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
+ if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger))
+ player->AreaExploredOrEventHappens(e.action.quest.quest);
+
if (IsPlayer(*itr))
{
(*itr)->ToPlayer()->AreaExploredOrEventHappens(e.action.quest.quest);
@@ -752,6 +759,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_GROUPEVENTHAPPENS: Player %u, group credit for quest %u",
unit->GetGUIDLow(), e.action.quest.quest);
}
+ // Special handling for vehicles
+ if (Vehicle* vehicle = unit->GetVehicleKit())
+ for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
+ if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger))
+ player->GroupEventHappens(e.action.quest.quest, GetBaseObject());
break;
}
case SMART_ACTION_CALL_CASTEDCREATUREORGO:
@@ -878,6 +890,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
+ // Special handling for vehicles
+ if (IsUnit(*itr))
+ if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
+ for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
+ if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger))
+ player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
+
if (!IsPlayer(*itr))
continue;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index d75ef9aabf2..d8287b68fc5 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1844,7 +1844,7 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth) const
if (obj->IsAlwaysDetectableFor(seer))
return true;
- if (!seer->CanDetectInvisibilityOf(obj))
+ if (!ignoreStealth && !seer->CanDetectInvisibilityOf(obj))
return false;
if (!ignoreStealth && !seer->CanDetectStealthOf(obj))
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index d55d070614a..3b1f47b8f69 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -20,25 +20,21 @@
#define _PLAYER_H
#include "AchievementMgr.h"
-#include "Bag.h"
#include "Common.h"
#include "DatabaseEnv.h"
#include "DBCEnums.h"
#include "GroupReference.h"
-#include "ItemPrototype.h"
#include "Item.h"
#include "MapReference.h"
-#include "NPCHandler.h"
#include "Pet.h"
#include "QuestDef.h"
#include "ReputationMgr.h"
#include "Unit.h"
-#include "Util.h" // for Tokens typedef
#include "WorldSession.h"
#include "SpellMgr.h"
-#include<string>
-#include<vector>
+#include <string>
+#include <vector>
struct Mail;
class Channel;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 6af9ffdf235..245079f2495 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -2950,6 +2950,9 @@ PetLevelInfo const* ObjectMgr::GetPetLevelInfo(uint32 creature_id, uint8 level)
void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
{
+ if (!_playerInfo[race_][class_])
+ return;
+
if (count > 0)
_playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
else
@@ -3193,8 +3196,13 @@ void ObjectMgr::LoadPlayerInfo()
if (PlayerInfo * info = _playerInfo[r][c])
info->spell.push_back(fields[2].GetUInt32());
}
+ else if (PlayerInfo * info = _playerInfo[current_race][current_class])
+ info->spell.push_back(fields[2].GetUInt32());
else
- _playerInfo[current_race][current_class]->spell.push_back(fields[2].GetUInt32());
+ {
+ sLog->outError(LOG_FILTER_SQL, "Wrong race: %u, class: %u combination in `playercreateinfo_spell` table, ignoring.", current_race, current_class);
+ continue;
+ }
++count;
}
@@ -3239,8 +3247,8 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- PlayerInfo* pInfo = _playerInfo[current_race][current_class];
- pInfo->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
+ if (PlayerInfo* info = _playerInfo[current_race][current_class])
+ info->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
++count;
}
@@ -3380,16 +3388,14 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- PlayerInfo* pInfo = _playerInfo[current_race][current_class];
-
- if (!pInfo->levelInfo)
- pInfo->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
-
- PlayerLevelInfo* pLevelInfo = &pInfo->levelInfo[current_level-1];
-
- for (int i = 0; i < MAX_STATS; i++)
+ if (PlayerInfo* info = _playerInfo[current_race][current_class])
{
- pLevelInfo->stats[i] = fields[i+3].GetUInt8();
+ if (!info->levelInfo)
+ info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
+
+ PlayerLevelInfo& levelInfo = info->levelInfo[current_level-1];
+ for (int i = 0; i < MAX_STATS; i++)
+ levelInfo.stats[i] = fields[i+3].GetUInt8();
}
++count;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index db31f91ca63..2bb2b1c3cd7 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -30,7 +30,7 @@
SDName: ruby_sanctum
SDAuthors: Kaelima, Warpten
SD%Complete: 90%
-SDComment: Based on Kaelima's initial work (nearly half of it). Corporeality handling is a pure guess, we lack info.
+SDComment: Based on Kaelima's initial work (half of it). Corporeality handling is a pure guess, we lack info.
SDCategory: Chamber of Aspects
EndScriptData */
@@ -124,13 +124,12 @@ enum Events
// Halion
EVENT_ACTIVATE_FIREWALL = 1,
EVENT_CLEAVE = 2,
- EVENT_FLAME_BREATH = 3,
+ EVENT_BREATH = 3,
EVENT_METEOR_STRIKE = 4,
EVENT_FIERY_COMBUSTION = 5,
EVENT_TAIL_LASH = 6,
// Twilight Halion
- EVENT_DARK_BREATH = 7,
EVENT_SOUL_CONSUMPTION = 8,
// Meteor Strike
@@ -154,12 +153,10 @@ enum Actions
ACTION_METEOR_STRIKE_AOE = 2,
// Halion Controller
- ACTION_PHASE_TWO = 3,
- ACTION_PHASE_THREE = 4,
- ACTION_CLEANUP = 5,
+ ACTION_MONITOR_CORPOREALITY = 3,
// Orb Carrier
- ACTION_SHOOT = 6
+ ACTION_SHOOT = 4
};
enum Phases
@@ -232,9 +229,11 @@ struct generic_halionAI : public BossAI
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
+ me->AddAura(SPELL_TWILIGHT_PRECISION, me);
_canEvade = false;
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
+ events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000));
}
void Reset()
@@ -261,19 +260,20 @@ struct generic_halionAI : public BossAI
DoCastAOE(SPELL_TAIL_LASH);
events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
break;
+ case EVENT_BREATH:
+ DoCast(me, me->GetEntry() == NPC_HALION ? SPELL_FLAME_BREATH : SPELL_DARK_BREATH);
+ events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000));
+ break;
}
}
void UpdateAI(uint32 const diff)
{
- if (!UpdateVictim())
+ if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
while (uint32 eventId = events.ExecuteEvent())
ExecuteEvent(eventId);
@@ -320,7 +320,6 @@ class boss_halion : public CreatureScript
me->SetReactState(REACT_DEFENSIVE);
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->AddAura(SPELL_TWILIGHT_PRECISION, me);
}
void EnterEvadeMode()
@@ -343,7 +342,6 @@ class boss_halion : public CreatureScript
instance->SetBossState(DATA_HALION, IN_PROGRESS);
events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5000);
- events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 12000));
events.ScheduleEvent(EVENT_METEOR_STRIKE, urand(20000, 25000));
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, urand(15000, 18000));
@@ -409,10 +407,6 @@ class boss_halion : public CreatureScript
if (GameObject* flameRing = ObjectAccessor::GetGameObject(*me, instance->GetData64(i)))
instance->HandleGameObject(instance->GetData64(DATA_FLAME_RING), false, flameRing);
break;
- case EVENT_FLAME_BREATH:
- DoCast(me, SPELL_FLAME_BREATH);
- events.ScheduleEvent(EVENT_FLAME_BREATH, 25000);
- break;
case EVENT_METEOR_STRIKE:
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_TWILIGHT_REALM))
@@ -491,7 +485,6 @@ class boss_twilight_halion : public CreatureScript
generic_halionAI::EnterCombat(who);
- events.ScheduleEvent(EVENT_DARK_BREATH, urand(10000, 15000));
events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2);
@@ -555,7 +548,7 @@ class boss_twilight_halion : public CreatureScript
{
case SPELL_TWILIGHT_DIVISION:
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
- controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_THREE);
+ controller->AI()->DoAction(ACTION_MONITOR_CORPOREALITY);
break;
default:
generic_halionAI::SpellHit(who, spell);
@@ -567,10 +560,6 @@ class boss_twilight_halion : public CreatureScript
{
switch (eventId)
{
- case EVENT_DARK_BREATH:
- DoCast(me, SPELL_DARK_BREATH);
- events.ScheduleEvent(EVENT_DARK_BREATH, urand(10000, 15000));
- break;
case EVENT_SOUL_CONSUMPTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_TWILIGHT_REALM))
DoCast(target, SPELL_SOUL_CONSUMPTION);
@@ -611,6 +600,8 @@ class npc_halion_controller : public CreatureScript
_summons.DespawnAll();
_events.Reset();
_materialCorporealityValue = 5;
+ _materialDamageTaken = 0;
+ _twilightDamageTaken = 0;
DoCast(me, SPELL_CLEAR_DEBUFFS);
}
@@ -659,6 +650,34 @@ class npc_halion_controller : public CreatureScript
_events.SetPhase(PHASE_INTRO);
_events.ScheduleEvent(EVENT_START_INTRO, 2000);
break;
+ case ACTION_MONITOR_CORPOREALITY:
+ {
+ for (uint8 itr = DATA_HALION; itr <= DATA_TWILIGHT_HALION; itr++)
+ {
+ Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(itr));
+ if (!halion)
+ continue;
+
+ halion->CastSpell(halion, GetSpell(_materialCorporealityValue, itr == DATA_TWILIGHT_HALION), false);
+ halion->AI()->SetData(DATA_FIGHT_PHASE, PHASE_THREE);
+
+ if (itr == DATA_TWILIGHT_HALION)
+ continue;
+
+ halion->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
+ halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+
+ // Summon Twilight portals
+ DoCast(me, SPELL_SUMMON_EXIT_PORTALS);
+
+ _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1);
+ // Hardcoding doesn't really matter here.
+ _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 50);
+ _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 50);
+
+ _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 7500);
+ }
default:
break;
}
@@ -749,36 +768,8 @@ class npc_halion_controller : public CreatureScript
DoZoneInCombat();
break;
case PHASE_TWO:
- // Timer taken from a 4.3.4 solo video and confirmed by TankSpot's 3.3.5 guide. http://www.tankspot.com/showthread.php?67195-Halion-Encounter-Guide-Live
_events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, 29000);
break;
- case PHASE_THREE:
- _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 5000);
- // Load up corporeality data.
- for (uint8 itr = DATA_HALION; itr <= DATA_TWILIGHT_HALION; itr++)
- {
- Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(itr));
- if (!halion)
- continue;
-
- halion->CastSpell(halion, GetSpell(_materialCorporealityValue, itr == DATA_TWILIGHT_HALION), false);
- halion->AI()->SetData(DATA_FIGHT_PHASE, PHASE_THREE);
-
- if (itr == DATA_TWILIGHT_HALION)
- continue;
-
- halion->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
- halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
-
- // Summon Twilight portals
- DoCast(me, SPELL_SUMMON_EXIT_PORTALS);
-
- _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1);
- // Hardcoding doesn't really matter here.
- _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 50);
- _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 50);
- break;
default:
break;
}
@@ -809,17 +800,21 @@ class npc_halion_controller : public CreatureScript
float damageRatio = float(_materialDamageTaken) / float(_twilightDamageTaken);
CorporealityEvent action = CORPOREALITY_NONE;
- if (damageRatio < 0.98f) // [0 , 0.98[: Corporeality goes down
+ if (damageRatio < 0.98f) // [0 , 0.98[: Corporeality goes down
action = CORPOREALITY_DECREASE;
- else if (0.99f < damageRatio && damageRatio < 1.0f) // ]0.99, 1.01[: Twilight Mending
+ else if (0.99f < damageRatio && damageRatio < 1.01f) // ]0.99, 1.01[: Twilight Mending
action = CORPOREALITY_TWILIGHT_MENDING;
- else if (1.02f < damageRatio) // ]1.02, +oo [: Corporeality goes up
+ else if (1.02f < damageRatio) // ]1.02, +oo [: Corporeality goes up
action = CORPOREALITY_INCREASE;
switch (action)
{
case CORPOREALITY_NONE:
+ {
+ _materialDamageTaken = 0;
+ _twilightDamageTaken = 0;
return;
+ }
case CORPOREALITY_INCREASE:
{
if (_materialCorporealityValue >= (MAX_CORPOREALITY_STATE - 1))
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index 1fa3148504a..e79544e7315 100755
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -372,7 +372,7 @@ class ByteBuffer
lt.tm_mon = (packedDate >> 20) & 0xF;
lt.tm_year = ((packedDate >> 24) & 0x1F) + 100;
- return mktime(&lt) + timezone;
+ return uint32(mktime(&lt) + timezone);
}
ByteBuffer& ReadPackedTime(uint32& time)