aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Corpse.cpp2
-rw-r--r--src/game/Creature.cpp2
-rw-r--r--src/game/Creature.h2
-rw-r--r--src/game/DynamicObject.cpp2
-rw-r--r--src/game/GameObject.cpp2
-rw-r--r--src/game/GridDefines.h4
-rw-r--r--src/game/Object.cpp10
-rw-r--r--src/game/Object.h2
-rw-r--r--src/game/Player.cpp12
-rw-r--r--src/game/Player.h2
-rw-r--r--src/game/Spell.cpp13
-rw-r--r--src/game/SpellEffects.cpp48
-rw-r--r--src/game/Unit.cpp28
-rw-r--r--src/game/Unit.h4
-rw-r--r--src/shared/Config/dotconfpp/dotconfpp.cpp5
-rw-r--r--src/trinitycore/trinitycore.conf.dist12
16 files changed, 102 insertions, 48 deletions
diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp
index 63e6933cc56..989ccd61151 100644
--- a/src/game/Corpse.cpp
+++ b/src/game/Corpse.cpp
@@ -211,5 +211,5 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields)
bool Corpse::isVisibleForInState(Player const* u, bool inVisibleList) const
{
- return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f));
+ return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false);
}
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 7802dcd2922..f59acb0739b 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1522,7 +1522,7 @@ void Creature::DeleteFromDB()
WorldDatabase.CommitTransaction();
}
-bool Creature::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+bool Creature::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance) const
{
// not in world
if(!IsInWorld() || !u->IsInWorld())
diff --git a/src/game/Creature.h b/src/game/Creature.h
index b85c74d31b8..d7d63574554 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -557,7 +557,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
CreatureSpellCooldowns m_CreatureCategoryCooldowns;
uint32 m_GlobalCooldown;
- bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
+ bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance = true) const;
bool IsWithinSightDist(Unit const* u) const;
bool canStartAttack(Unit const* u) const;
float GetAttackDistance(Unit const* pl) const;
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp
index 672870f223c..18e1d4ee720 100644
--- a/src/game/DynamicObject.cpp
+++ b/src/game/DynamicObject.cpp
@@ -169,6 +169,6 @@ void DynamicObject::Delay(int32 delaytime)
bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const
{
return IsInWorld() && u->IsInWorld()
- && (IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f))
+ && (IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false)
|| GetCasterGUID() == u->GetGUID());
}
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 3a11bf95c35..7008798b806 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -732,7 +732,7 @@ bool GameObject::isVisibleForInState(Player const* u, bool inVisibleList) const
// check distance
return IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject() +
- (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f) );
+ (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false);
}
void GameObject::Respawn()
diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h
index 2a37ef2b542..54dd2d02920 100644
--- a/src/game/GridDefines.h
+++ b/src/game/GridDefines.h
@@ -43,10 +43,10 @@ class Player;
#define MIN_GRID_DELAY MINUTE*1000
#define MIN_MAP_UPDATE_DELAY 50
-#define MAX_NUMBER_OF_CELLS 8
+#define MAX_NUMBER_OF_CELLS 4
#define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS)
-#define CENTER_GRID_CELL_ID 256
+#define CENTER_GRID_CELL_ID 128
#define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2)
#define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS)
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index cc754f32bd3..35a021ac7c7 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -1094,14 +1094,18 @@ float WorldObject::GetDistanceZ(const WorldObject* obj) const
return ( dist > 0 ? dist : 0);
}
-bool WorldObject::IsWithinDistInMap(const WorldObject* obj, const float dist2compare) const
+bool WorldObject::IsWithinDistInMap(const WorldObject* obj, const float dist2compare, const bool is3D) const
{
if (!obj || !IsInMap(obj)) return false;
float dx = GetPositionX() - obj->GetPositionX();
float dy = GetPositionY() - obj->GetPositionY();
- float dz = GetPositionZ() - obj->GetPositionZ();
- float distsq = dx*dx + dy*dy + dz*dz;
+ float distsq = dx*dx + dy*dy;
+ if(is3D)
+ {
+ float dz = GetPositionZ() - obj->GetPositionZ();
+ distsq += dz*dz;
+ }
float sizefactor = GetObjectSize() + obj->GetObjectSize();
float maxdist = dist2compare + sizefactor;
diff --git a/src/game/Object.h b/src/game/Object.h
index 731e788783f..2fcd6692288 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -410,7 +410,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object
float GetDistance2d(const float x, const float y) const;
float GetDistanceZ(const WorldObject* obj) const;
bool IsInMap(const WorldObject* obj) const { return GetMapId()==obj->GetMapId() && GetInstanceId()==obj->GetInstanceId(); }
- bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare) const;
+ bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare, const bool is3D = true) const;
bool IsWithinLOS(const float x, const float y, const float z ) const;
bool IsWithinLOSInMap(const WorldObject* obj) const;
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 05204fe9c78..ac250640025 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -17459,7 +17459,7 @@ void Player::ReportedAfkBy(Player* reporter)
}
}
-bool Player::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+bool Player::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance) const
{
// Always can see self
if (u == this)
@@ -17498,24 +17498,24 @@ bool Player::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) cons
// different visible distance checks
if(isInFlight()) // what see player in flight
{
- if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
+ if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), is3dDistance))
return false;
}
else if(!u->isAlive()) // distance for show body
{
- if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
+ if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), is3dDistance))
return false;
}
else if(u->GetTypeId()==TYPEID_PLAYER) // distance for show player
{
// Players far than max visible distance for player or not in our map are not visible too
- if (!at_same_transport && !target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
+ if (!at_same_transport && !target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
return false;
}
else if(u->GetCharmerOrOwnerGUID()) // distance for show pet/charmed
{
// Pet/charmed far than max visible distance for player or not in our map are not visible too
- if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
+ if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
return false;
}
else // distance for show creature
@@ -17523,7 +17523,7 @@ bool Player::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) cons
// Units far than max visible distance for creature or not in our map are not visible too
if (!target->IsWithinDistInMap(u, u->isActive()
? (MAX_VISIBILITY_DISTANCE - (inVisibleList ? 0.0f : World::GetVisibleUnitGreyDistance()))
- : (World::GetMaxVisibleDistanceForCreature() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))))
+ : (World::GetMaxVisibleDistanceForCreature() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance)))
return false;
}
diff --git a/src/game/Player.h b/src/game/Player.h
index df3edc91f4f..67aab9f74fc 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1996,7 +1996,7 @@ class TRINITY_DLL_SPEC Player : public Unit
bool HaveAtClient(WorldObject const* u) const { return u==this || m_clientGUIDs.find(u->GetGUID())!=m_clientGUIDs.end(); }
- bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
+ bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance = true) const;
bool IsVisibleInGridForPlayer(Player const* pl) const;
bool IsVisibleGloballyFor(Player* pl) const;
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 23295db1bb4..9ab38ec9dec 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -2902,14 +2902,14 @@ void Spell::finish(bool ok)
if(!m_caster->IsNonMeleeSpellCasted(false, false, true))
m_caster->clearUnitState(UNIT_STAT_CASTING);
- //remove spell mods
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- ((Player*)m_caster)->RemoveSpellMods(this);
-
// other code related only to successfully finished spells
if(!ok)
return;
+ //remove spell mods
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)m_caster)->RemoveSpellMods(this);
+
//handle SPELL_AURA_ADD_TARGET_TRIGGER auras
Unit::AuraList const& targetTriggers = m_caster->GetAurasByType(SPELL_AURA_ADD_TARGET_TRIGGER);
for(Unit::AuraList::const_iterator i = targetTriggers.begin(); i != targetTriggers.end(); ++i)
@@ -2958,10 +2958,11 @@ void Spell::finish(bool ok)
// Clear combo at finish state
if(m_caster->GetTypeId() == TYPEID_PLAYER && NeedsComboPoints(m_spellInfo))
{
- // Not drop combopoints if any miss exist
+ // Not drop combopoints if negative spell and if any miss on enemy exist
bool needDrop = true;
+ if (!IsPositiveSpell(m_spellInfo->Id))
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
- if (ihit->missCondition != SPELL_MISS_NONE)
+ if (ihit->missCondition != SPELL_MISS_NONE && ihit->targetGUID!=m_caster->GetGUID())
{
needDrop = false;
break;
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 809c4cab557..ac9eb2d142d 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -56,8 +56,8 @@
#include "SocialMgr.h"
#include "Util.h"
#include "TemporarySummon.h"
+#include "ScriptCalls.h"
#include "CellImpl.h"
-#include "ScriptCalls.h" // for goober gameobject script
pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
{
@@ -980,9 +980,14 @@ void Spell::EffectDummy(uint32 i)
return;
}
case 37674: // Chaos Blast
- if(unitTarget)
- m_caster->CastSpell(unitTarget,37675,true);
+ {
+ if(!unitTarget)
+ return;
+
+ int32 basepoints0 = 100;
+ m_caster->CastCustomSpell(unitTarget,37675,&basepoints0,NULL,NULL,true);
return;
+ }
case 40802: // Mingo's Fortune Generator (Mingo's Fortune Giblets)
{
// selecting one from Bloodstained Fortune item
@@ -2128,7 +2133,7 @@ void Spell::EffectApplyAura(uint32 i)
// Prayer of Mending (jump animation), we need formal caster instead original for correct animation
if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && (m_spellInfo->SpellFamilyFlags & 0x00002000000000LL))
- m_caster->CastSpell(unitTarget,41637,true,NULL,Aur,m_originalCasterGUID);
+ m_caster->CastSpell(unitTarget, 41637, true, NULL, Aur, m_originalCasterGUID);
}
void Spell::EffectUnlearnSpecialization( uint32 i )
@@ -2712,6 +2717,9 @@ void Spell::SendLoot(uint64 guid, LootType loottype)
if (gameObjTarget)
{
+ if (Script->GOHello(player, gameObjTarget))
+ return;
+
switch (gameObjTarget->GetGoType())
{
case GAMEOBJECT_TYPE_DOOR:
@@ -4558,6 +4566,38 @@ void Spell::EffectScriptEffect(uint32 effIndex)
// by spell id
switch(m_spellInfo->Id)
{
+ // PX-238 Winter Wondervolt TRAP
+ case 26275:
+ {
+ if( unitTarget->HasAura(26272,0)
+ || unitTarget->HasAura(26157,0)
+ || unitTarget->HasAura(26273,0)
+ || unitTarget->HasAura(26274,0))
+ return;
+
+ uint32 iTmpSpellId;
+
+ switch(urand(0,3))
+ {
+ case 0:
+ iTmpSpellId = 26272;
+ break;
+ case 1:
+ iTmpSpellId = 26157;
+ break;
+ case 2:
+ iTmpSpellId = 26273;
+ break;
+ case 3:
+ iTmpSpellId = 26274;
+ break;
+ }
+
+ unitTarget->CastSpell(unitTarget, iTmpSpellId, true);
+
+ return;
+ }
+
// Bending Shinbone
case 8856:
{
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 36ba1af2e3c..e397b767adf 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -6499,17 +6499,14 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
{
int32 value2 = CalculateSpellDamage((*i)->GetSpellProto(),2,(*i)->GetSpellProto()->EffectBasePoints[2],this);
basepoints0 = value2 * GetMaxPower(POWER_MANA) / 100;
-
// Drain Soul
- triggered_spell_id = 18371;
- target = this;
- found = true;
+ CastCustomSpell(this, 18371, &basepoints0, NULL, NULL, true, castItem, triggeredByAura);
break;
}
}
- if(!found)
- return false;
- break; // fall through to normal cast
+ // Not remove charge (aura removed on death in any cases)
+ // Need for correct work Drain Soul SPELL_AURA_CHANNEL_DEATH_ITEM aura
+ return false;
}
break;
}
@@ -9217,7 +9214,9 @@ bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
if(itr->type == spellInfo->Dispel)
return true;
- if( !(spellInfo->AttributesEx & SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE) && (spellInfo->Id != 42292)) // unaffected by school immunity
+ if( !(spellInfo->AttributesEx & SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE) && // unaffected by school immunity
+ !(spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY) // can remove immune (by dispell or immune it)
+ && (spellInfo->Id != 42292))
{
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
for(SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
@@ -9776,14 +9775,15 @@ int32 Unit::ModifyPower(Powers power, int32 dVal)
return gain;
}
-bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance) const
{
if(!u)
return false;
- return u->canSeeOrDetect(this, detect, inVisibleList);
+
+ return u->canSeeOrDetect(this, detect, inVisibleList, is3dDistance);
}
-bool Unit::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+bool Unit::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance) const
{
return true;
}
@@ -10510,7 +10510,7 @@ Unit* Unit::GetUnit(WorldObject& object, uint64 guid)
bool Unit::isVisibleForInState( Player const* u, bool inVisibleList ) const
{
- return isVisibleForOrDetect(u,false,inVisibleList);
+ return isVisibleForOrDetect(u, false, inVisibleList, false);
}
uint32 Unit::GetCreatureType() const
@@ -12055,6 +12055,10 @@ void Unit::ApplyCastTimePercentMod(float val, bool apply )
uint32 Unit::GetCastingTimeForBonus( SpellEntry const *spellProto, DamageEffectType damagetype, uint32 CastingTime )
{
+ // Not apply this to creature casted spells with casttime==0
+ if(CastingTime==0 && GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
+ return 3500;
+
if (CastingTime > 7000) CastingTime = 7000;
if (CastingTime < 1500) CastingTime = 1500;
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 1dfa34dc720..9b9651e35a9 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1206,8 +1206,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SetVisibility(UnitVisibility x);
// common function for visibility checks for player/creatures with detection code
- virtual bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
- bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false) const;
+ virtual bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance = true) const;
+ bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
bool canDetectInvisibilityOf(Unit const* u) const;
bool canDetectStealthOf(Unit const* u, float distance) const;
diff --git a/src/shared/Config/dotconfpp/dotconfpp.cpp b/src/shared/Config/dotconfpp/dotconfpp.cpp
index 34be713138d..543e8acf1f4 100644
--- a/src/shared/Config/dotconfpp/dotconfpp.cpp
+++ b/src/shared/Config/dotconfpp/dotconfpp.cpp
@@ -340,6 +340,11 @@ int DOTCONFDocument::setContent(const char * _fileName)
error(0, NULL, "failed to open file '%s': %s", fileName, strerror(errno));
return -1;
}
+ // Try read utf8 header and skip it if exist
+ uint32 utf8header = 0;
+ fgets((char*)&utf8header, 4, file); // Try read header
+ if (utf8header!=0x00BFBBEF) // If not exist
+ fseek(file, 0, SEEK_SET); // Reset read position
ret = parseFile();
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index 0f0c42eae13..efcaea714ef 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -884,9 +884,9 @@ GM.StartLevel = 70
# Visibility.Distance.Creature
# Visibility.Distance.Player
# Visibility distance for different in game object
-# Max limited by active player zone: ~ 166
+# Max limited by active player zone: ~ 333
# Min limit dependent from objects
-# Default: 66 (cell size)
+# Default: 132 (cell size)
# Min limit is max aggro radius (45) * Rate.Creature.Aggro
#
# Visibility.Distance.Object
@@ -912,10 +912,10 @@ GM.StartLevel = 70
###################################################################################################################
Visibility.GroupMode = 0
-Visibility.Distance.Creature = 66
-Visibility.Distance.Player = 66
-Visibility.Distance.Object = 66
-Visibility.Distance.InFlight = 66
+Visibility.Distance.Creature = 132
+Visibility.Distance.Player = 132
+Visibility.Distance.Object = 132
+Visibility.Distance.InFlight = 132
Visibility.Distance.Grey.Unit = 1
Visibility.Distance.Grey.Object = 10