Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.x
This commit is contained in:
@@ -75,13 +75,16 @@ find_path(MYSQL_INCLUDE_DIR
|
||||
"C:/Program Files/MySQL/include"
|
||||
"C:/Program Files/MySQL/MySQL Server 5.0/include"
|
||||
"C:/Program Files/MySQL/MySQL Server 5.1/include"
|
||||
"C:/Program Files/MySQL/MySQL Server 5.6/include"
|
||||
"C:/MySQL/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/include"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/include"
|
||||
"$ENV{ProgramFiles}/MySQL/*/include"
|
||||
"$ENV{SystemDrive}/MySQL/*/include"
|
||||
"c:/msys/local/include"
|
||||
@@ -115,13 +118,17 @@ if( WIN32 )
|
||||
"C:/Program Files/MySQL/lib"
|
||||
"C:/Program Files/MySQL/MySQL Server 5.0/lib/opt"
|
||||
"C:/Program Files/MySQL/MySQL Server 5.1/lib/opt"
|
||||
"C:/Program Files/MySQL/MySQL Server 5.6/lib/opt"
|
||||
"C:/MySQL/lib/debug"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib/opt"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/lib"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/lib"
|
||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/lib"
|
||||
"$ENV{ProgramFiles}/MySQL/*/lib/opt"
|
||||
"$ENV{SystemDrive}/MySQL/*/lib/opt"
|
||||
"c:/msys/local/include"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
-- Bloodsurge
|
||||
UPDATE `spell_proc_event` SET `procEx` = 0x0040000 WHERE `entry` = 46915;
|
||||
@@ -0,0 +1,23 @@
|
||||
DELETE FROM `achievement_criteria_data` WHERE criteria_id IN (5220, 5215, 5218, 5221, 5216, 5219, 5213, 5018, 5217, 5214, 5233, 5235, 5232, 5234, 5238, 5236, 5229, 5237, 5230, 5231);
|
||||
-- Classes
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5220, 2, 1, 0, ''); -- Realm First! Level 80 Warrior
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5215, 2, 2, 0, ''); -- Realm First! Level 80 Paladin
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5218, 2, 3, 0, ''); -- Realm First! Level 80 Hunter
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5221, 2, 4, 0, ''); -- Realm First! Level 80 Rogue
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5216, 2, 5, 0, ''); -- Realm First! Level 80 Priest
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5219, 2, 6, 0, ''); -- Realm First! Level 80 Death Knight
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5213, 2, 7, 0, ''); -- Realm First! Level 80 Shaman
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5018, 2, 8, 0, ''); -- Realm First! Level 80 Mage
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5217, 2, 9, 0, ''); -- Realm First! Level 80 Warlock
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5214, 2, 11, 0, ''); -- Realm First! Level 80 Druid
|
||||
-- Races
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5233, 2, 0, 1, ''); -- Realm First! Level 80 Human
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5235, 2, 0, 2, ''); -- Realm First! Level 80 Orc
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5232, 2, 0, 3, ''); -- Realm First! Level 80 Dwarf
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5234, 2, 0, 4, ''); -- Realm First! Level 80 Night Elf
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5238, 2, 0, 5, ''); -- Realm First! Level 80 Undead
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5236, 2, 0, 6, ''); -- Realm First! Level 80 Tauren
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5229, 2, 0, 7, ''); -- Realm First! Level 80 Gnome
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5237, 2, 0, 8, ''); -- Realm First! Level 80 Troll
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5230, 2, 0, 10, ''); -- Realm First! Level 80 Blood Elf
|
||||
INSERT INTO `achievement_criteria_data` VALUES (5231, 2, 0, 11, ''); -- Realm First! Level 80 Draenei
|
||||
@@ -0,0 +1,3 @@
|
||||
DELETE FROM `spell_bonus_data` WHERE `entry` IN (52042,5672);
|
||||
INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`ap_dot_bonus`,`comments`) VALUES
|
||||
(5672,0.0827,-1,-1,-1, 'Shaman - Healing Stream Totem Rank 1');
|
||||
@@ -0,0 +1,6 @@
|
||||
DELETE FROM `creature_text` WHERE `entry`=28012;
|
||||
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
|
||||
(28012,0,0,'The trickster Mage-Lord Urom protects the third ring. He will appear alone and defenseless, but do not be fooled by appearences! Urom is a powerful conjurer who commands a menagerie of Phantasmal creatures. Seek him out above.',12,0,0,0,0,0,''),
|
||||
(28012,1,1,'Your greatest challenge lies ahead. Ley-Guardian Eregos is a Blue dragon of immense power. You will find him flying above the uppermost ring.',12,0,0,0,0,0,'');
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_image_belgaristrasz' WHERE `entry`=28012;
|
||||
@@ -0,0 +1,12 @@
|
||||
-- Experienced Drake Rider Achiev
|
||||
|
||||
DELETE FROM `disables` WHERE `entry` IN (7177,7178,7179);
|
||||
|
||||
DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (7177,7178,7179);
|
||||
INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES
|
||||
(7177,5,49460,1,''), -- Amber Drake
|
||||
(7177,12,1,0, ''), -- hc mode only
|
||||
(7178,5,49346,1,''), -- Emerald Drake
|
||||
(7178,12,1,0, ''), -- hc mode only
|
||||
(7179,5,49464,1,''), -- Ruby Drake
|
||||
(7179,12,1,0, ''); -- hc mode only
|
||||
@@ -49,6 +49,7 @@ class GameObjectAI
|
||||
virtual uint32 GetDialogStatus(Player* /*player*/) {return 100;}
|
||||
virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) {}
|
||||
virtual void SetData(uint32 /*id*/, uint32 /*value*/) {}
|
||||
virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) {}
|
||||
};
|
||||
|
||||
class NullGameObjectAI : public GameObjectAI
|
||||
|
||||
@@ -267,6 +267,7 @@ class UnitAI
|
||||
virtual void sQuestComplete(Player* /*player*/, Quest const* /*quest*/) {}
|
||||
virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) {}
|
||||
virtual bool sOnDummyEffect(Unit* /*caster*/, uint32 /*spellId*/, SpellEffIndex /*effIndex*/) { return false; }
|
||||
virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) {}
|
||||
};
|
||||
|
||||
class PlayerAI : public UnitAI
|
||||
|
||||
@@ -811,6 +811,12 @@ void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
|
||||
GetScript()->mLastInvoker = invoker->GetGUID();
|
||||
GetScript()->SetScript9(e, entry);
|
||||
}
|
||||
|
||||
void SmartAI::sOnGameEvent(bool start, uint16 eventId)
|
||||
{
|
||||
GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId);
|
||||
}
|
||||
|
||||
/*
|
||||
SMART_EVENT_UPDATE_OOC
|
||||
SMART_EVENT_SPELLHIT
|
||||
@@ -913,6 +919,11 @@ void SmartGameObjectAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* inv
|
||||
GetScript()->SetScript9(e, entry);
|
||||
}
|
||||
|
||||
void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId)
|
||||
{
|
||||
GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId);
|
||||
}
|
||||
|
||||
class SmartTrigger : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -183,6 +183,7 @@ class SmartAI : public CreatureAI
|
||||
//void sQuestComplete(Player* player, Quest const* quest);
|
||||
void sQuestReward(Player* player, Quest const* quest, uint32 opt);
|
||||
bool sOnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex);
|
||||
void sOnGameEvent(bool start, uint16 eventId);
|
||||
|
||||
uint32 mEscortQuestID;
|
||||
|
||||
@@ -249,6 +250,7 @@ public:
|
||||
void Destroyed(Player* player, uint32 eventId);
|
||||
void SetData(uint32 id, uint32 value);
|
||||
void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
|
||||
void OnGameEvent(bool start, uint16 eventId);
|
||||
|
||||
protected:
|
||||
GameObject* const go;
|
||||
|
||||
@@ -2595,6 +2595,14 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
|
||||
ProcessAction(e, unit, var0, var1);
|
||||
break;
|
||||
}
|
||||
case SMART_EVENT_GAME_EVENT_START:
|
||||
case SMART_EVENT_GAME_EVENT_END:
|
||||
{
|
||||
if (e.event.gameEvent.gameEventId != var0)
|
||||
return;
|
||||
ProcessAction(e, NULL, var0);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
sLog->outErrorDb("SmartScript::ProcessEvent: Unhandled Event type %u", e.GetEventType());
|
||||
break;
|
||||
@@ -2996,7 +3004,9 @@ void SmartScript::SetScript9(SmartScriptHolder& e, uint32 entry)
|
||||
mResumeActionList = e.action.timedActionList.dontResume ? false : true;
|
||||
InitTimer((*i));
|
||||
}
|
||||
}Unit* SmartScript::GetLastInvoker()
|
||||
}
|
||||
|
||||
Unit* SmartScript::GetLastInvoker()
|
||||
{
|
||||
return ObjectAccessor::FindUnit(mLastInvoker);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "CellImpl.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "GameEventMgr.h"
|
||||
|
||||
#include "SmartScriptMgr.h"
|
||||
|
||||
@@ -466,6 +467,14 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
if (!IsMinMaxValid(e, e.event.behindTarget.cooldownMin, e.event.behindTarget.cooldownMax))
|
||||
return false;
|
||||
break;
|
||||
case SMART_EVENT_GAME_EVENT_START:
|
||||
case SMART_EVENT_GAME_EVENT_END:
|
||||
{
|
||||
GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
|
||||
if (e.event.gameEvent.gameEventId >= events.size() || !events[e.event.gameEvent.gameEventId].isValid())
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case SMART_EVENT_TIMED_EVENT_TRIGGERED:
|
||||
case SMART_EVENT_INSTANCE_PLAYER_ENTER:
|
||||
case SMART_EVENT_TRANSPORT_RELOCATE:
|
||||
@@ -492,7 +501,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
case SMART_EVENT_WAYPOINT_RESUMED:
|
||||
case SMART_EVENT_WAYPOINT_STOPPED:
|
||||
case SMART_EVENT_WAYPOINT_ENDED:
|
||||
case SMART_ACTION_PLAYMOVIE:
|
||||
case SMART_EVENT_GOSSIP_SELECT:
|
||||
case SMART_EVENT_GOSSIP_HELLO:
|
||||
case SMART_EVENT_JUST_CREATED:
|
||||
|
||||
@@ -153,8 +153,10 @@ enum SMART_EVENT
|
||||
SMART_EVENT_FOLLOW_COMPLETED = 65, //1 // none
|
||||
SMART_EVENT_DUMMY_EFFECT = 66, //1 // spellId, effectIndex
|
||||
SMART_EVENT_IS_BEHIND_TARGET = 67, //1 // cooldownMin, CooldownMax
|
||||
SMART_EVENT_GAME_EVENT_START = 68, //1 // game_event.Entry
|
||||
SMART_EVENT_GAME_EVENT_END = 69, //1 // game_event.Entry
|
||||
|
||||
SMART_EVENT_END = 68,
|
||||
SMART_EVENT_END = 70,
|
||||
};
|
||||
|
||||
struct SmartEvent
|
||||
@@ -339,6 +341,11 @@ struct SmartEvent
|
||||
uint32 cooldownMax;
|
||||
} behindTarget;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 gameEventId;
|
||||
} gameEvent;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 param1;
|
||||
@@ -1129,7 +1136,9 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
|
||||
{SMART_EVENT_GOSSIP_HELLO, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
|
||||
{SMART_EVENT_FOLLOW_COMPLETED, SMART_SCRIPT_TYPE_MASK_CREATURE },
|
||||
{SMART_EVENT_DUMMY_EFFECT, SMART_SCRIPT_TYPE_MASK_SPELL },
|
||||
{SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE }
|
||||
{SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE },
|
||||
{SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
|
||||
{SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -102,6 +102,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: // only Children's Week achievements
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||
break;
|
||||
default:
|
||||
if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT)
|
||||
@@ -135,13 +136,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||
}
|
||||
if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0)
|
||||
{
|
||||
sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing class in value1 (%u), ignored.",
|
||||
sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.",
|
||||
criteria->ID, criteria->requiredType, dataType, classRace.class_id);
|
||||
return false;
|
||||
}
|
||||
if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0)
|
||||
{
|
||||
sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing race in value2 (%u), ignored.",
|
||||
sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.",
|
||||
criteria->ID, criteria->requiredType, dataType, classRace.race_id);
|
||||
return false;
|
||||
}
|
||||
@@ -450,7 +451,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin
|
||||
continue;
|
||||
|
||||
// don't update already completed criteria if not forced or achievement already complete
|
||||
if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement))
|
||||
if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID))
|
||||
continue;
|
||||
|
||||
for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j)
|
||||
@@ -846,6 +847,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||
if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
|
||||
if (!data->Meets(GetPlayer(), unit))
|
||||
continue;
|
||||
SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||
@@ -1606,9 +1610,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||
}
|
||||
}
|
||||
|
||||
static const uint32 achievIdByClass[MAX_CLASSES] = { 0, 459, 465, 462, 458, 464, 461, 467, 460, 463, 0, 466 };
|
||||
static const uint32 achievIdByRace[MAX_RACES] = { 0, 1408, 1410, 1407, 1409, 1413, 1411, 1404, 1412, 0, 1405, 1406 };
|
||||
|
||||
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement)
|
||||
{
|
||||
// counter can never complete
|
||||
@@ -1633,20 +1634,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||
{
|
||||
// skip wrong class achievements
|
||||
for (int i = 1; i < MAX_CLASSES; ++i)
|
||||
if (achievIdByClass[i] == achievement->ID && i != GetPlayer()->getClass())
|
||||
return false;
|
||||
|
||||
// skip wrong race achievements
|
||||
for (int i = 1; i < MAX_RACES; ++i)
|
||||
if (achievIdByRace[i] == achievement->ID && i != GetPlayer()->getRace())
|
||||
return false;
|
||||
|
||||
// appropriate class/race or not class/race specific
|
||||
return progress->counter >= achievementCriteria->reach_level.level;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||
return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
@@ -1789,7 +1777,7 @@ void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement)
|
||||
return;
|
||||
|
||||
// already completed and stored
|
||||
if (HasAchieved(achievement))
|
||||
if (HasAchieved(achievement->ID))
|
||||
return;
|
||||
|
||||
if (IsCompletedAchievement(achievement))
|
||||
@@ -2023,7 +2011,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
|
||||
if (m_player->isGameMaster())
|
||||
return;
|
||||
|
||||
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement))
|
||||
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID))
|
||||
return;
|
||||
|
||||
SendAchievementEarned(achievement);
|
||||
@@ -2138,9 +2126,9 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
|
||||
*data << int32(-1);
|
||||
}
|
||||
|
||||
bool AchievementMgr::HasAchieved(AchievementEntry const* achievement) const
|
||||
bool AchievementMgr::HasAchieved(uint32 achievementId) const
|
||||
{
|
||||
return m_completedAchievements.find(achievement->ID) != m_completedAchievements.end();
|
||||
return m_completedAchievements.find(achievementId) != m_completedAchievements.end();
|
||||
}
|
||||
|
||||
bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement)
|
||||
@@ -2404,15 +2392,16 @@ void AchievementGlobalMgr::LoadCompletedAchievements()
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 achievement_id = fields[0].GetUInt32();
|
||||
if (!sAchievementStore.LookupEntry(achievement_id))
|
||||
const AchievementEntry* achievement = sAchievementStore.LookupEntry(achievement_id);
|
||||
if (!achievement)
|
||||
{
|
||||
// we will remove not existed achievement for all characters
|
||||
sLog->outError("Non-existing achievement %u data removed from table `character_achievement`.", achievement_id);
|
||||
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE achievement = %u", achievement_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
m_allCompletedAchievements.insert(achievement_id);
|
||||
else if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
|
||||
m_allCompletedAchievements.insert(achievement_id);
|
||||
} while (result->NextRow());
|
||||
|
||||
sLog->outString(">> Loaded %lu completed achievements in %u ms", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
|
||||
@@ -257,7 +257,7 @@ class AchievementMgr
|
||||
void CheckAllAchievementCriteria();
|
||||
void SendAllAchievementData() const;
|
||||
void SendRespondInspectAchievements(Player* player) const;
|
||||
bool HasAchieved(AchievementEntry const* achievement) const;
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
Player* GetPlayer() const { return m_player; }
|
||||
void UpdateTimedAchievements(uint32 timeDiff);
|
||||
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
|
||||
|
||||
@@ -67,11 +67,8 @@ bool Condition::Meets(Player* player, Unit* invoker)
|
||||
break;
|
||||
}
|
||||
case CONDITION_ACHIEVEMENT:
|
||||
{
|
||||
AchievementEntry const* achievement = GetAchievementStore()->LookupEntry(mConditionValue1);
|
||||
condMeets = player->GetAchievementMgr().HasAchieved(achievement);
|
||||
condMeets = player->GetAchievementMgr().HasAchieved(mConditionValue1);
|
||||
break;
|
||||
}
|
||||
case CONDITION_TEAM:
|
||||
condMeets = player->GetTeam() == mConditionValue1;
|
||||
break;
|
||||
|
||||
@@ -465,7 +465,7 @@ enum SummonPropFlags
|
||||
enum VehicleSeatFlags
|
||||
{
|
||||
VEHICLE_SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden
|
||||
VEHICLE_SEAT_FLAG_UNK11 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing
|
||||
VEHICLE_SEAT_FLAG_UNK1 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing
|
||||
VEHICLE_SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat
|
||||
VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL = 0x00001000, // Can cast spells with SPELL_AURA_MOUNTED from seat (possibly 4.x only, 0 seats on 3.3.5a)
|
||||
VEHICLE_SEAT_FLAG_UNCONTROLLED = 0x00002000, // can override !& VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT
|
||||
@@ -473,6 +473,7 @@ enum VehicleSeatFlags
|
||||
VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT = 0x02000000, // Lua_CanExitVehicle - can enter and exit at free will
|
||||
VEHICLE_SEAT_FLAG_CAN_SWITCH = 0x04000000, // Lua_CanSwitchVehicleSeats
|
||||
VEHICLE_SEAT_FLAG_CAN_CAST = 0x20000000, // Lua_UnitHasVehicleUI
|
||||
VEHICLE_SEAT_FLAG_UNK2 = 0x40000000, // checked in conjunction with 0x800 in CastSpell2
|
||||
};
|
||||
|
||||
enum VehicleSeatFlagsB
|
||||
@@ -483,7 +484,6 @@ enum VehicleSeatFlagsB
|
||||
VEHICLE_SEAT_FLAG_B_EJECTABLE = 0x00000020, // ejectable
|
||||
VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 = 0x00000040,
|
||||
VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 = 0x00000100,
|
||||
VEHICLE_SEAT_FLAG_B_CANSWITCH = 0x04000000, // can switch seats
|
||||
VEHICLE_SEAT_FLAG_B_VEHICLE_PLAYERFRAME_UI = 0x80000000, // Lua_UnitHasVehiclePlayerFrameUI - actually checked for flagsb &~ 0x80000000
|
||||
};
|
||||
|
||||
|
||||
@@ -2182,7 +2182,7 @@ struct VehicleSeatEntry
|
||||
// 46-57 added in 3.1, floats mostly
|
||||
|
||||
bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; }
|
||||
bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_B_CANSWITCH; }
|
||||
bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH; }
|
||||
bool IsUsableByOverride() const { return (m_flags & VEHICLE_SEAT_FLAG_UNCONTROLLED)
|
||||
|| (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3)); }
|
||||
bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; }
|
||||
|
||||
@@ -389,7 +389,7 @@ void LFGMgr::InitializeLockedDungeons(Player* player)
|
||||
locktype = LFG_LOCKSTATUS_TOO_HIGH_LEVEL;
|
||||
else if (locktype == LFG_LOCKSTATUS_OK && ar)
|
||||
{
|
||||
if (ar->achievement && !player->GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement)))
|
||||
if (ar->achievement && !player->GetAchievementMgr().HasAchieved(ar->achievement))
|
||||
locktype = LFG_LOCKSTATUS_RAID_LOCKED; // FIXME: Check the correct lock value
|
||||
else if (player->GetTeam() == ALLIANCE && ar->quest_A && !player->GetQuestRewardStatus(ar->quest_A))
|
||||
locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED;
|
||||
|
||||
@@ -2085,28 +2085,6 @@ void Player::SendTeleportAckPacket()
|
||||
GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
// this is not used anywhere
|
||||
void Player::TeleportOutOfMap(Map* oldMap)
|
||||
{
|
||||
while (IsBeingTeleportedFar())
|
||||
GetSession()->HandleMoveWorldportAckOpcode();
|
||||
|
||||
if (GetMap() != oldMap)
|
||||
return;
|
||||
|
||||
TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation());
|
||||
|
||||
while (IsBeingTeleportedFar())
|
||||
GetSession()->HandleMoveWorldportAckOpcode();
|
||||
|
||||
if (GetMap() == oldMap)
|
||||
{
|
||||
sLog->outCrash("Cannot teleport player out of map!");
|
||||
ResetMap();
|
||||
ASSERT(false);
|
||||
}
|
||||
}
|
||||
|
||||
bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options)
|
||||
{
|
||||
if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation))
|
||||
@@ -15033,11 +15011,11 @@ void Player::FailQuest(uint32 questId)
|
||||
// Destroy quest items on quest failure.
|
||||
for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||
if (quest->RequiredItemId[i] > 0 && quest->RequiredItemCount[i] > 0)
|
||||
// Destroy items recieved on starting the quest.
|
||||
// Destroy items received on starting the quest.
|
||||
DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true, true);
|
||||
for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
||||
if (quest->RequiredSourceItemId[i] > 0 && quest->RequiredSourceItemCount[i] > 0)
|
||||
// Destroy items recieved during the quest.
|
||||
// Destroy items received during the quest.
|
||||
DestroyItemCount(quest->RequiredSourceItemId[i], quest->RequiredSourceItemCount[i], true, true);
|
||||
}
|
||||
}
|
||||
@@ -18121,8 +18099,14 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report
|
||||
missingQuest = ar->quest_H;
|
||||
|
||||
uint32 missingAchievement = 0;
|
||||
if (ar->achievement && !GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement)))
|
||||
missingAchievement = ar->achievement;
|
||||
Player* leader = this;
|
||||
uint64 leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
|
||||
if (leaderGuid != GetGUID())
|
||||
leader = ObjectAccessor::FindPlayer(leaderGuid);
|
||||
|
||||
if (ar->achievement)
|
||||
if (!leader || !leader->GetAchievementMgr().HasAchieved(ar->achievement))
|
||||
missingAchievement = ar->achievement;
|
||||
|
||||
Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
|
||||
MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
|
||||
|
||||
@@ -1102,13 +1102,10 @@ class Player : public Unit, public GridObject<Player>
|
||||
void RemoveFromWorld();
|
||||
|
||||
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0);
|
||||
void TeleportOutOfMap(Map* oldMap);
|
||||
|
||||
bool TeleportTo(WorldLocation const &loc, uint32 options = 0)
|
||||
{
|
||||
return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options);
|
||||
}
|
||||
|
||||
bool TeleportToBGEntryPoint();
|
||||
|
||||
void SetSummonPoint(uint32 mapid, float x, float y, float z)
|
||||
|
||||
@@ -1478,9 +1478,13 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s
|
||||
return false;
|
||||
|
||||
// bleeding effects are not reduced by armor
|
||||
if (effIndex != MAX_SPELL_EFFECTS && spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
|
||||
if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<MECHANIC_BLEED))
|
||||
return false;
|
||||
if (effIndex != MAX_SPELL_EFFECTS)
|
||||
{
|
||||
if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
|
||||
spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
|
||||
if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<MECHANIC_BLEED))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -8928,6 +8932,20 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 46916: // Slam! (Bloodsurge proc)
|
||||
case 52437: // Sudden Death
|
||||
{
|
||||
// Item - Warrior T10 Melee 4P Bonus
|
||||
if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
|
||||
{
|
||||
if (!roll_chance_i(aurEff->GetAmount()))
|
||||
break;
|
||||
CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
|
||||
CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
|
||||
CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Sword and Board
|
||||
case 50227:
|
||||
{
|
||||
|
||||
@@ -341,7 +341,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
|
||||
}
|
||||
}
|
||||
|
||||
if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11))
|
||||
if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK1))
|
||||
unit->AddUnitState(UNIT_STAT_ONVEHICLE);
|
||||
|
||||
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
#include "GossipDef.h"
|
||||
#include "Player.h"
|
||||
#include "BattlegroundMgr.h"
|
||||
#include "UnitAI.h"
|
||||
#include "GameObjectAI.h"
|
||||
|
||||
bool GameEventMgr::CheckOneGameEvent(uint16 entry) const
|
||||
{
|
||||
@@ -1059,6 +1061,8 @@ uint32 GameEventMgr::Update() // return the next e
|
||||
void GameEventMgr::UnApplyEvent(uint16 event_id)
|
||||
{
|
||||
sLog->outDetail("GameEvent %u \"%s\" removed.", event_id, mGameEvent[event_id].description.c_str());
|
||||
//! Run SAI scripts with SMART_EVENT_GAME_EVENT_END
|
||||
RunSmartAIScripts(event_id, false);
|
||||
// un-spawn positive event tagged objects
|
||||
GameEventUnspawn(event_id);
|
||||
// spawn negative event tagget objects
|
||||
@@ -1090,6 +1094,9 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id)
|
||||
|
||||
sLog->outDetail("GameEvent %u \"%s\" started.", event_id, mGameEvent[event_id].description.c_str());
|
||||
|
||||
//! Run SAI scripts with SMART_EVENT_GAME_EVENT_END
|
||||
RunSmartAIScripts(event_id, true);
|
||||
|
||||
// spawn positive event tagget objects
|
||||
GameEventSpawn(event_id);
|
||||
// un-spawn negative event tagged objects
|
||||
@@ -1601,6 +1608,26 @@ void GameEventMgr::SendWorldStateUpdate(Player* player, uint16 event_id)
|
||||
}
|
||||
}
|
||||
|
||||
void GameEventMgr::RunSmartAIScripts(uint16 event_id, bool activate)
|
||||
{
|
||||
//! Iterate over every supported source type (creature and gameobject)
|
||||
//! Not entirely sure how this will affect units in non-loaded grids.
|
||||
{
|
||||
TRINITY_READ_GUARD(HashMapHolder<Creature>::LockType, *HashMapHolder<Creature>::GetLock());
|
||||
HashMapHolder<Creature>::MapType const& m = ObjectAccessor::GetCreatures();
|
||||
for (HashMapHolder<Creature>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
|
||||
if (iter->second->IsInWorld())
|
||||
iter->second->AI()->sOnGameEvent(activate, event_id);
|
||||
}
|
||||
{
|
||||
TRINITY_READ_GUARD(HashMapHolder<GameObject>::LockType, *HashMapHolder<GameObject>::GetLock());
|
||||
HashMapHolder<GameObject>::MapType const& m = ObjectAccessor::GetGameObjects();
|
||||
for (HashMapHolder<GameObject>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
|
||||
if (iter->second->IsInWorld())
|
||||
iter->second->AI()->OnGameEvent(activate, event_id);
|
||||
}
|
||||
}
|
||||
|
||||
bool IsHolidayActive(HolidayIds id)
|
||||
{
|
||||
if (id == HOLIDAY_NONE)
|
||||
|
||||
@@ -132,6 +132,7 @@ class GameEventMgr
|
||||
void UpdateEventNPCFlags(uint16 event_id);
|
||||
void UpdateEventNPCVendor(uint16 event_id, bool activate);
|
||||
void UpdateBattlegroundSettings();
|
||||
void RunSmartAIScripts(uint16 event_id, bool activate); //! Runs SMART_EVENT_GAME_EVENT_START/_END SAI
|
||||
bool CheckOneGameEventConditions(uint16 event_id);
|
||||
void SaveWorldEventStateToDB(uint16 event_id);
|
||||
bool hasCreatureQuestActiveEventExcept(uint32 quest_id, uint16 event_id);
|
||||
|
||||
@@ -201,16 +201,16 @@ class ObjectAccessor
|
||||
}
|
||||
|
||||
// when using this, you must use the hashmapholder's lock
|
||||
//HashMapHolder<Creature>::MapType& GetCreatures()
|
||||
//{
|
||||
// return HashMapHolder<Creature>::GetContainer();
|
||||
//}
|
||||
static HashMapHolder<Creature>::MapType const& GetCreatures()
|
||||
{
|
||||
return HashMapHolder<Creature>::GetContainer();
|
||||
}
|
||||
|
||||
//// when using this, you must use the hashmapholder's lock
|
||||
//HashMapHolder<GameObject>::MapType& GetGameObjects()
|
||||
//{
|
||||
// return HashMapHolder<GameObject>::GetContainer();
|
||||
//}
|
||||
// when using this, you must use the hashmapholder's lock
|
||||
static HashMapHolder<GameObject>::MapType const& GetGameObjects()
|
||||
{
|
||||
return HashMapHolder<GameObject>::GetContainer();
|
||||
}
|
||||
|
||||
template<class T> static void AddObject(T* object)
|
||||
{
|
||||
|
||||
@@ -8110,8 +8110,11 @@ bool ObjectMgr::AddGameTele(GameTele& tele)
|
||||
|
||||
m_GameTeleMap[new_id] = tele;
|
||||
|
||||
std::string safeName(tele.name);
|
||||
WorldDatabase.EscapeString(safeName);
|
||||
|
||||
WorldDatabase.PExecute("INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (%u, %f, %f, %f, %f, %d, '%s')",
|
||||
new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, tele.name.c_str());
|
||||
new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, safeName.c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -171,6 +171,7 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32
|
||||
void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay)
|
||||
{
|
||||
Player* pReceiver = receiver.GetPlayer(); // can be NULL
|
||||
Player* pSender = sObjectMgr->GetPlayerByLowGUID(sender.GetSenderId());
|
||||
|
||||
if (pReceiver)
|
||||
prepareItems(pReceiver, trans); // generate mail template items
|
||||
@@ -188,9 +189,12 @@ void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver,
|
||||
// mail from battlemaster (rewardmarks) should last only one day
|
||||
else if (sender.GetMailMessageType() == MAIL_CREATURE && sBattlegroundMgr->GetBattleMasterBG(sender.GetSenderId()) != BATTLEGROUND_TYPE_NONE)
|
||||
expire_delay = DAY;
|
||||
// default case: expire time if COD 3 days, if no COD 30 days
|
||||
// default case: expire time if COD 3 days, if no COD 30 days (or 90 days if sender is a game master)
|
||||
else
|
||||
expire_delay = (m_COD > 0) ? 3 * DAY : 30 * DAY;
|
||||
if (m_COD)
|
||||
expire_delay = 3 * DAY;
|
||||
else
|
||||
expire_delay = pSender && pSender->isGameMaster() ? 90 * DAY : 30 * DAY;
|
||||
|
||||
time_t expire_time = deliver_time + expire_delay;
|
||||
|
||||
|
||||
@@ -322,13 +322,13 @@ enum SpellAttr1
|
||||
SPELL_ATTR1_MELEE_COMBAT_START = 0x00000200, // 9 player starts melee combat after this spell is cast
|
||||
SPELL_ATTR1_NO_THREAT = 0x00000400, // 10 no generates threat on cast 100% (old NO_INITIAL_AGGRO)
|
||||
SPELL_ATTR1_UNK11 = 0x00000800, // 11 aura
|
||||
SPELL_ATTR1_UNK12 = 0x00001000, // 12
|
||||
SPELL_ATTR1_UNK12 = 0x00001000, // 12 pickpoket
|
||||
SPELL_ATTR1_FARSIGHT = 0x00002000, // 13 Client removes farsight on aura loss
|
||||
SPELL_ATTR1_CHANNEL_TRACK_TARGET = 0x00004000, // 14 Client automatically forces player to face target when channeling
|
||||
SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY = 0x00008000, // 15 remove auras on immunity
|
||||
SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE = 0x00010000, // 16 on immuniy
|
||||
SPELL_ATTR1_UNAUTOCASTABLE_BY_PET = 0x00020000, // 17
|
||||
SPELL_ATTR1_UNK18 = 0x00040000, // 18
|
||||
SPELL_ATTR1_UNK18 = 0x00040000, // 18 stun, polymorph, daze, hex
|
||||
SPELL_ATTR1_CANT_TARGET_SELF = 0x00080000, // 19
|
||||
SPELL_ATTR1_REQ_COMBO_POINTS1 = 0x00100000, // 20 Req combo points on target
|
||||
SPELL_ATTR1_UNK21 = 0x00200000, // 21
|
||||
@@ -337,17 +337,17 @@ enum SpellAttr1
|
||||
SPELL_ATTR1_UNK24 = 0x01000000, // 24 only fishing spells
|
||||
SPELL_ATTR1_UNK25 = 0x02000000, // 25
|
||||
SPELL_ATTR1_UNK26 = 0x04000000, // 26 works correctly with [target=focus] and [target=mouseover] macros?
|
||||
SPELL_ATTR1_UNK27 = 0x08000000, // 27
|
||||
SPELL_ATTR1_UNK27 = 0x08000000, // 27 melee spell?
|
||||
SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR = 0x10000000, // 28 client doesn't display these spells in aura bar
|
||||
SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME = 0x20000000, // 29 spell name is displayed in cast bar instead of 'channeling' text
|
||||
SPELL_ATTR1_ENABLE_AT_DODGE = 0x40000000, // 30 Overpower, Wolverine Bite
|
||||
SPELL_ATTR1_ENABLE_AT_DODGE = 0x40000000, // 30 Overpower
|
||||
SPELL_ATTR1_UNK31 = 0x80000000 // 31
|
||||
};
|
||||
|
||||
enum SpellAttr2
|
||||
{
|
||||
SPELL_ATTR2_CAN_TARGET_DEAD = 0x00000001, // 0 can target dead unit or corpse
|
||||
SPELL_ATTR2_UNK1 = 0x00000002, // 1 ? many triggered spells have this flag
|
||||
SPELL_ATTR2_UNK1 = 0x00000002, // 1 vanish, shadowform, Ghost Wolf and other
|
||||
SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS = 0x00000004, // 2 26368 4.0.1 dbc change
|
||||
SPELL_ATTR2_UNK3 = 0x00000008, // 3
|
||||
SPELL_ATTR2_DISPLAY_IN_STANCE_BAR = 0x00000010, // 4 client displays icon in stance bar when learned, even if not shapeshift
|
||||
@@ -356,9 +356,9 @@ enum SpellAttr2
|
||||
SPELL_ATTR2_UNK7 = 0x00000080, // 7
|
||||
SPELL_ATTR2_UNK8 = 0x00000100, // 8 not set in 3.0.3
|
||||
SPELL_ATTR2_UNK9 = 0x00000200, // 9
|
||||
SPELL_ATTR2_UNK10 = 0x00000400, // 10
|
||||
SPELL_ATTR2_UNK10 = 0x00000400, // 10 related to tame
|
||||
SPELL_ATTR2_HEALTH_FUNNEL = 0x00000800, // 11
|
||||
SPELL_ATTR2_UNK12 = 0x00001000, // 12
|
||||
SPELL_ATTR2_UNK12 = 0x00001000, // 12 Cleave, Heart Strike, Maul, Sunder Armor, Swipe
|
||||
SPELL_ATTR2_UNK13 = 0x00002000, // 13 Items enchanted by spells with this flag preserve the enchant to arenas
|
||||
SPELL_ATTR2_UNK14 = 0x00004000, // 14
|
||||
SPELL_ATTR2_UNK15 = 0x00008000, // 15 not set in 3.0.3
|
||||
@@ -368,13 +368,13 @@ enum SpellAttr2
|
||||
SPELL_ATTR2_NOT_NEED_SHAPESHIFT = 0x00080000, // 19 does not necessarly need shapeshift
|
||||
SPELL_ATTR2_UNK20 = 0x00100000, // 20
|
||||
SPELL_ATTR2_DAMAGE_REDUCED_SHIELD = 0x00200000, // 21 for ice blocks, pala immunity buffs, priest absorb shields, but used also for other spells -> not sure!
|
||||
SPELL_ATTR2_UNK22 = 0x00400000, // 22
|
||||
SPELL_ATTR2_UNK22 = 0x00400000, // 22 Ambush, Backstab, Cheap Shot, Death Grip, Garrote, Judgements, Mutilate, Pounce, Ravage, Shiv, Shred
|
||||
SPELL_ATTR2_UNK23 = 0x00800000, // 23 Only mage Arcane Concentration have this flag
|
||||
SPELL_ATTR2_UNK24 = 0x01000000, // 24
|
||||
SPELL_ATTR2_UNK25 = 0x02000000, // 25
|
||||
SPELL_ATTR2_UNK26 = 0x04000000, // 26 unaffected by school immunity
|
||||
SPELL_ATTR2_UNK27 = 0x08000000, // 27
|
||||
SPELL_ATTR2_UNK28 = 0x10000000, // 28 no breaks stealth if it fails??
|
||||
SPELL_ATTR2_UNK28 = 0x10000000, // 28
|
||||
SPELL_ATTR2_CANT_CRIT = 0x20000000, // 29 Spell can't crit
|
||||
SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC = 0x40000000, // 30 spell can trigger even if triggered
|
||||
SPELL_ATTR2_FOOD_BUFF = 0x80000000 // 31 Food or Drink Buff (like Well Fed)
|
||||
@@ -403,7 +403,7 @@ enum SpellAttr3
|
||||
SPELL_ATTR3_IGNORE_HIT_RESULT = 0x00040000, // 18 Spell should always hit its target
|
||||
SPELL_ATTR3_DISABLE_PROC = 0x00080000, // 19 during aura proc no spells can trigger (20178, 20375)
|
||||
SPELL_ATTR3_DEATH_PERSISTENT = 0x00100000, // 20 Death persistent spells
|
||||
SPELL_ATTR3_UNK21 = 0x00200000, // 21
|
||||
SPELL_ATTR3_UNK21 = 0x00200000, // 21 unused
|
||||
SPELL_ATTR3_REQ_WAND = 0x00400000, // 22 Req wand
|
||||
SPELL_ATTR3_UNK23 = 0x00800000, // 23
|
||||
SPELL_ATTR3_REQ_OFFHAND = 0x01000000, // 24 Req offhand weapon
|
||||
@@ -427,7 +427,7 @@ enum SpellAttr4
|
||||
SPELL_ATTR4_NOT_STEALABLE = 0x00000040, // 6 although such auras might be dispellable, they cannot be stolen
|
||||
SPELL_ATTR4_TRIGGERED = 0x00000080, // 7 spells forced to be triggered
|
||||
SPELL_ATTR4_UNK8 = 0x00000100, // 8 ignores taken percent damage mods?
|
||||
SPELL_ATTR4_UNK9 = 0x00000200, // 9
|
||||
SPELL_ATTR4_TRIGGER_ACTIVATE = 0x00000200, // 9 initially disabled / trigger activate from event (Execute, Riposte, Deep Freeze end other)
|
||||
SPELL_ATTR4_SPELL_VS_EXTEND_COST = 0x00000400, // 10 Rogue Shiv have this flag
|
||||
SPELL_ATTR4_UNK11 = 0x00000800, // 11
|
||||
SPELL_ATTR4_UNK12 = 0x00001000, // 12
|
||||
@@ -437,16 +437,16 @@ enum SpellAttr4
|
||||
SPELL_ATTR4_NOT_USABLE_IN_ARENA = 0x00010000, // 16
|
||||
SPELL_ATTR4_USABLE_IN_ARENA = 0x00020000, // 17
|
||||
SPELL_ATTR4_AREA_TARGET_CHAIN = 0x00040000, // 18 (NYI)hits area targets one after another instead of all at once
|
||||
SPELL_ATTR4_UNK19 = 0x00080000, // 19
|
||||
SPELL_ATTR4_UNK19 = 0x00080000, // 19 proc dalayed, after damage or don't proc on absorb?
|
||||
SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER = 0x00100000, // 20 supersedes message "More powerful spell applied" for self casts.
|
||||
SPELL_ATTR4_UNK21 = 0x00200000, // 21
|
||||
SPELL_ATTR4_UNK21 = 0x00200000, // 21 Pally aura, dk presence, dudu form, warrior stance, shadowform, hunter track
|
||||
SPELL_ATTR4_UNK22 = 0x00400000, // 22
|
||||
SPELL_ATTR4_UNK23 = 0x00800000, // 23
|
||||
SPELL_ATTR4_UNK24 = 0x01000000, // 24
|
||||
SPELL_ATTR4_UNK24 = 0x01000000, // 24 some shoot spell
|
||||
SPELL_ATTR4_UNK25 = 0x02000000, // 25 pet scaling auras
|
||||
SPELL_ATTR4_CAST_ONLY_IN_OUTLAND = 0x04000000, // 26 Can only be used in Outland.
|
||||
SPELL_ATTR4_UNK27 = 0x08000000, // 27
|
||||
SPELL_ATTR4_UNK28 = 0x10000000, // 28
|
||||
SPELL_ATTR4_UNK28 = 0x10000000, // 28 Aimed Shot
|
||||
SPELL_ATTR4_UNK29 = 0x20000000, // 29
|
||||
SPELL_ATTR4_UNK30 = 0x40000000, // 30
|
||||
SPELL_ATTR4_UNK31 = 0x80000000 // 31
|
||||
@@ -466,7 +466,7 @@ enum SpellAttr5
|
||||
SPELL_ATTR5_START_PERIODIC_AT_APPLY = 0x00000200, // 9 begin periodic tick at aura apply
|
||||
SPELL_ATTR5_HIDE_DURATION = 0x00000400, // 10 do not send duration to client
|
||||
SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET = 0x00000800, // 11 (NYI) uses target's target as target if original target not valid (intervene for example)
|
||||
SPELL_ATTR5_UNK12 = 0x00001000, // 12
|
||||
SPELL_ATTR5_UNK12 = 0x00001000, // 12 Cleave related?
|
||||
SPELL_ATTR5_HASTE_AFFECT_DURATION = 0x00002000, // 13 haste effects decrease duration of this
|
||||
SPELL_ATTR5_UNK14 = 0x00004000, // 14
|
||||
SPELL_ATTR5_UNK15 = 0x00008000, // 15
|
||||
@@ -480,7 +480,7 @@ enum SpellAttr5
|
||||
SPELL_ATTR5_UNK23 = 0x00800000, // 23
|
||||
SPELL_ATTR5_UNK24 = 0x01000000, // 24
|
||||
SPELL_ATTR5_UNK25 = 0x02000000, // 25
|
||||
SPELL_ATTR5_UNK26 = 0x04000000, // 26
|
||||
SPELL_ATTR5_UNK26 = 0x04000000, // 26 aoe related - Boulder, Cannon, Corpse Explosion, Fire Nova, Flames, Frost Bomb, Living Bomb, Seed of Corruption, Starfall, Thunder Clap, Volley
|
||||
SPELL_ATTR5_UNK27 = 0x08000000, // 27
|
||||
SPELL_ATTR5_UNK28 = 0x10000000, // 28
|
||||
SPELL_ATTR5_UNK29 = 0x20000000, // 29
|
||||
@@ -505,23 +505,23 @@ enum SpellAttr6
|
||||
SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE = 0x00001000, // 12 castable while caster is on vehicle
|
||||
SPELL_ATTR6_CAN_TARGET_INVISIBLE = 0x00002000, // 13 ignore visibility requirement for spell target (phases, invisibility, etc.)
|
||||
SPELL_ATTR6_UNK14 = 0x00004000, // 14
|
||||
SPELL_ATTR6_UNK15 = 0x00008000, // 15 not set in 3.0.3
|
||||
SPELL_ATTR6_UNK15 = 0x00008000, // 15 only 54368, 67892
|
||||
SPELL_ATTR6_UNK16 = 0x00010000, // 16
|
||||
SPELL_ATTR6_UNK17 = 0x00020000, // 17
|
||||
SPELL_ATTR6_UNK17 = 0x00020000, // 17 Mount spell
|
||||
SPELL_ATTR6_CAST_BY_CHARMER = 0x00040000, // 18 client won't allow to cast these spells when unit is not possessed && charmer of caster will be original caster
|
||||
SPELL_ATTR6_UNK19 = 0x00080000, // 19
|
||||
SPELL_ATTR6_UNK20 = 0x00100000, // 20
|
||||
SPELL_ATTR6_UNK19 = 0x00080000, // 19 only 47488, 50782
|
||||
SPELL_ATTR6_UNK20 = 0x00100000, // 20 only 58371, 62218
|
||||
SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS = 0x00200000, // 21 it's only client-side attribute
|
||||
SPELL_ATTR6_UNK22 = 0x00400000, // 22
|
||||
SPELL_ATTR6_UNK22 = 0x00400000, // 22 only 72054
|
||||
SPELL_ATTR6_UNK23 = 0x00800000, // 23
|
||||
SPELL_ATTR6_CAN_TARGET_UNTARGETABLE = 0x01000000, // 24
|
||||
SPELL_ATTR6_UNK25 = 0x02000000, // 25
|
||||
SPELL_ATTR6_UNK26 = 0x04000000, // 26
|
||||
SPELL_ATTR6_UNK25 = 0x02000000, // 25 Exorcism, Flash of Light
|
||||
SPELL_ATTR6_UNK26 = 0x04000000, // 26 related to player castable positive buff
|
||||
SPELL_ATTR6_UNK27 = 0x08000000, // 27
|
||||
SPELL_ATTR6_UNK28 = 0x10000000, // 28
|
||||
SPELL_ATTR6_UNK28 = 0x10000000, // 28 Death Grip
|
||||
SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS = 0x20000000, // 29 ignores done percent damage mods?
|
||||
SPELL_ATTR6_UNK30 = 0x40000000, // 30
|
||||
SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc?
|
||||
SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc? only 2894
|
||||
};
|
||||
|
||||
enum SpellAttr7
|
||||
@@ -530,7 +530,7 @@ enum SpellAttr7
|
||||
SPELL_ATTR7_UNK1 = 0x00000002, // 1 Not set in 3.2.2a.
|
||||
SPELL_ATTR7_REACTIVATE_AT_RESURRECT = 0x00000004, // 2 Paladin's auras and 65607 only.
|
||||
SPELL_ATTR7_IS_CHEAT_SPELL = 0x00000008, // 3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS
|
||||
SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 66109 test spell.
|
||||
SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 47883 (Soulstone Resurrection) and test spell.
|
||||
SPELL_ATTR7_SUMMON_PLAYER_TOTEM = 0x00000020, // 5 Only Shaman player totems.
|
||||
SPELL_ATTR7_UNK6 = 0x00000040, // 6 Dark Surge, Surge of Light, Burning Breath triggers (boss spells).
|
||||
SPELL_ATTR7_UNK7 = 0x00000080, // 7 66218 (Launch) spell.
|
||||
@@ -546,18 +546,18 @@ enum SpellAttr7
|
||||
SPELL_ATTR7_UNK17 = 0x00020000, // 17 Only 27965 (Suicide) spell.
|
||||
SPELL_ATTR7_HAS_CHARGE_EFFECT = 0x00040000, // 18 Only spells that have Charge among effects.
|
||||
SPELL_ATTR7_ZONE_TELEPORT = 0x00080000, // 19 Teleports to specific zones.
|
||||
SPELL_ATTR7_UNK20 = 0x00100000, // 20
|
||||
SPELL_ATTR7_UNK21 = 0x00200000, // 21
|
||||
SPELL_ATTR7_UNK20 = 0x00100000, // 20 Blink, Divine Shield, Ice Block
|
||||
SPELL_ATTR7_UNK21 = 0x00200000, // 21 Not set
|
||||
SPELL_ATTR7_UNK22 = 0x00400000, // 22
|
||||
SPELL_ATTR7_UNK23 = 0x00800000, // 23
|
||||
SPELL_ATTR7_UNK24 = 0x01000000, // 24
|
||||
SPELL_ATTR7_UNK23 = 0x00800000, // 23 Motivate, Mutilate, Shattering Throw
|
||||
SPELL_ATTR7_UNK24 = 0x01000000, // 24 Motivate, Mutilate, Perform Speech, Shattering Throw
|
||||
SPELL_ATTR7_UNK25 = 0x02000000, // 25
|
||||
SPELL_ATTR7_UNK26 = 0x04000000, // 26
|
||||
SPELL_ATTR7_UNK27 = 0x08000000, // 27
|
||||
SPELL_ATTR7_UNK28 = 0x10000000, // 28
|
||||
SPELL_ATTR7_UNK29 = 0x20000000, // 29
|
||||
SPELL_ATTR7_UNK30 = 0x40000000, // 30
|
||||
SPELL_ATTR7_UNK31 = 0x80000000 // 31
|
||||
SPELL_ATTR7_UNK27 = 0x08000000, // 27 Not set
|
||||
SPELL_ATTR7_UNK28 = 0x10000000, // 28 related to player positive buff
|
||||
SPELL_ATTR7_UNK29 = 0x20000000, // 29 only 69028, 71237
|
||||
SPELL_ATTR7_UNK30 = 0x40000000, // 30 Burning Determination, Divine Sacrifice, Earth Shield, Prayer of Mending
|
||||
SPELL_ATTR7_UNK31 = 0x80000000 // 31 only 70769
|
||||
};
|
||||
|
||||
#define MIN_TALENT_SPEC 0
|
||||
|
||||
@@ -115,6 +115,8 @@ void WorldSession::SendAuctionOwnerNotification(AuctionEntry* auction)
|
||||
//this void creates new auction and adds auction to some auctionhouse
|
||||
void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_SELL_ITEM");
|
||||
|
||||
uint64 auctioneer, item;
|
||||
uint32 etime, bid, buyout, count;
|
||||
recv_data >> auctioneer;
|
||||
@@ -253,6 +255,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data)
|
||||
//this function is called when client bids or buys out auction
|
||||
void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_PLACE_BID");
|
||||
|
||||
uint64 auctioneer;
|
||||
uint32 auctionId;
|
||||
uint32 price;
|
||||
@@ -374,6 +378,8 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data)
|
||||
//this void is called when auction_owner cancels his auction
|
||||
void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_REMOVE_ITEM");
|
||||
|
||||
uint64 auctioneer;
|
||||
uint32 auctionId;
|
||||
recv_data >> auctioneer;
|
||||
@@ -452,6 +458,8 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data)
|
||||
//called when player lists his bids
|
||||
void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_BIDDER_ITEMS");
|
||||
|
||||
uint64 guid; //NPC guid
|
||||
uint32 listfrom; //page of auctions
|
||||
uint32 outbiddedCount; //count of outbidded auctions
|
||||
@@ -507,6 +515,8 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data)
|
||||
//this void sends player info about his auctions
|
||||
void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_OWNER_ITEMS");
|
||||
|
||||
uint32 listfrom;
|
||||
uint64 guid;
|
||||
|
||||
@@ -542,6 +552,8 @@ void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data)
|
||||
//this void is called when player clicks on search button
|
||||
void WorldSession::HandleAuctionListItems(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_ITEMS");
|
||||
|
||||
std::string searchedname;
|
||||
uint8 levelmin, levelmax, usable;
|
||||
uint32 listfrom, auctionSlotID, auctionMainCategory, auctionSubCategory, quality;
|
||||
@@ -607,7 +619,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket & recv_data)
|
||||
|
||||
void WorldSession::HandleAuctionListPendingSales(WorldPacket & recv_data)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_LIST_PENDING_SALES");
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_PENDING_SALES");
|
||||
|
||||
recv_data.read_skip<uint64>();
|
||||
|
||||
|
||||
@@ -23,13 +23,15 @@
|
||||
#include "ObjectAccessor.h"
|
||||
#include "CreatureAI.h"
|
||||
#include "ObjectDefines.h"
|
||||
#include "Vehicle.h"
|
||||
#include "VehicleDefines.h"
|
||||
|
||||
void WorldSession::HandleAttackSwingOpcode(WorldPacket & recv_data)
|
||||
void WorldSession::HandleAttackSwingOpcode(WorldPacket& recv_data)
|
||||
{
|
||||
uint64 guid;
|
||||
recv_data >> guid;
|
||||
|
||||
sLog->outStaticDebug("WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid));
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid));
|
||||
|
||||
Unit* pEnemy = ObjectAccessor::GetUnit(*_player, guid);
|
||||
|
||||
@@ -47,6 +49,20 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket & recv_data)
|
||||
return;
|
||||
}
|
||||
|
||||
//! Client explicitly checks the following before sending CMSG_ATTACKSWING packet,
|
||||
//! so we'll place the same check here. Note that it might be possible to reuse this snippet
|
||||
//! in other places as well.
|
||||
if (Vehicle* vehicle = _player->GetVehicle())
|
||||
{
|
||||
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(_player);
|
||||
ASSERT(seat);
|
||||
if (!(seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK))
|
||||
{
|
||||
SendAttackStop(pEnemy);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_player->Attack(pEnemy, true);
|
||||
}
|
||||
|
||||
@@ -55,7 +71,7 @@ void WorldSession::HandleAttackStopOpcode(WorldPacket & /*recv_data*/)
|
||||
GetPlayer()->AttackStop();
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetSheathedOpcode(WorldPacket & recv_data)
|
||||
void WorldSession::HandleSetSheathedOpcode(WorldPacket& recv_data)
|
||||
{
|
||||
uint32 sheathed;
|
||||
recv_data >> sheathed;
|
||||
@@ -79,4 +95,3 @@ void WorldSession::SendAttackStop(Unit const* enemy)
|
||||
data << uint32(0); // unk, can be 1 also
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
|
||||
@@ -4065,9 +4065,6 @@ void Spell::SendChannelUpdate(uint32 time)
|
||||
m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0);
|
||||
}
|
||||
|
||||
if (m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
WorldPacket data(MSG_CHANNEL_UPDATE, 8+4);
|
||||
data.append(m_caster->GetPackGUID());
|
||||
data << uint32(time);
|
||||
|
||||
@@ -1421,11 +1421,19 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
if (!unitTarget)
|
||||
return;
|
||||
// Restorative Totems
|
||||
if (Unit* owner = m_caster->GetOwner())
|
||||
{
|
||||
if (m_triggeredByAuraSpell)
|
||||
damage = int32(owner->SpellHealingBonus(unitTarget, m_triggeredByAuraSpell, damage, HEAL));
|
||||
|
||||
// Restorative Totems
|
||||
if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 338, 1))
|
||||
AddPctN(damage, dummy->GetAmount());
|
||||
|
||||
// Glyph of Healing Stream Totem
|
||||
if (AuraEffect const* aurEff = owner->GetAuraEffect(55456, EFFECT_0))
|
||||
AddPctN(damage, aurEff->GetAmount());
|
||||
}
|
||||
m_caster->CastCustomSpell(unitTarget, 52042, &damage, 0, 0, true, 0, 0, m_originalCasterGUID);
|
||||
return;
|
||||
}
|
||||
@@ -2093,12 +2101,12 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex)
|
||||
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
Player* _player = unitTarget->ToPlayer();
|
||||
Player* player = unitTarget->ToPlayer();
|
||||
uint32 spellToUnlearn = m_spellInfo->Effects[effIndex].TriggerSpell;
|
||||
|
||||
_player->removeSpell(spellToUnlearn);
|
||||
player->removeSpell(spellToUnlearn);
|
||||
|
||||
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", _player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow());
|
||||
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow());
|
||||
}
|
||||
|
||||
void Spell::EffectPowerDrain(SpellEffIndex effIndex)
|
||||
@@ -5820,16 +5828,15 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
|
||||
if (m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||
Player* player = m_caster->ToPlayer();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
Player* _player = m_caster->ToPlayer();
|
||||
|
||||
Item* foodItem = itemTarget;
|
||||
if (!foodItem)
|
||||
return;
|
||||
|
||||
Pet* pet = _player->GetPet();
|
||||
Pet* pet = player->GetPet();
|
||||
if (!pet)
|
||||
return;
|
||||
|
||||
@@ -5843,7 +5850,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
|
||||
ExecuteLogEffectDestroyItem(effIndex, foodItem->GetEntry());
|
||||
|
||||
uint32 count = 1;
|
||||
_player->DestroyItemCount(foodItem, count, true);
|
||||
player->DestroyItemCount(foodItem, count, true);
|
||||
// TODO: fix crash when a spell has two effects, both pointed at the same item target
|
||||
|
||||
m_caster->CastCustomSpell(pet, m_spellInfo->Effects[effIndex].TriggerSpell, &benefit, NULL, NULL, true);
|
||||
@@ -6042,7 +6049,7 @@ void Spell::EffectReputation(SpellEffIndex effIndex)
|
||||
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
Player* _player = unitTarget->ToPlayer();
|
||||
Player* player = unitTarget->ToPlayer();
|
||||
|
||||
int32 rep_change = damage;
|
||||
|
||||
@@ -6059,10 +6066,10 @@ void Spell::EffectReputation(SpellEffIndex effIndex)
|
||||
}
|
||||
|
||||
// Bonus from spells that increase reputation gain
|
||||
float bonus = rep_change * _player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0f; // 10%
|
||||
float bonus = rep_change * player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0f; // 10%
|
||||
rep_change += (int32)bonus;
|
||||
|
||||
_player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
|
||||
player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
|
||||
}
|
||||
|
||||
void Spell::EffectQuestComplete(SpellEffIndex effIndex)
|
||||
@@ -6378,12 +6385,11 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
|
||||
return;
|
||||
|
||||
Player* _player = m_caster->ToPlayer()
|
||||
|
||||
if (!_player)
|
||||
Player* player = m_caster->ToPlayer();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
Pet* pet = _player->GetPet();
|
||||
Pet* pet = player->GetPet();
|
||||
if (!pet || pet->isAlive())
|
||||
return;
|
||||
|
||||
@@ -6391,8 +6397,8 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
|
||||
return;
|
||||
|
||||
float x, y, z;
|
||||
_player->GetPosition(x, y, z);
|
||||
_player->GetMap()->CreatureRelocation(pet, x, y, z, _player->GetOrientation());
|
||||
player->GetPosition(x, y, z);
|
||||
player->GetMap()->CreatureRelocation(pet, x, y, z, player->GetOrientation());
|
||||
|
||||
pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE);
|
||||
pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
|
||||
@@ -6401,7 +6407,7 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
|
||||
pet->SetHealth(pet->CountPctFromMaxHealth(damage));
|
||||
|
||||
//pet->AIM_Initialize();
|
||||
//_player->PetSpellInitialize();
|
||||
//player->PetSpellInitialize();
|
||||
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
|
||||
}
|
||||
|
||||
|
||||
@@ -1129,7 +1129,12 @@ public:
|
||||
|
||||
uint16 drunkMod = drunklevel * 0xFFFF / 100;
|
||||
|
||||
handler->GetSession()->GetPlayer()->SetDrunkValue(drunkMod);
|
||||
Player* target = handler->getSelectedPlayer();
|
||||
if (!target)
|
||||
target = handler->GetSession()->GetPlayer();
|
||||
|
||||
if (target)
|
||||
target->SetDrunkValue(drunkMod);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -341,7 +341,7 @@ class boss_sindragosa : public CreatureScript
|
||||
{
|
||||
if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, me))
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_REWARDED && spellId == spell->Id)
|
||||
if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && spellId == spell->Id)
|
||||
{
|
||||
if (Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true))
|
||||
{
|
||||
|
||||
@@ -289,6 +289,7 @@ public:
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
|
||||
}
|
||||
|
||||
void LeaveCombat()
|
||||
|
||||
@@ -144,8 +144,8 @@ public:
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
|
||||
Talk(SAY_DEATH);
|
||||
DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
|
||||
}
|
||||
private:
|
||||
bool firstCoreEnergize;
|
||||
|
||||
@@ -50,6 +50,12 @@ enum Drakes
|
||||
NPC_ETERNOS = 27659
|
||||
};
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_VAROS = 0,
|
||||
SAY_UROM = 1
|
||||
};
|
||||
|
||||
class npc_oculus_drake : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -174,7 +180,38 @@ public:
|
||||
|
||||
};
|
||||
|
||||
class npc_image_belgaristrasz : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_image_belgaristrasz() : CreatureScript("npc_image_belgaristrasz") { }
|
||||
|
||||
struct npc_image_belgaristraszAI : public ScriptedAI
|
||||
{
|
||||
npc_image_belgaristraszAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
void IsSummonedBy(Unit* summoner)
|
||||
{
|
||||
if (summoner->GetEntry() == NPC_VAROS)
|
||||
{
|
||||
Talk(SAY_VAROS);
|
||||
me->DespawnOrUnsummon(60000);
|
||||
}
|
||||
if (summoner->GetEntry() == NPC_UROM)
|
||||
{
|
||||
Talk(SAY_UROM);
|
||||
me->DespawnOrUnsummon(60000);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_image_belgaristraszAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_oculus()
|
||||
{
|
||||
new npc_oculus_drake();
|
||||
new npc_image_belgaristrasz();
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ enum OculusWorldStates
|
||||
|
||||
enum OculusSpells
|
||||
{
|
||||
SPELL_CENTRIFUGE_SHIELD = 50053
|
||||
SPELL_CENTRIFUGE_SHIELD = 50053,
|
||||
SPELL_DEATH_SPELL = 50415
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -526,7 +526,7 @@ class boss_freya : public CreatureScript
|
||||
{
|
||||
uint8 n = 0;
|
||||
|
||||
// Handling recieved data
|
||||
// Handling received data
|
||||
for (uint8 i = 0; i < 5; ++i) // We have created "instances" for keeping informations about last 6 death lashers - needed because of respawning
|
||||
{
|
||||
deforestation[i][0] = deforestation[(i + 1)][0]; // Time
|
||||
|
||||
@@ -527,7 +527,12 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo)
|
||||
// Query related errors - skip query
|
||||
case 1058: // "Column count doesn't match value count"
|
||||
case 1062: // "Duplicate entry '%s' for key '%d'"
|
||||
case 1054: // "Unknown column '%s' in 'order clause'"
|
||||
return false;
|
||||
|
||||
// Outdated table or database structure - terminate core
|
||||
case 1054: // "Unknown column '%s' in '%s'"
|
||||
case 1146: // "Table '%s' doesn't exist"
|
||||
WPFatal(!errNo, "Your database structure is not up to date. Please make sure you've executed all queries in the sql/updates folders.");
|
||||
return false;
|
||||
|
||||
default:
|
||||
|
||||
@@ -22,11 +22,12 @@
|
||||
#include "Common.h"
|
||||
#include "Log.h"
|
||||
#include <ace/Stack_Trace.h>
|
||||
#include <ace/OS_NS_unistd.h>
|
||||
|
||||
#define WPAssert( assertion ) { if (!(assertion)) { ACE_Stack_Trace st; sLog->outError( "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); assert( #assertion &&0 ); ((void(*)())NULL)();} }
|
||||
#define WPError( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "%\n%s:%i in %s ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); assert( false ); }
|
||||
#define WPWarning( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s WARNING:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); }
|
||||
#define WPFatal( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); assert( #assertion &&0 ); abort(); }
|
||||
#define WPFatal( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); ACE_OS::sleep(10); assert( #assertion &&0 ); abort(); }
|
||||
|
||||
#define ASSERT WPAssert
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user