aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp9
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h12
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp7
-rw-r--r--src/server/game/Entities/Creature/Creature.h1
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp3
-rw-r--r--src/server/game/Spells/Spell.cpp21
-rw-r--r--src/server/game/Spells/SpellEffects.cpp18
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp7
-rw-r--r--src/server/scripts/Northrend/zone_howling_fjord.cpp51
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp40
11 files changed, 100 insertions, 79 deletions
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index 9b98e99e326..8b994545536 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -253,6 +253,15 @@ void AuctionHouseMgr::LoadAuctionItems()
{
uint32 oldMSTime = getMSTime();
+ // need to clear in case we are reloading
+ if (!mAitems.empty())
+ {
+ for (ItemMap::iterator itr = mAitems.begin(); itr != mAitems.end(); ++itr)
+ delete itr->second;
+
+ mAitems.clear();
+ }
+
// data needs to be at first place for Item::LoadFromDB
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTION_ITEMS);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index e0e972c5d40..4892821cb94 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -35,17 +35,21 @@ class WorldPacket;
enum AuctionError
{
ERR_AUCTION_OK = 0,
+ ERR_AUCTION_INVENTORY = 1,
ERR_AUCTION_DATABASE_ERROR = 2,
ERR_AUCTION_NOT_ENOUGHT_MONEY = 3,
ERR_AUCTION_ITEM_NOT_FOUND = 4,
- ERR_AUCTION_BID_OWN = 10
+ ERR_AUCTION_HIGHER_BID = 5,
+ ERR_AUCTION_BID_INCREMENT = 7,
+ ERR_AUCTION_BID_OWN = 10,
+ ERR_AUCTION_RESTRICTED_ACCOUNT = 13
};
enum AuctionAction
{
- AUCTION_SELL_ITEM = 0,
- AUCTION_CANCEL = 1,
- AUCTION_PLACE_BID = 2
+ AUCTION_SELL_ITEM = 0,
+ AUCTION_CANCEL = 1,
+ AUCTION_PLACE_BID = 2
};
enum MailAuctionAnswers
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 4a2408b7f0a..3727e19bc2d 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -857,6 +857,13 @@ bool Creature::isCanInteractWithBattleMaster(Player* player, bool msg) const
return true;
}
+bool Creature::isCanTrainingAndResetTalentsOf(Player* player) const
+{
+ return player->getLevel() >= 10
+ && GetCreatureTemplate()->trainer_type == TRAINER_TYPE_CLASS
+ && player->getClass() == GetCreatureTemplate()->trainer_class;
+}
+
Player* Creature::GetLootRecipient() const
{
if (!m_lootRecipient)
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 6b6edd7454f..b3372fc8c56 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -483,6 +483,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature
/// @todo Rename these properly
bool isCanInteractWithBattleMaster(Player* player, bool msg) const;
+ bool isCanTrainingAndResetTalentsOf(Player* player) const;
bool canCreatureAttack(Unit const* victim, bool force = true) const;
bool IsImmunedToSpell(SpellInfo const* spellInfo) const; // override Unit::IsImmunedToSpell
bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // override Unit::IsImmunedToSpellEffect
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 5670f08c79f..28213785911 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14370,6 +14370,14 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool
}
break;
}
+ case GOSSIP_OPTION_LEARNDUALSPEC:
+ if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
+ canTalk = false;
+ break;
+ case GOSSIP_OPTION_UNLEARNTALENTS:
+ if (!creature->isCanTrainingAndResetTalentsOf(this))
+ canTalk = false;
+ break;
case GOSSIP_OPTION_UNLEARNPETTALENTS:
if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
canTalk = false;
@@ -14390,8 +14398,6 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool
canTalk = false;
break;
case GOSSIP_OPTION_TRAINER:
- case GOSSIP_OPTION_LEARNDUALSPEC:
- case GOSSIP_OPTION_UNLEARNTALENTS:
case GOSSIP_OPTION_GOSSIP:
case GOSSIP_OPTION_SPIRITGUIDE:
case GOSSIP_OPTION_INNKEEPER:
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index 6f44b867c4b..d193852eb1c 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -30,9 +30,6 @@
#include "Util.h"
#include "AccountMgr.h"
-//please DO NOT use iterator++, because it is slower than ++iterator!!!
-//post-incrementation is always slower than pre-incrementation !
-
//void called when player click on auctioneer npc
void WorldSession::HandleAuctionHelloOpcode(WorldPacket& recvData)
{
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 2cbbde67e6a..e7f7ea69611 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1414,7 +1414,26 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
float x, y, z, angle;
angle = (float)rand_norm() * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dis, angle);
- m_targets.SetDst(x, y, z, m_caster->GetOrientation());
+
+ float ground = z;
+ float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground);
+ if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level
+ {
+ SendCastResult(SPELL_FAILED_NOT_HERE);
+ SendChannelUpdate(0);
+ finish(false);
+ return;
+ }
+
+ if (ground + 0.75 > liquidLevel)
+ {
+ SendCastResult(SPELL_FAILED_TOO_SHALLOW);
+ SendChannelUpdate(0);
+ finish(false);
+ return;
+ }
+
+ m_targets.SetDst(x, y, liquidLevel, m_caster->GetOrientation());
return;
}
default:
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 64a538dce86..fa82b6436d3 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -5290,25 +5290,9 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex)
}
Map* cMap = m_caster->GetMap();
- if (goinfo->type == GAMEOBJECT_TYPE_FISHINGNODE || goinfo->type == GAMEOBJECT_TYPE_FISHINGHOLE)
- {
- LiquidData liqData;
- if (!cMap->IsInWater(fx, fy, fz + 1.f/* -0.5f */, &liqData)) // Hack to prevent fishing bobber from failing to land on fishing hole
- { // but this is not proper, we really need to ignore not materialized objects
- SendCastResult(SPELL_FAILED_NOT_HERE);
- SendChannelUpdate(0);
- return;
- }
-
- // replace by water level in this case
- //fz = cMap->GetWaterLevel(fx, fy);
- fz = liqData.level;
- }
// if gameobject is summoning object, it should be spawned right on caster's position
- else if (goinfo->type == GAMEOBJECT_TYPE_SUMMONING_RITUAL)
- {
+ if (goinfo->type == GAMEOBJECT_TYPE_SUMMONING_RITUAL)
m_caster->GetPosition(fx, fy, fz);
- }
GameObject* pGameObj = new GameObject;
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 6fb1079d94c..16965b83d25 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -820,7 +820,6 @@ public:
void Reset()
{
WithRedDragonBlood = false;
- HarpoonerGUID = 0;
}
void EnterCombat(Unit* who)
@@ -879,6 +878,12 @@ public:
}
}
+ if ((me->getFaction() == 35) && (!me->HasAura(SPELL_SUBDUED)))
+ {
+ HarpoonerGUID = 0;
+ me->DisappearAndDie();
+ }
+
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp
index 65d69e368b8..268e904e292 100644
--- a/src/server/scripts/Northrend/zone_howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
@@ -276,56 +276,6 @@ public:
};
/*######
-## npc_mcgoyver
-######*/
-
-#define GOSSIP_ITEM_MG_I "Walt sent me to pick up some dark iron ingots."
-#define GOSSIP_ITEM_MG_II "Yarp."
-
-enum eMcGoyver
-{
- QUEST_WE_CAN_REBUILD_IT = 11483,
-
- SPELL_CREATURE_DARK_IRON_INGOTS = 44512,
- SPELL_TAXI_EXPLORERS_LEAGUE = 44280,
-
- GOSSIP_TEXTID_MCGOYVER = 12193
-};
-
-class npc_mcgoyver : public CreatureScript
-{
-public:
- npc_mcgoyver() : CreatureScript("npc_mcgoyver") { }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (player->GetQuestStatus(QUEST_WE_CAN_REBUILD_IT) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MG_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MG_II, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_MCGOYVER, creature->GetGUID());
- player->CastSpell(player, SPELL_CREATURE_DARK_IRON_INGOTS, true);
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->CastSpell(player, SPELL_TAXI_EXPLORERS_LEAGUE, true);
- player->CLOSE_GOSSIP_MENU();
- break;
- }
- return true;
- }
-};
-
-/*######
## npc_daegarn
######*/
@@ -435,6 +385,5 @@ void AddSC_howling_fjord()
new npc_apothecary_hanes;
new npc_plaguehound_tracker;
new npc_razael_and_lyana;
- new npc_mcgoyver;
new npc_daegarn;
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index c60f4f07821..c591f3141ed 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -3562,6 +3562,45 @@ class spell_gen_orc_disguise : public SpellScriptLoader
}
};
+enum WhisperGulchYoggSaronWhisper
+{
+ SPELL_YOGG_SARON_WHISPER_DUMMY = 29072
+};
+
+class spell_gen_whisper_gulch_yogg_saron_whisper : public SpellScriptLoader
+{
+ public:
+ spell_gen_whisper_gulch_yogg_saron_whisper() : SpellScriptLoader("spell_gen_whisper_gulch_yogg_saron_whisper") { }
+
+ class spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_YOGG_SARON_WHISPER_DUMMY))
+ return false;
+ return true;
+ }
+
+ void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell((Unit*)NULL, SPELL_YOGG_SARON_WHISPER_DUMMY, true);
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -3642,4 +3681,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_replenishment();
new spell_gen_aura_service_uniform();
new spell_gen_orc_disguise();
+ new spell_gen_whisper_gulch_yogg_saron_whisper();
}