Merge remote-tracking branch 'origin/master' into 4.3.4

Conflicts:
	src/server/scripts/Kalimdor/thousand_needles.cpp
This commit is contained in:
Nay
2012-12-28 17:31:39 +00:00
15 changed files with 182 additions and 19 deletions
@@ -0,0 +1,18 @@
-- If He Cannot Be Turned (12896 + 12897)
UPDATE `quest_template` SET `PrevQuestId`=12893 WHERE `Id` IN (12896,12897);
-- Get the Key (12949)
UPDATE `quest_template` SET `PrevQuestId`=12939 WHERE `Id`=12949;
-- Leave Our Mark (12995)
UPDATE `quest_template` SET `PrevQuestId`=13084 WHERE `Id`=12995;
-- Vandalizing Jotunheim (13084) / Crush Dem Vrykuls! (12992)
UPDATE `quest_template` SET `NextQuestId`=13085,`ExclusiveGroup`=-13085 WHERE `Id` IN (13084,12992);
-- Intelligence Gathering (12838) / From Their Corpses, Rise! (12813)
UPDATE `quest_template` SET `PrevQuestId`=12807 WHERE `Id` IN (12838,12813);
-- No Fly Zone (12815)
UPDATE `quest_template` SET `PrevQuestId`=12814 WHERE `Id`=12815;
-- Eliminate the Competition (12955)
UPDATE `quest_template` SET `PrevQuestId`=12938 WHERE `Id`=12955;
-- Deep in the Bowels of The Underhalls (13042)
UPDATE `quest_template` SET `PrevQuestId`=12999 WHERE `Id`=13042;
-- Battle at Valhalas: Fallen Heroes (13214)
UPDATE `quest_template` SET `PrevQuestId`=13213 WHERE `Id`=13214;
@@ -0,0 +1,3 @@
DELETE FROM `command` WHERE `name` LIKE 'lookup spell id';
INSERT INTO `command` (`name`, `security`, `help`) VALUES
('lookup spell id', '3', 'Syntax: .lookup spell id #spellid\n\nLooks up a spell by #spellid, and returns the match with its spell name.');
@@ -0,0 +1,2 @@
-- fix startups
UPDATE `creature` SET `MovementType`=0 WHERE `id`=3939 AND `guid` BETWEEN 48823 AND 45831;
@@ -0,0 +1,32 @@
-- And Now, the Moment of Truth (10201) quest fix
SET @ENTRY := 19606;
-- texts
DELETE FROM `creature_ai_texts` WHERE `entry` IN (-247,-246,-245,-244);
DELETE FROM `creature_text` WHERE `entry`=@ENTRY;
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(@ENTRY,0,0,"Someone come read this wanted poster to Grek. Grek can't read.",12,0,100,18,0,6941,"Grek1"),
(@ENTRY,1,0,"Grek get a drink.",12,0,100,7,0,0,"Grek2"),
(@ENTRY,2,0,"Grek try!",12,0,100,5,0,0,"Grek - Quest1"),
(@ENTRY,3,0,"This oil no good for Grek! What Grek look like to you, some weakling in robes?",12,0,100,6,0,0,"Grek - Quest2");
-- gossips
UPDATE `creature_template` SET `gossip_menu_id` = 7999 WHERE `entry` = @ENTRY; -- YTDB value (should work fine until someone can sniff/verify)
DELETE FROM `gossip_menu` WHERE `entry`=7999 AND `text_id`=9853;
INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7999,9853); -- YTDB value (should work fine until someone can sniff/verify)
DELETE FROM `gossip_menu_option` WHERE `menu_id`=7999;
INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
(7999,0,0,"Grek, will you try out this new weapon oil Rakoria made?",1,1,0,0,0,0,''); -- YTDB value (should work fine until someone can sniff/verify)
-- SAI
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` = @ENTRY;
DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@ENTRY,0,0,0,1,0,100,0,120000,120000,120000,120000,1,0,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Grek - OOC - Say Grek1"),
(@ENTRY,0,1,0,1,0,100,0,420000,420000,420000,420000,1,1,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Grek - OOC - Say Grek2"),
(@ENTRY,0,2,3,62,0,100,0,7999,0,0,0,1,2,3000,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Grek - On gossip select - Say Quest1"),
(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"Grek - Link - Close gossip"),
(@ENTRY,0,4,5,52,0,100,0,2,@ENTRY,0,0,1,3,10000,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Grek - On text_over - Say Quest2"),
(@ENTRY,0,5,0,61,0,100,0,0,0,0,0,33,@ENTRY,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"Grek - Link - Give quest credit");
-- conditions
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7999 AND `SourceEntry`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(15,7999,0,0,0,9,0,10201,0,0,0,0,'',"Display gossip only if quest taken");
@@ -0,0 +1,3 @@
-- Remove deprecated older version of "Ally of the Netherwing"
DELETE FROM `disables` WHERE `entry`=10871 AND `sourceType`=1;
INSERT INTO `disables` (`sourceType`,`entry`,`comment`) VALUES (1,10871, 'Deprecated quest - Ally of the Netherwing (first version - when it was for alliance only, reworked after 3.3.0)');
@@ -509,6 +509,11 @@ int32 AuraEffect::CalculateAmount(Unit* caster)
// custom amount calculations go here
switch (GetAuraType())
{
// Control vehicle auras should not get m_amount sum out of basepoints and DieSide calculated together,
// but only from basepoints. Only such aura case fow now so handle it here.
case SPELL_AURA_CONTROL_VEHICLE:
m_amount = m_baseAmount;
break;
// crowd control auras
case SPELL_AURA_MOD_CONFUSE:
case SPELL_AURA_MOD_FEAR:
@@ -3180,7 +3185,6 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m
if (apply)
{
// correct amount is already calculated adding one more -1 meant calculated amount - 1
caster->_EnterVehicle(target->GetVehicleKit(), m_amount, aurApp);
}
else
+3
View File
@@ -3614,6 +3614,9 @@ void SpellMgr::LoadSpellInfoCorrections()
case 40167: // Introspection
spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1;
break;
case 45524: // Chains of Ice
spellInfo->EffectImplicitTargetA[EFFECT_2] = 0;
break;
case 2378: // Minor Fortitude
spellInfo->ManaCost = 0;
spellInfo->ManaPerSecond = 0;
+98 -1
View File
@@ -46,6 +46,14 @@ public:
{ "email", SEC_GAMEMASTER, true, &HandleLookupPlayerEmailCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupSpellCommandTable[] =
{
{ "id", SEC_ADMINISTRATOR, true, &HandleLookupSpellIdCommand, "", NULL },
{ "", SEC_ADMINISTRATOR, true, &HandleLookupSpellCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupCommandTable[] =
{
{ "area", SEC_MODERATOR, true, &HandleLookupAreaCommand, "", NULL },
@@ -58,13 +66,14 @@ public:
{ "quest", SEC_ADMINISTRATOR, true, &HandleLookupQuestCommand, "", NULL },
{ "player", SEC_GAMEMASTER, true, NULL, "", lookupPlayerCommandTable },
{ "skill", SEC_ADMINISTRATOR, true, &HandleLookupSkillCommand, "", NULL },
{ "spell", SEC_ADMINISTRATOR, true, &HandleLookupSpellCommand, "", NULL },
{ "spell", SEC_ADMINISTRATOR, true, NULL, "", lookupSpellCommandTable },
{ "taxinode", SEC_ADMINISTRATOR, true, &HandleLookupTaxiNodeCommand, "", NULL },
{ "tele", SEC_MODERATOR, true, &HandleLookupTeleCommand, "", NULL },
{ "title", SEC_GAMEMASTER, true, &HandleLookupTitleCommand, "", NULL },
{ "map", SEC_ADMINISTRATOR, true, &HandleLookupMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
{ "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable },
@@ -850,6 +859,94 @@ public:
return true;
}
static bool HandleLookupSpellIdCommand(ChatHandler* handler, char const* args)
{
if (!*args)
return false;
// can be NULL at console call
Player* target = handler->getSelectedPlayer();
uint32 id = atoi((char*)args);
bool found = false;
uint32 count = 0;
uint32 maxResults = 1;
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id);
if (spellInfo)
{
int locale = handler->GetSessionDbcLocale();
std::string name = spellInfo->SpellName[locale];
if (name.empty())
{
handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND);
return true;
}
if (locale < TOTAL_LOCALES)
{
if (maxResults && count++ == maxResults)
{
handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
return true;
}
bool known = target && target->HasSpell(id);
bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL);
SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell);
uint32 talentCost = GetTalentSpellCost(id);
bool talent = (talentCost > 0);
bool passive = spellInfo->IsPassive();
bool active = target && target->HasAura(id);
// unit32 used to prevent interpreting uint8 as char at output
// find rank of learned spell for learning spell, or talent rank
uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank();
// send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
std::ostringstream ss;
if (handler->GetSession())
ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
else
ss << id << " - " << name;
// include rank in link name
if (rank)
ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank;
if (handler->GetSession())
ss << ' ' << localeNames[locale] << "]|h|r";
else
ss << ' ' << localeNames[locale];
if (talent)
ss << handler->GetTrinityString(LANG_TALENT);
if (passive)
ss << handler->GetTrinityString(LANG_PASSIVE);
if (learn)
ss << handler->GetTrinityString(LANG_LEARN);
if (known)
ss << handler->GetTrinityString(LANG_KNOWN);
if (active)
ss << handler->GetTrinityString(LANG_ACTIVE);
handler->SendSysMessage(ss.str().c_str());
if (!found)
found = true;
}
}
if (!found)
handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND);
return true;
}
static bool HandleLookupTaxiNodeCommand(ChatHandler* handler, const char * args)
{
if (!*args)
@@ -585,6 +585,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE)
{
if (Creature* ravager = go->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true))
@@ -740,6 +741,7 @@ class go_bristlelimb_cage : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go)
{
go->SetGoState(GO_STATE_READY);
if (player->GetQuestStatus(QUEST_THE_PROPHECY_OF_AKIDA) == QUEST_STATUS_INCOMPLETE)
{
if (Creature* capitive = go->FindNearestCreature(NPC_STILLPINE_CAPITIVE, 5.0f, true))
@@ -168,9 +168,9 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->SetGoState(GO_STATE_READY);
if (Creature* stillpine = go->FindNearestCreature(NPC_PRINCESS_STILLPINE, 25, true))
{
go->SetGoState(GO_STATE_ACTIVE);
stillpine->GetMotionMaster()->MovePoint(1, go->GetPositionX(), go->GetPositionY()-15, go->GetPositionZ());
player->CastedCreatureOrGO(NPC_PRINCESS_STILLPINE, 0, SPELL_OPENING_PRINCESS_STILLPINE_CREDIT);
}
@@ -748,9 +748,9 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (Creature* prisoner = go->FindNearestCreature(NPC_THERAMORE_PRISONER, 1.0f))
{
go->UseDoorOrButton();
if (player)
player->KilledMonsterCredit(NPC_THERAMORE_PRISONER, 0);
+1 -1
View File
@@ -1398,12 +1398,12 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE)
{
Creature* pGymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f);
if (pGymerDummy)
{
go->UseDoorOrButton();
player->KilledMonsterCredit(pGymerDummy->GetEntry(), pGymerDummy->GetGUID());
pGymerDummy->CastSpell(pGymerDummy, 55529, true);
pGymerDummy->DisappearAndDie();
+2 -4
View File
@@ -388,11 +388,11 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->SetGoState(GO_STATE_READY);
if (go->GetEntry() == GO_CORKIS_PRISON)
{
if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true))
{
go->SetGoState(GO_STATE_READY);
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
if (player)
player->KilledMonsterCredit(NPC_CORKI_CREDIT_1, 0);
@@ -403,7 +403,6 @@ public:
{
if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true))
{
go->SetGoState(GO_STATE_READY);
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ());
if (player)
player->KilledMonsterCredit(NPC_CORKI_2, 0);
@@ -414,7 +413,6 @@ public:
{
if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true))
{
go->SetGoState(GO_STATE_READY);
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ());
if (player)
player->KilledMonsterCredit(NPC_CORKI_CREDIT_3, 0);
@@ -683,12 +681,12 @@ class go_warmaul_prison : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE)
return false;
if (Creature* prisoner = go->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f))
{
go->UseDoorOrButton();
player->KilledMonsterCredit(NPC_MAGHAR_PRISONER, 0);
prisoner->AI()->Talk(SAY_FREE, player->GetGUID());
+1 -3
View File
@@ -1052,12 +1052,10 @@ class go_captain_tyralius_prison : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (Creature* tyralius = go->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f))
{
go->UseDoorOrButton();
player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS, 0);
tyralius->AI()->Talk(SAY_FREE);
tyralius->DespawnOrUnsummon(8000);
}
+10 -7
View File
@@ -309,6 +309,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
int Random = rand() % (sizeof(NpcPrisonEntry) / sizeof(uint32));
if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player),
@@ -358,6 +359,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
int Random = rand() % (sizeof(NpcStasisEntry) / sizeof(uint32));
player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player),
@@ -729,9 +731,9 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true))
{
go->SetGoState(GO_STATE_ACTIVE);
player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID());
pNearestPrisoner->DisappearAndDie();
}
@@ -811,6 +813,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true);
if (!pPrisoner)
{
@@ -1047,6 +1050,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE)
return true;
@@ -1094,12 +1098,12 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE)
{
Creature* pTadpole = go->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f);
if (pTadpole)
{
go->UseDoorOrButton();
pTadpole->DisappearAndDie();
player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE, 0);
//FIX: Summon minion tadpole
@@ -1229,13 +1233,12 @@ class go_gjalerbron_cage : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if ((player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestStatus(QUEST_ALLIANCE_OF_KEYS_AND_CAGES) == QUEST_STATUS_INCOMPLETE) ||
(player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_HORDE_OF_KEYS_AND_CAGES) == QUEST_STATUS_INCOMPLETE))
{
if (Creature* prisoner = go->FindNearestCreature(NPC_GJALERBRON_PRISONER, 5.0f))
{
go->UseDoorOrButton();
if (player)
player->KilledMonsterCredit(NPC_GJALERBRON_PRISONER, 0);
@@ -1258,6 +1261,7 @@ class go_large_gjalerbron_cage : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if ((player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestStatus(QUEST_ALLIANCE_OF_KEYS_AND_CAGES) == QUEST_STATUS_INCOMPLETE) ||
(player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_HORDE_OF_KEYS_AND_CAGES) == QUEST_STATUS_INCOMPLETE))
{
@@ -1265,7 +1269,6 @@ class go_large_gjalerbron_cage : public GameObjectScript
GetCreatureListWithEntryInGrid(prisonerList, go, NPC_GJALERBRON_PRISONER, INTERACTION_DISTANCE);
for (std::list<Creature*>::const_iterator itr = prisonerList.begin(); itr != prisonerList.end(); ++itr)
{
go->UseDoorOrButton();
player->KilledMonsterCredit(NPC_GJALERBRON_PRISONER, (*itr)->GetGUID());
(*itr)->DespawnOrUnsummon(6000);
(*itr)->AI()->Talk(SAY_FREE);
@@ -1293,13 +1296,13 @@ class go_veil_skith_cage : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE)
{
std::list<Creature*> childrenList;
GetCreatureListWithEntryInGrid(childrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE);
for (std::list<Creature*>::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr)
{
go->UseDoorOrButton();
player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID());
(*itr)->DespawnOrUnsummon(5000);
(*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
@@ -1330,10 +1333,10 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton(10);
if (!player->HasAura(SPELL_RECENT_MEDITATION))
if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
{
go->UseDoorOrButton(10);
player->CastSpell(player, SPELL_CLEANSING_SOUL);
player->SetStandState(UNIT_STAND_STATE_SIT);
}