aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp8
-rw-r--r--src/game/Creature.cpp12
-rw-r--r--src/game/CreatureAI.cpp9
-rw-r--r--src/game/DynamicObject.cpp13
-rw-r--r--src/game/DynamicObject.h8
-rw-r--r--src/game/GridNotifiersImpl.h21
-rw-r--r--src/game/Spell.cpp22
-rw-r--r--src/game/Spell.h2
-rw-r--r--src/game/SpellAuras.cpp54
-rw-r--r--src/game/SpellEffects.cpp12
-rw-r--r--src/game/Unit.cpp54
-rw-r--r--src/game/Unit.h5
-rw-r--r--src/shared/Util.cpp3
13 files changed, 141 insertions, 82 deletions
diff --git a/src/bindings/scripts/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp b/src/bindings/scripts/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp
index bf18962607f..3e898cc7e50 100644
--- a/src/bindings/scripts/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp
+++ b/src/bindings/scripts/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp
@@ -145,8 +145,9 @@ Waypoint m_aVesp[]=
{3227.268, 533.238, 59.995}
};
+#define MAX_WAYPOINT 6
//points around raid "isle", counter clockwise. should probably be adjusted to be more alike
-Waypoint m_aDragonCommon[]=
+Waypoint m_aDragonCommon[6]=
{
{3214.012, 468.932, 98.652},
{3244.950, 468.427, 98.652},
@@ -700,8 +701,9 @@ struct TRINITY_DLL_DECL dummy_dragonAI : public ScriptedAI
{
if (m_uiMoveNextTimer < uiDiff)
{
- m_creature->GetMotionMaster()->MovePoint(m_uiWaypointId,
- m_aDragonCommon[m_uiWaypointId].m_fX, m_aDragonCommon[m_uiWaypointId].m_fY, m_aDragonCommon[m_uiWaypointId].m_fZ);
+ if(m_uiWaypointId < MAX_WAYPOINT)
+ m_creature->GetMotionMaster()->MovePoint(m_uiWaypointId,
+ m_aDragonCommon[m_uiWaypointId].m_fX, m_aDragonCommon[m_uiWaypointId].m_fY, m_aDragonCommon[m_uiWaypointId].m_fZ);
debug_log("dummy_dragonAI: %s moving to point %u", m_creature->GetName(), m_uiWaypointId);
m_uiMoveNextTimer = 0;
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 3e857a34acc..6b018a6254f 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1706,8 +1706,16 @@ bool Creature::canStartAttack(Unit const* who, bool force) const
// TODO: should switch to range attack
return false;
- if(!force && (IsNeutralToAll() || !IsWithinDistInMap(who, GetAttackDistance(who) + m_CombatDistance)))
- return false;
+ if(!force)
+ {
+ if(who->isInCombat())
+ if(Unit *victim = who->getAttackerForHelper())
+ if(IsWithinDistInMap(victim, sWorld.getConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS)))
+ force = true;
+
+ if(!force && (IsNeutralToAll() || !IsWithinDistInMap(who, GetAttackDistance(who) + m_CombatDistance)))
+ return false;
+ }
if(!canCreatureAttack(who, force))
return false;
diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp
index 13889812e4c..20acf216c82 100644
--- a/src/game/CreatureAI.cpp
+++ b/src/game/CreatureAI.cpp
@@ -110,11 +110,10 @@ void CreatureAI::MoveInLineOfSight(Unit *who)
if(me->canStartAttack(who, false))
AttackStart(who);
- else if(who->getVictim() && me->IsFriendlyTo(who)
- && me->IsWithinDistInMap(who, sWorld.getConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS))
- //&& me->canStartAttack(who->getVictim(), true))
- && me->canStartAttack(who->getVictim(), false)) // TODO: if we use true, it will not attack it when it arrives
- me->GetMotionMaster()->MoveChase(who->getVictim());
+ //else if(who->getVictim() && me->IsFriendlyTo(who)
+ // && me->IsWithinDistInMap(who, sWorld.getConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS))
+ // && me->canStartAttack(who->getVictim(), true)) // TODO: if we use true, it will not attack it when it arrives
+ // me->GetMotionMaster()->MoveChase(who->getVictim());
}
void CreatureAI::SelectNearestTarget(Unit *who)
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp
index 7316bb58884..34b009bc7d4 100644
--- a/src/game/DynamicObject.cpp
+++ b/src/game/DynamicObject.cpp
@@ -53,7 +53,7 @@ void DynamicObject::RemoveFromWorld()
///- Remove the dynamicObject from the accessor
if(IsInWorld())
{
- if(m_effIndex == 4)
+ if(m_isWorldObject)
{
if(Unit *caster = GetCaster())
{
@@ -70,7 +70,7 @@ void DynamicObject::RemoveFromWorld()
}
}
-bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32 effIndex, float x, float y, float z, int32 duration, float radius )
+bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, uint32 effMask, float x, float y, float z, int32 duration, float radius, bool active)
{
SetMap(caster->GetMap());
@@ -78,7 +78,7 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32
if(!IsPositionValid())
{
- sLog.outError("DynamicObject (spell %u eff %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)",spellId,effIndex,GetPositionX(),GetPositionY());
+ sLog.outError("DynamicObject (spell %u eff %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)",spellId,effMask,GetPositionX(),GetPositionY());
return false;
}
@@ -97,12 +97,11 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32
m_aliveDuration = duration;
m_radius = radius;
- m_effIndex = effIndex;
+ m_effMask = effMask;
m_spellId = spellId;
m_updateTimer = 0;
- if(m_effIndex == 4)
- m_isWorldObject = true;
+ m_isWorldObject = active;
return true;
}
@@ -129,7 +128,7 @@ void DynamicObject::Update(uint32 p_time)
else
deleteThis = true;
- if(m_effIndex < 4)
+ if(m_effMask)
{
if(m_updateTimer < p_time)
{
diff --git a/src/game/DynamicObject.h b/src/game/DynamicObject.h
index 22009b92d14..94985f247d7 100644
--- a/src/game/DynamicObject.h
+++ b/src/game/DynamicObject.h
@@ -35,11 +35,13 @@ class DynamicObject : public WorldObject
void AddToWorld();
void RemoveFromWorld();
- bool Create(uint32 guidlow, Unit *caster, uint32 spellId, uint32 effIndex, float x, float y, float z, int32 duration, float radius);
+ bool Create(uint32 guidlow, Unit *caster, uint32 spellId, uint32 effMask, float x, float y, float z, int32 duration, float radius, bool active);
void Update(uint32 p_time);
void Delete();
uint32 GetSpellId() const { return m_spellId; }
- uint32 GetEffIndex() const { return m_effIndex; }
+ uint32 GetEffectMask() const { return m_effMask; }
+ void AddEffect(uint32 effIndex) { m_effMask |= (1<<effIndex); }
+ bool HasEffect(uint32 effIndex) const { return m_effMask & (1<<effIndex); }
uint32 GetDuration() const { return m_aliveDuration; }
uint64 GetCasterGUID() const { return GetUInt64Value(DYNAMICOBJECT_CASTER); }
Unit* GetCaster() const;
@@ -59,7 +61,7 @@ class DynamicObject : public WorldObject
GridReference<DynamicObject> &GetGridRef() { return m_gridRef; }
protected:
uint32 m_spellId;
- uint32 m_effIndex;
+ uint32 m_effMask;
int32 m_aliveDuration;
uint32 m_updateTimer;
time_t m_nextThinkTime;
diff --git a/src/game/GridNotifiersImpl.h b/src/game/GridNotifiersImpl.h
index 7deeb2ec5fd..23b781cab4c 100644
--- a/src/game/GridNotifiersImpl.h
+++ b/src/game/GridNotifiersImpl.h
@@ -178,8 +178,16 @@ inline void Trinity::DynamicObjectUpdater::VisitHelper(Unit* target)
if (i_dynobject.IsAffecting(target))
return;
- uint32 eff_index = i_dynobject.GetEffIndex();
- if(target->HasAuraEffect(i_dynobject.GetSpellId(), eff_index, i_check->GetGUID()))
+ if(target->HasAura(i_dynobject.GetSpellId(), i_check->GetGUID()))
+ return;
+
+
+ uint32 eff_index = 0;
+ for(; eff_index < MAX_SPELL_EFFECTS; ++eff_index)
+ if(i_dynobject.HasEffect(eff_index))
+ break;
+
+ if(eff_index == MAX_SPELL_EFFECTS)
return;
SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_dynobject.GetSpellId());
@@ -207,11 +215,12 @@ inline void Trinity::DynamicObjectUpdater::VisitHelper(Unit* target)
// Check target immune to spell or aura
if (target->IsImmunedToSpell(spellInfo) || target->IsImmunedToSpellEffect(spellInfo, eff_index))
return;
- // Apply PersistentAreaAura on target
- if(Aura *aur = target->AddAuraEffect(spellInfo, eff_index, &i_dynobject, i_dynobject.GetCaster()))
- aur->SetAuraDuration(i_dynobject.GetDuration());
- i_dynobject.AddAffected(target);
+ // Apply PersistentAreaAura on target
+ Aura *aur = new Aura(spellInfo, i_dynobject.GetEffectMask(), target, &i_dynobject, i_check);
+ aur->SetAuraDuration(i_dynobject.GetDuration());
+ if(target->AddAura(aur, true))
+ i_dynobject.AddAffected(target);
}
template<>
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 863530d953a..b766f3d75af 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -450,6 +450,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
m_preCastSpell = 0;
m_triggeredByAuraSpell = NULL;
m_spellAura = NULL;
+ m_spellDynObj = NULL;
//Auto Shot & Shoot (wand)
m_autoRepeat = IsAutoRepeatRangedSpell(m_spellInfo);
@@ -4487,17 +4488,6 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_BAD_TARGETS;
}
}
-
- // Some special spells with non-caster only mode
-
- // Fire Shield
- if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&
- m_spellInfo->SpellIconID == 16)
- return SPELL_FAILED_BAD_TARGETS;
-
- // Focus Magic (main spell)
- if (m_spellInfo->Id == 54646)
- return SPELL_FAILED_BAD_TARGETS;
}
// check pet presents
@@ -6048,13 +6038,9 @@ void Spell::DelayedChannel()
}
}
- for(int j = 0; j < 3; ++j)
- {
- // partially interrupt persistent area auras
- DynamicObject* dynObj = m_caster->GetDynObject(m_spellInfo->Id, j);
- if(dynObj)
- dynObj->Delay(delaytime);
- }
+ // partially interrupt persistent area auras
+ if(DynamicObject* dynObj = m_caster->GetDynObject(m_spellInfo->Id))
+ dynObj->Delay(delaytime);
SendChannelUpdate(m_timer);
}
diff --git a/src/game/Spell.h b/src/game/Spell.h
index d100f9e6ee2..93b383bed3d 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -27,6 +27,7 @@
class Unit;
class Player;
class GameObject;
+class DynamicObject;
class Aura;
enum SpellCastTargetFlags
@@ -555,6 +556,7 @@ class Spell
GameObject* gameObjTarget;
int32 damage;
Aura * m_spellAura; // only used in DoAllEffectOnTarget
+ DynamicObject *m_spellDynObj; // only used in DoAllEffectOnTarget
// this is set in Spell Hit, but used in Apply Aura handler
DiminishingLevels m_diminishLevel;
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 6952b9d7859..bbed9ef9858 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -1006,14 +1006,59 @@ void Aura::HandleAuraSpecificMods(bool apply)
}
}
}
- // Sprint (skip non player casted spells by category)
else if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_ROGUE)
{
+ // Sprint (skip non player casted spells by category)
if(GetSpellProto()->SpellFamilyFlags[0] & 0x40 && GetSpellProto()->Category == 44)
// in official maybe there is only one icon?
if(m_target->HasAura(58039)) // Glyph of Blurred Speed
m_target->CastSpell(m_target, 61922, true); // Sprint (waterwalk)
}
+ else if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
+ {
+ // Frost Fever and Blood Plague
+ if(GetSpellProto()->SpellFamilyFlags[2] & 0x2)
+ {
+ // Can't proc on self
+ if (GetCasterGUID() == m_target->GetGUID())
+ return;
+ Unit * caster = GetCaster();
+ if (!caster)
+ return;
+
+ AuraEffect * aurEff = NULL;
+ // Ebon Plaguebringer / Crypt Fever
+ Unit::AuraEffectList const& TalentAuras = caster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
+ for(Unit::AuraEffectList::const_iterator itr = TalentAuras.begin(); itr != TalentAuras.end(); ++itr)
+ {
+ if ((*itr)->GetMiscValue() == 7282)
+ {
+ aurEff = *itr;
+ // Ebon Plaguebringer - end search if found
+ if ((*itr)->GetSpellProto()->SpellIconID == 1766)
+ break;
+ }
+ }
+ if (aurEff)
+ {
+ uint32 spellId = 0;
+ switch (aurEff->GetId())
+ {
+ // Ebon Plague
+ case 51161: spellId = 51735; break;
+ case 51160: spellId = 51734; break;
+ case 51099: spellId = 51726; break;
+ // Crypt Fever
+ case 49632: spellId = 50510; break;
+ case 49631: spellId = 50509; break;
+ case 49032: spellId = 50508; break;
+ default:
+ sLog.outError("Unknown rank of Crypt Fever/Ebon Plague %d", aurEff->GetId());
+ }
+ caster->CastSpell(m_target, spellId, true, 0, GetPartAura(0));
+ }
+ }
+ }
else
{
switch(GetId())
@@ -1809,21 +1854,20 @@ bool Aura::CanBeSaved() const
bool Aura::IsPersistent() const
{
+ return IS_DYNAMICOBJECT_GUID(m_sourceGuid);
+ /*
for(uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- {
if(m_partAuras[i] && m_partAuras[i]->IsPersistent())
return true;
- }
return false;
+ */
}
bool Aura::IsAreaAura() const
{
for(uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- {
if(m_partAuras[i] && m_partAuras[i]->IsAreaAura())
return true;
- }
return false;
}
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index b23efd27312..24a1a5c104a 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -2926,6 +2926,13 @@ void Spell::EffectCreateRandomItem(uint32 i)
void Spell::EffectPersistentAA(uint32 i)
{
+ if(m_spellDynObj)
+ {
+ assert(ObjectAccessor::GetObjectInWorld(m_spellDynObj->GetGUID(), (DynamicObject*)NULL) == m_spellDynObj);
+ m_spellDynObj->AddEffect(i);
+ return;
+ }
+
float radius = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if(Player* modOwner = m_originalCaster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RADIUS, radius);
@@ -2933,7 +2940,7 @@ void Spell::EffectPersistentAA(uint32 i)
Unit *caster = m_caster->GetEntry() == WORLD_TRIGGER ? m_originalCaster : m_caster;
int32 duration = GetSpellDuration(m_spellInfo);
DynamicObject* dynObj = new DynamicObject;
- if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, i, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius))
+ if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, 1<<i, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius, false))
{
delete dynObj;
return;
@@ -2941,6 +2948,7 @@ void Spell::EffectPersistentAA(uint32 i)
dynObj->SetUInt32Value(DYNAMICOBJECT_BYTES, 0x01eeeeee);
caster->AddDynObject(dynObj);
dynObj->GetMap()->Add(dynObj);
+ m_spellDynObj = dynObj;
}
void Spell::EffectEnergize(uint32 i)
@@ -3718,7 +3726,7 @@ void Spell::EffectAddFarsight(uint32 i)
float radius = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
int32 duration = GetSpellDuration(m_spellInfo);
DynamicObject* dynObj = new DynamicObject;
- if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, 4, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius))
+ if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, 0, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius, true))
{
delete dynObj;
return;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 1afbcbc652b..b19c88ba376 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -4109,6 +4109,10 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
++m_removedAurasCount;
+ if(Aur->IsPersistent())
+ if(DynamicObject *dynObj = ObjectAccessor::GetObjectInWorld(Aur->GetSourceGUID(), (DynamicObject*)NULL))
+ dynObj->RemoveAffected(this);
+
Aur->UnregisterSingleCastAura();
if(Aur->GetSpellProto()->AuraInterruptFlags)
@@ -4428,24 +4432,6 @@ void Unit::RemoveAllDynObjects()
}
}
-DynamicObject * Unit::GetDynObject(uint32 spellId, uint32 effIndex)
-{
- for (DynObjectGUIDs::iterator i = m_dynObjGUIDs.begin(); i != m_dynObjGUIDs.end();)
- {
- DynamicObject* dynObj = GetMap()->GetDynamicObject(*i);
- if(!dynObj)
- {
- i = m_dynObjGUIDs.erase(i);
- continue;
- }
-
- if (dynObj->GetSpellId() == spellId && dynObj->GetEffIndex() == effIndex)
- return dynObj;
- ++i;
- }
- return NULL;
-}
-
DynamicObject * Unit::GetDynObject(uint32 spellId)
{
for (DynObjectGUIDs::iterator i = m_dynObjGUIDs.begin(); i != m_dynObjGUIDs.end();)
@@ -14489,17 +14475,12 @@ void Unit::HandleAuraEffect(AuraEffect * aureff, bool apply)
{
if (!aureff->IsApplied())
return;
+
aureff->SetApplied(false);
// remove from list before mods removing (prevent cyclic calls, mods added before including to aura list - use reverse order)
m_modAuras[aureff->GetAuraName()].remove(aureff);
aureff->ApplyModifier(false, true);
- Unit * caster = aureff->GetParentAura()->GetCaster();
- if(caster && aureff->IsPersistent())
- {
- DynamicObject *dynObj = caster->GetDynObject(aureff->GetId(), aureff->GetEffIndex());
- if (dynObj)
- dynObj->RemoveAffected(this);
- }
+
// Remove all triggered by aura spells vs unlimited duration
aureff->CleanupTriggeredSpells();
}
@@ -14844,8 +14825,9 @@ void Unit::ExitVehicle()
BuildHeartBeatMsg(&data);
SendMessageToSet(&data, false);
- if(vehicle->GetBase()->GetOwnerGUID() == GetGUID())
- vehicle->Dismiss();
+ if(vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
+ if(((Minion*)vehicle->GetBase())->GetOwner() == this)
+ vehicle->Dismiss();
}
void Unit::BuildMovementPacket(ByteBuffer *data) const
@@ -15069,22 +15051,38 @@ void Unit::RewardRage( uint32 damage, uint32 weaponSpeedHitFactor, bool attacker
ModifyPower(POWER_RAGE, uint32(addRage*10));
}
-void Unit::OutDebugInfo()
+void Unit::OutDebugInfo() const
{
sLog.outError("Unit::OutDebugInfo");
sLog.outString("GUID "UI64FMTD", entry %u, type %u, name %s", GetGUID(), GetEntry(), (uint32)GetTypeId(), GetName());
sLog.outString("OwnerGUID "UI64FMTD", MinionGUID "UI64FMTD", CharmerGUID "UI64FMTD", CharmedGUID "UI64FMTD, GetOwnerGUID(), GetMinionGUID(), GetCharmerGUID(), GetCharmGUID());
+ sLog.outString("In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
+
sLog.outStringInLine("Summon Slot: ");
for(uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
sLog.outStringInLine(UI64FMTD", ", m_SummonSlot[i]);
sLog.outString();
+
sLog.outStringInLine("Controlled List: ");
for(ControlList::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
sLog.outStringInLine(UI64FMTD", ", (*itr)->GetGUID());
sLog.outString();
+
sLog.outStringInLine("Aura List: ");
for(AuraMap::const_iterator itr = m_Auras.begin(); itr != m_Auras.end(); ++itr)
sLog.outStringInLine("%u, ", itr->first);
sLog.outString();
+
+ if(IsVehicle())
+ {
+ sLog.outStringInLine("Passenger List: ");
+ for(SeatMap::iterator itr = GetVehicleKit()->m_Seats.begin(); itr != GetVehicleKit()->m_Seats.end(); ++itr)
+ if(Unit *passenger = itr->second.passenger)
+ sLog.outStringInLine(UI64FMTD", ", passenger->GetGUID());
+ sLog.outString();
+ }
+
+ if(GetVehicle())
+ sLog.outString("On vehicle %u.", GetVehicleBase()->GetEntry());
}
diff --git a/src/game/Unit.h b/src/game/Unit.h
index fad4dd2d41c..b1a0c6e4d8c 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1101,7 +1101,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
{
m_attackers.erase(pAttacker);
}
- Unit * getAttackerForHelper() // If someone wants to help, who to give them
+ Unit * getAttackerForHelper() const // If someone wants to help, who to give them
{
if (getVictim() != NULL)
return getVictim();
@@ -1688,7 +1688,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void setTransForm(uint32 spellid) { m_transform = spellid;}
uint32 getTransForm() const { return m_transform;}
- DynamicObject* GetDynObject(uint32 spellId, uint32 effIndex);
DynamicObject* GetDynObject(uint32 spellId);
void AddDynObject(DynamicObject* dynObj);
void RemoveDynObject(uint32 spellid);
@@ -1869,7 +1868,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
virtual float GetFollowAngle() const { return M_PI/2; }
- void OutDebugInfo();
+ void OutDebugInfo() const;
virtual bool isBeingLoaded() const { return false;}
protected:
explicit Unit ();
diff --git a/src/shared/Util.cpp b/src/shared/Util.cpp
index c0c8dc62b9d..41ed9c0fa8b 100644
--- a/src/shared/Util.cpp
+++ b/src/shared/Util.cpp
@@ -158,6 +158,9 @@ void stripLineInvisibleChars(std::string &str)
if(wpos < str.size())
str.erase(wpos,str.size());
+ if(str.find("|TInterface")!=std::string::npos)
+ str.clear();
+
}
std::string secsToTimeString(uint32 timeInSecs, bool shortText, bool hoursOnly)