aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2014-08-26 19:21:22 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2014-08-26 19:21:22 +0200
commit741f3dde2e880baf3439fe60f7166cea14b70196 (patch)
treec7f49c46c258d1a587dee4b4367f5436a833c93e /src/server/game
parent67fc6a9b42879bc6ea9010293780d4f82d9cb09e (diff)
parentfebb26d4b711762b1ee605705e7fa949b9871df1 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: dep/PackageList.txt src/server/game/Spells/Auras/SpellAuras.cpp
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h2
-rw-r--r--src/server/game/Chat/Chat.cpp2
-rw-r--r--src/server/game/Chat/Chat.h2
-rw-r--r--src/server/game/Entities/Object/Object.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp13
-rw-r--r--src/server/game/Maps/Map.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp35
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h19
8 files changed, 69 insertions, 8 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index e5abc876648..bff2e903f37 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -467,7 +467,7 @@ enum SMART_ACTION
SMART_ACTION_SET_VISIBILITY = 47, // on/off
SMART_ACTION_SET_ACTIVE = 48, // on/off
SMART_ACTION_ATTACK_START = 49, //
- SMART_ACTION_SUMMON_GO = 50, // GameObjectID, DespawnTime in ms,
+ SMART_ACTION_SUMMON_GO = 50, // GameObjectID, DespawnTime in s
SMART_ACTION_KILL_UNIT = 51, //
SMART_ACTION_ACTIVATE_TAXI = 52, // TaxiID
SMART_ACTION_WP_START = 53, // run/walk, pathID, canRepeat, quest, despawntime, reactState
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 961824b1d86..be2d0ecb726 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -1166,7 +1166,7 @@ bool ChatHandler::extractPlayerTarget(char* args, Player** player, uint64* playe
}
else
{
- Player* pl = getSelectedPlayer();
+ Player* pl = getSelectedPlayerOrSelf();
// if allowed player pointer
if (player)
*player = pl;
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 7c9ad68a7f3..58bc11f786f 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -113,7 +113,7 @@ class ChatHandler
GameTele const* extractGameTeleFromLink(char* text);
bool GetPlayerGroupAndGUIDByName(const char* cname, Player* &player, Group* &group, uint64 &guid, bool offline = false);
std::string extractPlayerNameFromLink(char* text);
- // select by arg (name/link) or in-game selection online/offline player
+ // select by arg (name/link) or in-game selection online/offline player or self if a creature is selected
bool extractPlayerTarget(char* args, Player** player, uint64* player_guid = NULL, std::string* player_name = NULL);
std::string playerLink(std::string const& name) const { return m_session ? "|cffffffff|Hplayer:"+name+"|h["+name+"]|h|r" : name; }
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index a44c9fa2866..a399e67104a 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -779,7 +779,7 @@ class WorldObject : public Object, public WorldLocation
TempSummon* SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0) const;
TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0) const;
- GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime);
+ GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime /* s */);
Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, CreatureAI* (*GetAI)(Creature*) = NULL);
void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = NULL);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e056b6d87b1..4b8522b7b08 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -12708,7 +12708,18 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
// Remove charge (aura can be removed by triggers)
if (prepare && useCharges && takeCharges)
- i->aura->DropCharge();
+ {
+ // Set charge drop delay (only for missiles)
+ if ((procExtra & PROC_EX_REFLECT) && target && procSpell && procSpell->Speed > 0.0f)
+ {
+ // Set up missile speed based delay (from Spell.cpp: Spell::AddUnitTarget()::L2237)
+ uint32 delay = uint32(std::floor(std::max<float>(target->GetDistance(this), 5.0f) / procSpell->Speed * 1000.0f));
+ // Schedule charge drop
+ i->aura->DropChargeDelayed(delay);
+ }
+ else
+ i->aura->DropCharge();
+ }
i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 31b16309fcd..44e270d7625 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -159,7 +159,7 @@ void Map::LoadMap(int gx, int gy, bool reload)
// load grid map for base map
if (!m_parentMap->GridMaps[gx][gy])
- m_parentMap->EnsureGridCreated_i(GridCoord(63-gx, 63-gy));
+ m_parentMap->EnsureGridCreated(GridCoord(63-gx, 63-gy));
((MapInstanced*)(m_parentMap))->AddGridMapReference(GridCoord(gx, gy));
GridMaps[gx][gy] = m_parentMap->GridMaps[gx][gy];
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 4d8c1e033ed..3359d287b21 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -344,7 +344,7 @@ m_spellInfo(spellproto), m_casterGuid(casterGUID ? casterGUID : caster->GetGUID(
m_castItemGuid(castItem ? castItem->GetGUID() : 0), m_applyTime(time(NULL)),
m_owner(owner), m_timeCla(0), m_updateTargetMapInterval(0),
m_casterLevel(caster ? caster->getLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(1),
-m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false)
+m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEvent(nullptr)
{
if (m_spellInfo->ManaPerSecond)
m_timeCla = 1 * IN_MILLISECONDS;
@@ -476,6 +476,12 @@ void Aura::_Remove(AuraRemoveMode removeMode)
target->_UnapplyAura(aurApp, removeMode);
appItr = m_applications.begin();
}
+
+ if (m_dropEvent)
+ {
+ m_dropEvent->to_Abort = true;
+ m_dropEvent = nullptr;
+ }
}
void Aura::UpdateTargetMap(Unit* caster, bool apply)
@@ -841,6 +847,26 @@ bool Aura::ModCharges(int32 num, AuraRemoveMode removeMode)
return false;
}
+void Aura::ModChargesDelayed(int32 num, AuraRemoveMode removeMode)
+{
+ m_dropEvent = nullptr;
+ ModCharges(num, removeMode);
+}
+
+void Aura::DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode)
+{
+ // aura is already during delayed charge drop
+ if (m_dropEvent)
+ return;
+ // only units have events
+ Unit* owner = m_owner->ToUnit();
+ if (!owner)
+ return;
+
+ m_dropEvent = new ChargeDropEvent(this, removeMode);
+ owner->m_Events.AddEvent(m_dropEvent, owner->m_Events.CalculateTime(delay));
+}
+
void Aura::SetStackAmount(uint8 stackAmount)
{
m_stackAmount = stackAmount;
@@ -2324,6 +2350,13 @@ DynObjAura::DynObjAura(SpellInfo const* spellproto, uint8 effMask, WorldObject*
GetDynobjOwner()->SetAura(this);
}
+bool ChargeDropEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
+{
+ // _base is always valid (look in Aura::_Remove())
+ _base->ModChargesDelayed(-1, _mode);
+ return true;
+}
+
void DynObjAura::Remove(AuraRemoveMode removeMode)
{
if (IsRemoved())
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index e578c0ffc3a..1266bf5c6ec 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -34,6 +34,7 @@ class Aura;
class DynamicObject;
class AuraScript;
class ProcInfo;
+class ChargeDropEvent;
// update aura target map every 500 ms instead of every update - reduce amount of grid searcher calls
#define UPDATE_TARGET_MAP_INTERVAL 500
@@ -131,7 +132,7 @@ class Aura
void SetDuration(int32 duration, bool withMods = false);
void RefreshDuration(bool withMods = false);
void RefreshTimers();
- bool IsExpired() const { return !GetDuration();}
+ bool IsExpired() const { return !GetDuration() && !m_dropEvent; }
bool IsPermanent() const { return GetMaxDuration() == -1; }
uint8 GetCharges() const { return m_procCharges; }
@@ -140,6 +141,8 @@ class Aura
uint8 CalcMaxCharges() const { return CalcMaxCharges(GetCaster()); }
bool ModCharges(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
bool DropCharge(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) { return ModCharges(-1, removeMode); }
+ void ModChargesDelayed(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
+ void DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
uint8 GetStackAmount() const { return m_stackAmount; }
void SetStackAmount(uint8 num);
@@ -264,6 +267,8 @@ class Aura
bool m_isSingleTarget:1; // true if it's a single target spell and registered at caster - can change at spell steal for example
bool m_isUsingCharges:1;
+ ChargeDropEvent* m_dropEvent;
+
private:
Unit::AuraApplicationList m_removedApplications;
};
@@ -299,4 +304,16 @@ class DynObjAura : public Aura
void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) override;
};
+
+class ChargeDropEvent : public BasicEvent
+{
+ friend class Aura;
+ protected:
+ ChargeDropEvent(Aura* base, AuraRemoveMode mode) : _base(base), _mode(mode) { }
+ bool Execute(uint64 /*e_time*/, uint32 /*p_time*/);
+
+ private:
+ Aura* _base;
+ AuraRemoveMode _mode;
+};
#endif