aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2014-08-23 16:41:54 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2014-08-23 16:41:54 +0200
commit4a29c73403c4dc713a8a31cb96289adff2b910c1 (patch)
treede0c6b191031bac7fb2764edb2a81382a331f81c /src
parentb90329d63acaecb1f074dd2b303561baa9f639a2 (diff)
parent1255434882777053bca06656786abc1a598deda9 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp3
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp12
-rw-r--r--src/server/game/Quests/QuestDef.cpp8
-rw-r--r--src/server/game/Spells/Spell.cpp8
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/World/World.cpp12
-rw-r--r--src/server/game/World/World.h2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp237
-rw-r--r--src/server/worldserver/worldserver.conf.dist9
9 files changed, 173 insertions, 119 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 9dba0fe3bf9..55f69a113be 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -477,7 +477,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsPlayer(*itr))
{
- (*itr)->ToPlayer()->AreaExploredOrEventHappens(e.action.quest.quest);
+ (*itr)->ToPlayer()->GroupEventHappens(e.action.quest.quest, me);
+
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS: Player guidLow %u credited quest %u",
(*itr)->GetGUIDLow(), e.action.quest.quest);
}
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index 40935a0712c..07b41edebbe 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -547,8 +547,16 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPacket& data, Player* player
if (levelmin != 0x00 && (proto->RequiredLevel < levelmin || (levelmax != 0x00 && proto->RequiredLevel > levelmax)))
continue;
- if (usable != 0x00 && player->CanUseItem(item) != EQUIP_ERR_OK)
- continue;
+ if (usable != 0x00)
+ {
+ if (player->CanUseItem(item) != EQUIP_ERR_OK)
+ continue;
+
+ if (proto->Class == ITEM_CLASS_RECIPE)
+ if (SpellEntry const* spell = sSpellStore.LookupEntry(proto->Spells[0].SpellId))
+ if (player->HasSpell(spell->EffectTriggerSpell[EFFECT_INDEX_0]))
+ continue;
+ }
// Allow search by suffix (ie: of the Monkey) or partial name (ie: Monkey)
// No need to do any of this if no search term was entered
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 7c089eee07b..89ca3749a05 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -232,10 +232,12 @@ uint32 Quest::XPValue(Player* player) const
int32 Quest::GetRewOrReqMoney() const
{
+ // RequiredMoney: the amount is the negative copper sum.
if (RewardOrRequiredMoney <= 0)
return RewardOrRequiredMoney;
- return int32(RewardOrRequiredMoney * sWorld->getRate(RATE_DROP_MONEY));
+ // RewardMoney: the positive amount
+ return int32(RewardOrRequiredMoney * sWorld->getRate(RATE_MONEY_QUEST));
}
void Quest::BuildExtraQuestInfo(WorldPacket& data, Player* player) const
@@ -313,10 +315,12 @@ void Quest::BuildExtraQuestInfo(WorldPacket& data, Player* player) const
uint32 Quest::GetRewMoneyMaxLevel() const
{
+ // If Quest has flag to not give money on max level, it's 0
if (HasFlag(QUEST_FLAGS_NO_MONEY_FROM_XP))
return 0;
- return RewardMoneyMaxLevel;
+ // Else, return the rewarded copper sum modified by the rate
+ return uint32(RewardMoneyMaxLevel * sWorld->getRate(RATE_MONEY_MAX_LEVEL_QUEST));
}
bool Quest::IsAutoAccept() const
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index e75ef03d392..5080733bb66 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -602,7 +602,7 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme
m_powerCost = 0; // setup to correct value in Spell::prepare, must not be used before.
m_casttime = 0; // setup to correct value in Spell::prepare, must not be used before.
m_timer = 0; // will set to castime in prepare
-
+ m_channeledDuration = 0; // will be setup in Spell::handle_immediate
m_immediateHandled = false;
m_channelTargetEffectMask = 0;
@@ -3253,6 +3253,7 @@ void Spell::handle_immediate()
m_spellState = SPELL_STATE_CASTING;
m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags);
+ m_channeledDuration = duration;
SendChannelStart(duration);
}
else if (duration == -1)
@@ -6361,7 +6362,10 @@ void Spell::DelayedChannel()
return;
//check pushback reduce
- int32 delaytime = CalculatePct(m_spellInfo->GetDuration(), 25); // channeling delay is normally 25% of its time per hit
+ // should be affected by modifiers, not take the dbc duration.
+ int32 duration = ((m_channeledDuration > 0) ? m_channeledDuration : m_spellInfo->GetDuration());
+
+ int32 delaytime = CalculatePct(duration, 25); // channeling delay is normally 25% of its time per hit
int32 delayReduce = 100; // must be initialized to 100 for percent modifiers
m_caster->ToPlayer()->ApplySpellMod(m_spellInfo->Id, SPELLMOD_NOT_LOSE_CASTING_TIME, delayReduce, this);
delayReduce += m_caster->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index fa5d051635b..5d854659f4e 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -519,6 +519,7 @@ class Spell
WeaponAttackType m_attackType; // For weapon based attack
int32 m_powerCost; // Calculated spell cost initialized only in Spell::prepare
int32 m_casttime; // Calculated spell cast time initialized only in Spell::prepare
+ int32 m_channeledDuration; // Calculated channeled spell duration in order to calculate correct pushback.
bool m_canReflect; // can reflect this spell?
bool m_autoRepeat;
uint8 m_runesState;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index edf67a9563e..f66c693098b 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -568,6 +568,18 @@ void World::LoadConfigSettings(bool reload)
TC_LOG_ERROR("server.loading", "DurabilityLossChance.Block (%f) must be >=0. Using 0.0 instead.", rate_values[RATE_DURABILITY_LOSS_BLOCK]);
rate_values[RATE_DURABILITY_LOSS_BLOCK] = 0.0f;
}
+ rate_values[RATE_MONEY_QUEST] = sConfigMgr->GetFloatDefault("Rate.Quest.Money.Reward", 1.0f);
+ if (rate_values[RATE_MONEY_QUEST] < 0.0f)
+ {
+ TC_LOG_ERROR("server.loading", "Rate.Quest.Money.Reward (%f) must be >=0. Using 0 instead.", rate_values[RATE_MONEY_QUEST]);
+ rate_values[RATE_MONEY_QUEST] = 0.0f;
+ }
+ rate_values[RATE_MONEY_MAX_LEVEL_QUEST] = sConfigMgr->GetFloatDefault("Rate.Quest.Money.Max.Level.Reward", 1.0f);
+ if (rate_values[RATE_MONEY_MAX_LEVEL_QUEST] < 0.0f)
+ {
+ TC_LOG_ERROR("server.loading", "Rate.Quest.Money.Max.Level.Reward (%f) must be >=0. Using 0 instead.", rate_values[RATE_MONEY_MAX_LEVEL_QUEST]);
+ rate_values[RATE_MONEY_MAX_LEVEL_QUEST] = 0.0f;
+ }
///- Read other configuration items from the config file
m_bool_configs[CONFIG_DURABILITY_LOSS_IN_PVP] = sConfigMgr->GetBoolDefault("DurabilityLoss.InPvP", false);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index bf488c7edf0..51a5f726051 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -416,6 +416,8 @@ enum Rates
RATE_DURABILITY_LOSS_ABSORB,
RATE_DURABILITY_LOSS_BLOCK,
RATE_MOVESPEED,
+ RATE_MONEY_QUEST,
+ RATE_MONEY_MAX_LEVEL_QUEST,
MAX_RATES
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
index dc0a6643624..d4fdb262c8e 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
@@ -19,156 +19,169 @@
#include "ScriptedCreature.h"
#include "steam_vault.h"
-enum HydromancerThespia
+enum Yells
{
SAY_SUMMON = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_DEAD = 3,
+};
+enum Spells
+{
SPELL_LIGHTNING_CLOUD = 25033,
SPELL_LUNG_BURST = 31481,
- SPELL_ENVELOPING_WINDS = 31718,
+ SPELL_ENVELOPING_WINDS = 31718
+};
- SPELL_WATER_BOLT_VOLLEY = 34449,
- H_SPELL_WATER_BOLT_VOLLEY = 37924
+enum Events
+{
+ EVENT_LIGHTNING_CLOUD = 1,
+ EVENT_LUNG_BURST,
+ EVENT_ENVELOPING_WINDS
};
class boss_hydromancer_thespia : public CreatureScript
{
-public:
- boss_hydromancer_thespia() : CreatureScript("boss_hydromancer_thespia") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_thespiaAI>(creature);
- }
-
- struct boss_thespiaAI : public ScriptedAI
- {
- boss_thespiaAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 LightningCloud_Timer;
- uint32 LungBurst_Timer;
- uint32 EnvelopingWinds_Timer;
-
- void Reset() override
- {
- LightningCloud_Timer = 15000;
- LungBurst_Timer = 7000;
- EnvelopingWinds_Timer = 9000;
-
- instance->SetBossState(DATA_HYDROMANCER_THESPIA, NOT_STARTED);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEAD);
-
- instance->SetBossState(DATA_HYDROMANCER_THESPIA, DONE);
- }
-
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_SLAY);
- }
+ public:
+ boss_hydromancer_thespia() : CreatureScript("boss_hydromancer_thespia") { }
- void EnterCombat(Unit* /*who*/) override
+ struct boss_thespiaAI : public BossAI
{
- Talk(SAY_AGGRO);
+ boss_thespiaAI(Creature* creature) : BossAI(creature, DATA_HYDROMANCER_THESPIA) { }
- instance->SetBossState(DATA_HYDROMANCER_THESPIA, IN_PROGRESS);
- }
+ void Reset() override
+ {
+ _Reset();
+ }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEAD);
+ _JustDied();
+ }
- //LightningCloud_Timer
- if (LightningCloud_Timer <= diff)
+ void KilledUnit(Unit* who) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_LIGHTNING_CLOUD);
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- //cast twice in Heroic mode
- if (IsHeroic())
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_LIGHTNING_CLOUD);
+ void EnterCombat(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ _EnterCombat();
- LightningCloud_Timer = 15000 + rand32() % 10000;
- } else LightningCloud_Timer -=diff;
+ events.ScheduleEvent(EVENT_LIGHTNING_CLOUD, 15000);
+ events.ScheduleEvent(EVENT_LUNG_BURST, 7000);
+ events.ScheduleEvent(EVENT_ENVELOPING_WINDS, 9000);
+ }
- //LungBurst_Timer
- if (LungBurst_Timer <= diff)
+ void ExecuteEvent(uint32 eventId) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_LUNG_BURST);
- LungBurst_Timer = 7000 + rand32() % 5000;
- } else LungBurst_Timer -=diff;
-
- //EnvelopingWinds_Timer
- if (EnvelopingWinds_Timer <= diff)
+ switch (eventId)
+ {
+ case EVENT_LIGHTNING_CLOUD:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
+ DoCast(target, SPELL_LIGHTNING_CLOUD);
+ // cast twice in Heroic mode
+ if (IsHeroic())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
+ DoCast(target, SPELL_LIGHTNING_CLOUD);
+
+ events.ScheduleEvent(EVENT_LIGHTNING_CLOUD, urand(15000, 25000));
+ break;
+ case EVENT_LUNG_BURST:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_LUNG_BURST);
+ events.ScheduleEvent(EVENT_LUNG_BURST, urand(7000, 12000));
+ break;
+ case EVENT_ENVELOPING_WINDS:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
+ DoCast(target, SPELL_ENVELOPING_WINDS);
+ // cast twice in Heroic mode
+ if (IsHeroic())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
+ DoCast(target, SPELL_ENVELOPING_WINDS);
+
+ events.ScheduleEvent(EVENT_ENVELOPING_WINDS, urand(10000, 15000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_ENVELOPING_WINDS);
-
- //cast twice in Heroic mode
- if (IsHeroic())
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_ENVELOPING_WINDS);
- EnvelopingWinds_Timer = 10000 + rand32() % 5000;
- } else EnvelopingWinds_Timer -=diff;
+ BossAI::UpdateAI(diff);
+ }
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_thespiaAI>(creature);
}
- };
+};
+enum CoilfangWaterElemental
+{
+ EVENT_WATER_BOLT_VOLLEY = 1,
+ SPELL_WATER_BOLT_VOLLEY = 34449
};
class npc_coilfang_waterelemental : public CreatureScript
{
-public:
- npc_coilfang_waterelemental() : CreatureScript("npc_coilfang_waterelemental") { }
+ public:
+ npc_coilfang_waterelemental() : CreatureScript("npc_coilfang_waterelemental") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_coilfang_waterelementalAI(creature);
- }
-
- struct npc_coilfang_waterelementalAI : public ScriptedAI
- {
- npc_coilfang_waterelementalAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 WaterBoltVolley_Timer;
-
- void Reset() override
+ struct npc_coilfang_waterelementalAI : public ScriptedAI
{
- WaterBoltVolley_Timer = 3000 + rand32() % 3000;
- }
-
- void EnterCombat(Unit* /*who*/) override { }
+ npc_coilfang_waterelementalAI(Creature* creature) : ScriptedAI(creature) { }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ void Reset() override
+ {
+ _events.Reset();
+ }
- if (WaterBoltVolley_Timer <= diff)
+ void EnterCombat(Unit* /*who*/) override
{
- DoCast(me, SPELL_WATER_BOLT_VOLLEY);
- WaterBoltVolley_Timer = 7000 + rand32() % 5000;
- } else WaterBoltVolley_Timer -= diff;
+ _events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(3000, 6000));
+ }
- DoMeleeAttackIfReady();
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_WATER_BOLT_VOLLEY:
+ DoCast(me, SPELL_WATER_BOLT_VOLLEY);
+ _events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(7000, 12000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_coilfang_waterelementalAI(creature);
}
- };
-
};
void AddSC_boss_hydromancer_thespia()
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index ce512628e98..a6cdd2037b5 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -1715,6 +1715,15 @@ Rate.XP.Quest = 1
Rate.XP.Explore = 1
#
+# Rate.Quest.Money.Reward
+# Rate.Quest.Money.Max.Level.Reward
+# Description: Multiplier for money quest rewards. Can not be below 0.
+# Default: 1
+
+Rate.Quest.Money.Reward = 1
+Rate.Quest.Money.Max.Level.Reward = 1
+
+#
# Rate.RepairCost
# Description: Repair cost rate.
# Default: 1