aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp1
-rw-r--r--src/server/game/Chat/Chat.cpp18
-rw-r--r--src/server/game/Chat/Chat.h2
-rw-r--r--src/server/game/DataStores/DBCStores.cpp2
-rw-r--r--src/server/game/DataStores/DBCStores.h1
-rw-r--r--src/server/game/DataStores/DBCStructure.h31
-rw-r--r--src/server/game/DataStores/DBCfmt.h7
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp32
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp2
-rw-r--r--src/server/game/Handlers/NPCHandler.h1
-rw-r--r--src/server/game/Scripting/ScriptMgr.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp61
-rw-r--r--src/server/game/Spells/SpellMgr.h2
15 files changed, 129 insertions, 37 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 3cfa79ed8d0..b82c77f029d 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -1147,6 +1147,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
+ case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
break;
// std case: increment at miscValue1
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 91f62c1a697..0686272f191 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -800,6 +800,24 @@ Creature* ChatHandler::getSelectedCreature()
return ObjectAccessor::GetCreatureOrPetOrVehicle(*m_session->GetPlayer(), m_session->GetPlayer()->GetTarget());
}
+Player* ChatHandler::getSelectedPlayerOrSelf()
+{
+ if (!m_session)
+ return NULL;
+
+ uint64 selected = m_session->GetPlayer()->GetTarget();
+ if (!selected)
+ return m_session->GetPlayer();
+
+ // first try with selected target
+ Player* targetPlayer = ObjectAccessor::FindPlayer(selected);
+ // if the target is not a player, then return self
+ if (!targetPlayer)
+ targetPlayer = m_session->GetPlayer();
+
+ return targetPlayer;
+}
+
char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1)
{
// skip empty
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index eb4c89bb8ea..5c541d07b5a 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -98,6 +98,8 @@ class ChatHandler
Creature* getSelectedCreature();
Unit* getSelectedUnit();
WorldObject* getSelectedObject();
+ // Returns either the selected player or self if there is no selected player
+ Player* getSelectedPlayerOrSelf();
char* extractKeyFromLink(char* text, char const* linkType, char** something1 = NULL);
char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = NULL);
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 5b96f8b8271..9a3e5dcf0fd 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -76,6 +76,7 @@ DBCStorage <ChrRacesEntry> sChrRacesStore(ChrRacesEntryfmt);
DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore(ChrClassesXPowerTypesfmt);
DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore(CinematicSequencesEntryfmt);
DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore(CreatureDisplayInfofmt);
+DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt);
DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt);
DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt);
DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore(CreatureSpellDatafmt);
@@ -376,6 +377,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales, bad_dbc_files, sCinematicSequencesStore, dbcPath, "CinematicSequences.dbc");//15595
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureDisplayInfoStore, dbcPath, "CreatureDisplayInfo.dbc");//15595
+ LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureDisplayInfoExtraStore, dbcPath, "CreatureDisplayInfoExtra.dbc");//15595
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureFamilyStore, dbcPath, "CreatureFamily.dbc");//15595
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureModelDataStore, dbcPath, "CreatureModelData.dbc");//15595
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureSpellDataStore, dbcPath, "CreatureSpellData.dbc");//15595
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index ca91f1da1f2..af7007a17ae 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -103,6 +103,7 @@ extern DBCStorage <ChrRacesEntry> sChrRacesStore;
extern DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore;
extern DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore;
extern DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
+extern DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore;
extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore;
extern DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore;
extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 6a548615c3b..1e5c2093b53 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -726,7 +726,7 @@ struct ChrClassesEntry
struct ChrRacesEntry
{
uint32 RaceID; // 0
- // 1 unused
+ uint32 Flags; // 1
uint32 FactionID; // 2 facton template id
// 3 unused
uint32 model_m; // 4
@@ -780,7 +780,7 @@ struct CreatureDisplayInfoEntry
uint32 Displayid; // 0 m_ID
uint32 ModelId; // 1 m_modelID
// 2 m_soundID
- // 3 m_extendedDisplayInfoID
+ uint32 ExtraId; // 3 m_extendedDisplayInfoID
float scale; // 4 m_creatureModelScale
// 5 m_creatureModelAlpha
// 6-8 m_textureVariation[3]
@@ -794,6 +794,31 @@ struct CreatureDisplayInfoEntry
// 16
};
+struct CreatureDisplayInfoExtraEntry
+{
+ //uint32 Id; // 0
+ uint32 Race; // 1
+ uint32 Gender; // 2
+ //uint32 SkinColor; // 3
+ //uint32 FaceType; // 4
+ //uint32 HairType; // 5
+ //uint32 HairStyle; // 6
+ //uint32 FacialHair; // 7
+ //uint32 HelmDisplayId; // 8
+ //uint32 ShoulderDisplayId; // 9
+ //uint32 ShirtDisplayId; // 10
+ //uint32 ChestDisplayId; // 11
+ //uint32 BeltDisplayId; // 12
+ //uint32 LegsDisplayId; // 13
+ //uint32 BootsDisplayId; // 14
+ //uint32 WristDisplayId; // 15
+ //uint32 GlovesDisplayId; // 16
+ //uint32 TabardDisplayId; // 17
+ //uint32 CloakDisplayId; // 18
+ //uint32 CanEquip; // 19
+ //char const* Texture; // 20
+};
+
struct CreatureFamilyEntry
{
uint32 ID; // 0 m_ID
@@ -812,7 +837,7 @@ struct CreatureFamilyEntry
struct CreatureModelDataEntry
{
uint32 Id;
- //uint32 Flags;
+ uint32 Flags;
//char* ModelPath
//uint32 Unk1;
//float Scale; // Used in calculation of unit collision data
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 4b7f59bf380..41dc6afd4f7 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -40,11 +40,12 @@ char const CharStartOutfitEntryfmt[] = "dbbbXiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxx
char const CharTitlesEntryfmt[] = "nxssix";
char const ChatChannelsEntryfmt[] = "nixsx";
char const ChrClassesEntryfmt[] = "nixsxxxixiiiii";
-char const ChrRacesEntryfmt[] = "nxixiixixxxxixsxxxxxixxx";
+char const ChrRacesEntryfmt[] = "niixiixixxxxixsxxxxxixxx";
char const ChrClassesXPowerTypesfmt[] = "nii";
char const CinematicSequencesEntryfmt[] = "nxxxxxxxxx";
-char const CreatureDisplayInfofmt[] = "nixxfxxxxxxxxxxxx";
-char const CreatureModelDatafmt[] = "nxxxxxxxxxxxxxffxxxxxxxxxxxxxxx";
+char const CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxxx";
+char const CreatureDisplayInfoExtrafmt[] = "diixxxxxxxxxxxxxxxxxx";
+char const CreatureModelDatafmt[] = "nixxxxxxxxxxxxffxxxxxxxxxxxxxxx";
char const CreatureFamilyfmt[] = "nfifiiiiixsx";
char const CreatureSpellDatafmt[] = "niiiixxxx";
char const CreatureTypefmt[] = "nxx";
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3c29288f88a..9b54c1f104b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -25704,7 +25704,7 @@ void Player::HandleFall(MovementInfo const& movementInfo)
if (damageperc > 0)
{
uint32 damage = (uint32)(damageperc * GetMaxHealth()*sWorld->getRate(RATE_DAMAGE_FALL));
-
+
if (GetCommandStatus(CHEAT_GOD))
damage = 0;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 3e19a5f0420..a00a9596f91 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -11311,9 +11311,35 @@ bool Unit::IsInFeralForm() const
bool Unit::IsInDisallowedMountForm() const
{
- ShapeshiftForm form = GetShapeshiftForm();
- return form != FORM_NONE && form != FORM_BATTLESTANCE && form != FORM_BERSERKERSTANCE && form != FORM_DEFENSIVESTANCE &&
- form != FORM_SHADOW && form != FORM_STEALTH && form != FORM_UNDEAD;
+ if (ShapeshiftForm form = GetShapeshiftForm())
+ {
+ SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
+ if (!shapeshift)
+ return true;
+
+ if (!(shapeshift->flags1 & 0x1))
+ return true;
+ }
+
+ if (GetDisplayId() == GetNativeDisplayId())
+ return false;
+
+ CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
+ if (!display)
+ return true;
+
+ CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtraId);
+ if (!displayExtra)
+ return true;
+
+ CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
+ ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->Race);
+
+ if (model && !(model->Flags & 0x80))
+ if (race && !(race->Flags & 0x4))
+ return true;
+
+ return false;
}
/*#######################################
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 47b9e840504..b49fc6a7b26 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -5219,6 +5219,8 @@ void ObjectMgr::LoadGossipText()
gText.Options[i].Text_0 = fields[cic++].GetString();
gText.Options[i].Text_1 = fields[cic++].GetString();
+ gText.Options[i].BroadcastTextID = fields[cic++].GetUInt32(); // Need for correct loading order
+
gText.Options[i].Language = fields[cic++].GetUInt8();
gText.Options[i].Probability = fields[cic++].GetFloat();
diff --git a/src/server/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h
index 8aa34eaafa7..7210d9a53b5 100644
--- a/src/server/game/Handlers/NPCHandler.h
+++ b/src/server/game/Handlers/NPCHandler.h
@@ -31,6 +31,7 @@ struct GossipTextOption
{
std::string Text_0;
std::string Text_1;
+ uint32 BroadcastTextID;
uint32 Language;
float Probability;
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES];
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index 6c79d66b9ca..c9e2a5acd7a 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -387,7 +387,7 @@ class ItemScript : public ScriptObject
// Called when the item expires (is destroyed).
virtual bool OnExpire(Player* /*player*/, ItemTemplate const* /*proto*/) { return false; }
-
+
// Called when the item is destroyed.
virtual bool OnRemove(Player* /*player*/, Item* /*item*/) { return false; }
};
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index a1339f73119..b958adb0d6d 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -6036,7 +6036,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
}
uint32 procAttacker = PROC_FLAG_DONE_PERIODIC;
- uint32 procVictim = PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS;
+ uint32 procVictim = PROC_FLAG_TAKEN_PERIODIC;
uint32 procEx = (crit ? PROC_EX_CRITICAL_HIT : PROC_EX_NORMAL_HIT) | PROC_EX_INTERNAL_HOT;
// ignore item heals
if (!haveCastItem)
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index cbc245ba967..e4f8516839f 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -787,42 +787,61 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellPr
bool hasFamilyMask = false;
- /* Check Periodic Auras
+ /**
- *Dots can trigger if spell has no PROC_FLAG_SUCCESSFUL_NEGATIVE_MAGIC_SPELL
- nor PROC_FLAG_TAKEN_POSITIVE_MAGIC_SPELL
+ * @brief Check auras procced by periodics
- *Only Hots can trigger if spell has PROC_FLAG_TAKEN_POSITIVE_MAGIC_SPELL
+ *Only damaging Dots can proc auras with PROC_FLAG_TAKEN_DAMAGE
- *Only dots can trigger if spell has both positivity flags or PROC_FLAG_SUCCESSFUL_NEGATIVE_MAGIC_SPELL
+ *Both Dots and hots can proc if ONLY has PROC_FLAG_DONE_PERIODIC or PROC_FLAG_TAKEN_PERIODIC. Such auras need support in Unit::HandleAuraProc.
+
+ *Only Dots can proc auras with PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG or PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG
+
+ *Only Hots can proc auras with PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS or PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
+
+ *Only Dots can proc auras with PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG or PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG
+
+ *Only Hots can proc auras with PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS or PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS
+
+ * @param procSpell the spell proccing the aura
+ * @param procFlags proc_flags of spellProc
+ * @param procExtra proc_EX of procSpell
+ * @param EventProcFlag proc_flags of aura to be procced
- *Aura has to have PROC_FLAG_TAKEN_POSITIVE_MAGIC_SPELL or spellfamily specified to trigger from Hot
*/
- if (procFlags & PROC_FLAG_DONE_PERIODIC)
+ /// Quick Check - If PROC_FLAG_TAKEN_DAMAGE is set for aura and procSpell dealt damage, proc no matter what kind of spell that deals the damage.
+ if (procFlags & PROC_FLAG_TAKEN_DAMAGE && EventProcFlag & PROC_FLAG_TAKEN_DAMAGE)
+ return true;
+
+ /// Any aura that has only PROC_FLAG_DONE_PERIODIC or PROC_FLAG_TAKEN_PERIODIC should always proc, if procSpell is correct or not is checked in Unit::HandleAuraProc
+ if (EventProcFlag == PROC_FLAG_DONE_PERIODIC || EventProcFlag == PROC_FLAG_TAKEN_PERIODIC)
+ return true;
+
+ if (procFlags & PROC_FLAG_DONE_PERIODIC && EventProcFlag & PROC_FLAG_DONE_PERIODIC)
{
- if (EventProcFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG)
+ /// Aura must have positive procflags for a HOT to proc
+ if (procExtra & PROC_EX_INTERNAL_HOT)
{
- if (!(procExtra & PROC_EX_INTERNAL_DOT))
+ if (!(EventProcFlag & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)))
return false;
}
- else if (procExtra & PROC_EX_INTERNAL_HOT)
- procExtra |= PROC_EX_INTERNAL_REQ_FAMILY;
- else if (EventProcFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS)
+ /// Aura must have negative procflags for a DOT to proc
+ else if (!(EventProcFlag & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG)))
return false;
}
- if (procFlags & PROC_FLAG_TAKEN_PERIODIC)
+ if (procFlags & PROC_FLAG_TAKEN_PERIODIC && EventProcFlag & PROC_FLAG_TAKEN_PERIODIC)
{
- if (EventProcFlag & PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS)
+ /// Aura must have positive procflags for a HOT to proc
+ if (procExtra & PROC_EX_INTERNAL_HOT)
{
- if (!(procExtra & PROC_EX_INTERNAL_DOT))
+ if (!(EventProcFlag & (PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS)))
return false;
}
- else if (procExtra & PROC_EX_INTERNAL_HOT)
- procExtra |= PROC_EX_INTERNAL_REQ_FAMILY;
- else if (EventProcFlag & PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS)
+ /// Aura must have negative procflags for a DOT to proc
+ else if (!(EventProcFlag & (PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG)))
return false;
}
// Trap casts are active by default
@@ -2989,15 +3008,9 @@ void SpellMgr::LoadSpellInfoCorrections()
switch (spellInfo->Id)
{
- case 42730: // Woe Strike
- spellInfo->Effects[EFFECT_1].TriggerSpell = 42739;
- break;
case 42436: // Drink! (Brewfest)
spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);
break;
- case 59735: // Woe Strike
- spellInfo->Effects[EFFECT_1].TriggerSpell = 59736;
- break;
case 52611: // Summon Skeletons
case 52612: // Summon Skeletons
spellInfo->Effects[EFFECT_0].MiscValueB = 64;
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index 1359b9f2002..b1a3d982409 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -691,7 +691,7 @@ class SpellMgr
// SpellInfo object management
SpellInfo const* GetSpellInfo(uint32 spellId) const { return spellId < GetSpellInfoStoreSize() ? mSpellInfoMap[spellId] : NULL; }
// Use this only with 100% valid spellIds
- SpellInfo const* EnsureSpellInfo(uint32 spellId) const
+ SpellInfo const* EnsureSpellInfo(uint32 spellId) const
{
ASSERT(spellId < GetSpellInfoStoreSize());
SpellInfo const* spellInfo = mSpellInfoMap[spellId];