*Integrate Script system to Core

-added ScriptMgr for loading scripts
-removed bindings
-moved script system to src/game
-moved scripts to src/scripts
-VC project files updated
-cmakes updated (not 100% done yet)

NOTE to Devs:
-file locations changed
-precompiled renamed to ScriptedPch
-ecsort_ai renamed to ScriptedEscortAI
-follower_ai renamed to ScriptedFollowerAI
-guard_ai renamed to ScriptedGuardAI
-simple_ai renamed to ScriptedSimpleAI
-sc_creature renamed to ScriptedCreature
-sc_gossip renamed to ScriptedGossip
-sc_instance  renamed to ScriptedInstance

*use the new headers in scripts, thank you

NOTE to ALL:
cmake not fully tested, please report any errors with it
could make creashes, incompability
USE AT YOUR OWN RISK before further tests!!

--HG--
branch : trunk
This commit is contained in:
Rat
2010-01-19 11:36:05 +01:00
parent f5dea61b66
commit 0cc053ea4d
601 changed files with 3908 additions and 7245 deletions
+701
View File
@@ -0,0 +1,701 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: The_Barrens
SD%Complete: 90
SDComment: Quest support: 863, 898, 1719, 2458, 4921, 6981,
SDCategory: Barrens
EndScriptData */
/* ContentData
npc_beaten_corpse
npc_gilthares
npc_sputtervalve
npc_taskmaster_fizzule
npc_twiggy_flathead
npc_wizzlecrank_shredder
EndContentData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
/*######
## npc_beaten_corpse
######*/
#define GOSSIP_CORPSE "Examine corpse in detail..."
enum eQuests
{
QUEST_LOST_IN_BATTLE = 4921
};
bool GossipHello_npc_beaten_corpse(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_COMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(3557, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_beaten_corpse(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF +1)
{
pPlayer->SEND_GOSSIP_MENU(3558, pCreature->GetGUID());
pPlayer->TalkedToCreature(pCreature->GetEntry(), pCreature->GetGUID());
}
return true;
}
/*######
# npc_gilthares
######*/
enum eGilthares
{
SAY_GIL_START = -1000370,
SAY_GIL_AT_LAST = -1000371,
SAY_GIL_PROCEED = -1000372,
SAY_GIL_FREEBOOTERS = -1000373,
SAY_GIL_AGGRO_1 = -1000374,
SAY_GIL_AGGRO_2 = -1000375,
SAY_GIL_AGGRO_3 = -1000376,
SAY_GIL_AGGRO_4 = -1000377,
SAY_GIL_ALMOST = -1000378,
SAY_GIL_SWEET = -1000379,
SAY_GIL_FREED = -1000380,
QUEST_FREE_FROM_HOLD = 898,
AREA_MERCHANT_COAST = 391,
FACTION_ESCORTEE = 232 //guessed, possible not needed for this quest
};
struct TRINITY_DLL_DECL npc_giltharesAI : public npc_escortAI
{
npc_giltharesAI(Creature* pCreature) : npc_escortAI(pCreature) { }
void Reset() { }
void WaypointReached(uint32 uiPointId)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
switch(uiPointId)
{
case 16:
DoScriptText(SAY_GIL_AT_LAST, m_creature, pPlayer);
break;
case 17:
DoScriptText(SAY_GIL_PROCEED, m_creature, pPlayer);
break;
case 18:
DoScriptText(SAY_GIL_FREEBOOTERS, m_creature, pPlayer);
break;
case 37:
DoScriptText(SAY_GIL_ALMOST, m_creature, pPlayer);
break;
case 47:
DoScriptText(SAY_GIL_SWEET, m_creature, pPlayer);
break;
case 53:
DoScriptText(SAY_GIL_FREED, m_creature, pPlayer);
pPlayer->GroupEventHappens(QUEST_FREE_FROM_HOLD, m_creature);
break;
}
}
void Aggro(Unit* pWho)
{
//not always use
if (rand()%4)
return;
//only aggro text if not player and only in this area
if (pWho->GetTypeId() != TYPEID_PLAYER && m_creature->GetAreaId() == AREA_MERCHANT_COAST)
{
//appears to be pretty much random (possible only if escorter not in combat with pWho yet?)
DoScriptText(RAND(SAY_GIL_AGGRO_1, SAY_GIL_AGGRO_2, SAY_GIL_AGGRO_3, SAY_GIL_AGGRO_4), m_creature, pWho);
}
}
};
CreatureAI* GetAI_npc_gilthares(Creature* pCreature)
{
return new npc_giltharesAI(pCreature);
}
bool QuestAccept_npc_gilthares(Player* pPlayer, Creature* pCreature, const Quest* pQuest)
{
if (pQuest->GetQuestId() == QUEST_FREE_FROM_HOLD)
{
pCreature->setFaction(FACTION_ESCORTEE);
pCreature->SetStandState(UNIT_STAND_STATE_STAND);
DoScriptText(SAY_GIL_START, pCreature, pPlayer);
if (npc_giltharesAI* pEscortAI = CAST_AI(npc_giltharesAI, pCreature->AI()))
pEscortAI->Start(false, false, pPlayer->GetGUID(), pQuest);
}
return true;
}
/*######
## npc_sputtervalve
######*/
#define GOSSIP_SPUTTERVALVE "Can you tell me about this shard?"
bool GossipHello_npc_sputtervalve(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(6981) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SPUTTERVALVE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_sputtervalve(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF)
{
pPlayer->SEND_GOSSIP_MENU(2013, pCreature->GetGUID());
pPlayer->AreaExploredOrEventHappens(6981);
}
return true;
}
/*######
## npc_taskmaster_fizzule
######*/
enum eEnums
{
FACTION_FRIENDLY_F = 35,
SPELL_FLARE = 10113,
SPELL_FOLLY = 10137,
};
struct TRINITY_DLL_DECL npc_taskmaster_fizzuleAI : public ScriptedAI
{
npc_taskmaster_fizzuleAI(Creature* c) : ScriptedAI(c)
{
factionNorm = c->getFaction();
}
uint32 factionNorm;
bool IsFriend;
uint32 Reset_Timer;
uint8 FlareCount;
void Reset()
{
IsFriend = false;
Reset_Timer = 120000;
FlareCount = 0;
m_creature->setFaction(factionNorm);
}
void DoFriend()
{
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop(true);
m_creature->StopMoving();
m_creature->GetMotionMaster()->MoveIdle();
m_creature->setFaction(FACTION_FRIENDLY_F);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
}
void SpellHit(Unit *caster, const SpellEntry *spell)
{
if (spell->Id == SPELL_FLARE || spell->Id == SPELL_FOLLY)
{
++FlareCount;
if (FlareCount >= 2)
IsFriend = true;
}
}
void EnterCombat(Unit* who) { }
void UpdateAI(const uint32 diff)
{
if (IsFriend)
{
if (Reset_Timer <= diff)
{
EnterEvadeMode();
return;
} else Reset_Timer -= diff;
}
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
void ReceiveEmote(Player* pPlayer, uint32 emote)
{
if (emote == TEXTEMOTE_SALUTE)
{
if (FlareCount >= 2)
{
if (m_creature->getFaction() == FACTION_FRIENDLY_F)
return;
DoFriend();
}
}
}
};
CreatureAI* GetAI_npc_taskmaster_fizzule(Creature* pCreature)
{
return new npc_taskmaster_fizzuleAI(pCreature);
}
/*#####
## npc_twiggy_flathead
#####*/
enum eTwiggyFlathead
{
NPC_BIG_WILL = 6238,
NPC_AFFRAY_CHALLENGER = 6240,
SAY_BIG_WILL_READY = -1000123,
SAY_TWIGGY_FLATHEAD_BEGIN = -1000124,
SAY_TWIGGY_FLATHEAD_FRAY = -1000125,
SAY_TWIGGY_FLATHEAD_DOWN = -1000126,
SAY_TWIGGY_FLATHEAD_OVER = -1000127,
};
float AffrayChallengerLoc[6][4]=
{
{-1683, -4326, 2.79, 0},
{-1682, -4329, 2.79, 0},
{-1683, -4330, 2.79, 0},
{-1680, -4334, 2.79, 1.49},
{-1674, -4326, 2.79, 3.49},
{-1677, -4334, 2.79, 1.66}
};
struct TRINITY_DLL_DECL npc_twiggy_flatheadAI : public ScriptedAI
{
npc_twiggy_flatheadAI(Creature *c) : ScriptedAI(c) {}
bool EventInProgress;
bool EventGrate;
bool EventBigWill;
bool Challenger_down[6];
uint32 Wave;
uint32 Wave_Timer;
uint32 Challenger_checker;
uint64 PlayerGUID;
uint64 AffrayChallenger[6];
uint64 BigWill;
void Reset()
{
EventInProgress = false;
EventGrate = false;
EventBigWill = false;
Wave_Timer = 600000;
Challenger_checker = 0;
Wave = 0;
PlayerGUID = 0;
for (uint8 i = 0; i < 6; ++i)
{
AffrayChallenger[i] = 0;
Challenger_down[i] = false;
}
BigWill = 0;
}
void EnterCombat(Unit *who) { }
void MoveInLineOfSight(Unit *who)
{
if (!who || (!who->isAlive())) return;
if (m_creature->IsWithinDistInMap(who, 10.0f) && (who->GetTypeId() == TYPEID_PLAYER) && CAST_PLR(who)->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE && !EventInProgress)
{
PlayerGUID = who->GetGUID();
EventInProgress = true;
}
}
void KilledUnit(Unit *victim) { }
void UpdateAI(const uint32 diff)
{
if (EventInProgress) {
Player* pWarrior = NULL;
if (PlayerGUID)
pWarrior = Unit::GetPlayer(PlayerGUID);
if (!pWarrior)
return;
if (!pWarrior->isAlive() && pWarrior->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) {
EventInProgress = false;
DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, m_creature);
pWarrior->FailQuest(1719);
for (uint8 i = 0; i < 6; ++i)
{
if (AffrayChallenger[i])
{
Creature* pCreature = Unit::GetCreature((*m_creature), AffrayChallenger[i]);
if (pCreature) {
if (pCreature->isAlive())
{
pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pCreature->setDeathState(JUST_DIED);
}
}
}
AffrayChallenger[i] = 0;
Challenger_down[i] = false;
}
if (BigWill)
{
Creature* pCreature = Unit::GetCreature((*m_creature), BigWill);
if (pCreature) {
if (pCreature->isAlive()) {
pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pCreature->setDeathState(JUST_DIED);
}
}
}
BigWill = 0;
}
if (!EventGrate && EventInProgress)
{
float x,y,z;
pWarrior->GetPosition(x, y, z);
if (x >= -1684 && x <= -1674 && y >= -4334 && y <= -4324) {
pWarrior->AreaExploredOrEventHappens(1719);
DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, m_creature);
for (uint8 i = 0; i < 6; ++i)
{
Creature* pCreature = m_creature->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i][0], AffrayChallengerLoc[i][1], AffrayChallengerLoc[i][2], AffrayChallengerLoc[i][3], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
if (!pCreature)
continue;
pCreature->setFaction(35);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pCreature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
AffrayChallenger[i] = pCreature->GetGUID();
}
Wave_Timer = 5000;
Challenger_checker = 1000;
EventGrate = true;
}
}
else if (EventInProgress)
{
if (Challenger_checker <= diff)
{
for (uint8 i = 0; i < 6; ++i)
{
if (AffrayChallenger[i])
{
Creature* pCreature = Unit::GetCreature((*m_creature), AffrayChallenger[i]);
if ((!pCreature || (!pCreature->isAlive())) && !Challenger_down[i])
{
DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, m_creature);
Challenger_down[i] = true;
}
}
}
Challenger_checker = 1000;
} else Challenger_checker -= diff;
if (Wave_Timer <= diff)
{
if (AffrayChallenger[Wave] && Wave < 6 && !EventBigWill)
{
DoScriptText(SAY_TWIGGY_FLATHEAD_FRAY, m_creature);
Creature* pCreature = Unit::GetCreature((*m_creature), AffrayChallenger[Wave]);
if (pCreature && (pCreature->isAlive()))
{
pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pCreature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
pCreature->setFaction(14);
pCreature->AI()->AttackStart(pWarrior);
++Wave;
Wave_Timer = 20000;
}
}
else if (Wave >= 6 && !EventBigWill) {
if (Creature* pCreature = m_creature->SummonCreature(NPC_BIG_WILL, -1722, -4341, 6.12, 6.26, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 480000))
{
BigWill = pCreature->GetGUID();
//pCreature->GetMotionMaster()->MovePoint(0, -1693, -4343, 4.32);
//pCreature->GetMotionMaster()->MovePoint(1, -1684, -4333, 2.78);
pCreature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79);
pCreature->HandleEmoteCommand(EMOTE_STATE_READYUNARMED);
EventBigWill = true;
Wave_Timer = 1000;
}
}
else if (Wave >= 6 && EventBigWill && BigWill)
{
Creature* pCreature = Unit::GetCreature((*m_creature), BigWill);
if (!pCreature || !pCreature->isAlive())
{
DoScriptText(SAY_TWIGGY_FLATHEAD_OVER, m_creature);
EventInProgress = false;
EventBigWill = false;
EventGrate = false;
PlayerGUID = 0;
Wave = 0;
}
}
} else Wave_Timer -= diff;
}
}
}
};
CreatureAI* GetAI_npc_twiggy_flathead(Creature* pCreature)
{
return new npc_twiggy_flatheadAI (pCreature);
}
/*#####
## npc_wizzlecrank_shredder
#####*/
enum eEnums_Wizzlecrank
{
SAY_START = -1000272,
SAY_STARTUP1 = -1000273,
SAY_STARTUP2 = -1000274,
SAY_MERCENARY = -1000275,
SAY_PROGRESS_1 = -1000276,
SAY_PROGRESS_2 = -1000277,
SAY_PROGRESS_3 = -1000278,
SAY_END = -1000279,
QUEST_ESCAPE = 863,
FACTION_RATCHET = 637,
NPC_PILOT_WIZZ = 3451,
NPC_MERCENARY = 3282,
};
struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI
{
npc_wizzlecrank_shredderAI(Creature* pCreature) : npc_escortAI(pCreature)
{
m_bIsPostEvent = false;
m_uiPostEventTimer = 1000;
m_uiPostEventCount = 0;
}
bool m_bIsPostEvent;
uint32 m_uiPostEventTimer;
uint32 m_uiPostEventCount;
void Reset()
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
{
if (m_creature->getStandState() == UNIT_STAND_STATE_DEAD)
m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_bIsPostEvent = false;
m_uiPostEventTimer = 1000;
m_uiPostEventCount = 0;
}
}
void WaypointReached(uint32 uiPointId)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
switch(uiPointId)
{
case 0:
DoScriptText(SAY_STARTUP1, m_creature);
break;
case 9:
SetRun(false);
break;
case 17:
if (Creature* pTemp = m_creature->SummonCreature(NPC_MERCENARY, 1128.489f, -3037.611f, 92.701f, 1.472f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000))
{
DoScriptText(SAY_MERCENARY, pTemp);
m_creature->SummonCreature(NPC_MERCENARY, 1160.172f, -2980.168f, 97.313f, 3.690f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
}
break;
case 24:
m_bIsPostEvent = true;
break;
}
}
void WaypointStart(uint32 uiPointId)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
switch(uiPointId)
{
case 9:
DoScriptText(SAY_STARTUP2, m_creature, pPlayer);
break;
case 18:
DoScriptText(SAY_PROGRESS_1, m_creature, pPlayer);
SetRun();
break;
}
}
void JustSummoned(Creature* pSummoned)
{
if (pSummoned->GetEntry() == NPC_PILOT_WIZZ)
m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
if (pSummoned->GetEntry() == NPC_MERCENARY)
pSummoned->AI()->AttackStart(m_creature);
}
void UpdateEscortAI(const uint32 uiDiff)
{
if (!UpdateVictim())
{
if (m_bIsPostEvent)
{
if (m_uiPostEventTimer <= uiDiff)
{
switch(m_uiPostEventCount)
{
case 0:
DoScriptText(SAY_PROGRESS_2, m_creature);
break;
case 1:
DoScriptText(SAY_PROGRESS_3, m_creature);
break;
case 2:
DoScriptText(SAY_END, m_creature);
break;
case 3:
if (Player* pPlayer = GetPlayerForEscort())
{
pPlayer->GroupEventHappens(QUEST_ESCAPE, m_creature);
m_creature->SummonCreature(NPC_PILOT_WIZZ, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 180000);
}
break;
}
++m_uiPostEventCount;
m_uiPostEventTimer = 5000;
}
else
m_uiPostEventTimer -= uiDiff;
}
return;
}
DoMeleeAttackIfReady();
}
};
bool QuestAccept_npc_wizzlecrank_shredder(Player* pPlayer, Creature* pCreature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_ESCAPE)
{
pCreature->setFaction(FACTION_RATCHET);
if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredderAI, pCreature->AI()))
pEscortAI->Start(true, false, pPlayer->GetGUID());
}
return true;
}
CreatureAI* GetAI_npc_wizzlecrank_shredderAI(Creature* pCreature)
{
return new npc_wizzlecrank_shredderAI(pCreature);
}
void AddSC_the_barrens()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_beaten_corpse";
newscript->pGossipHello = &GossipHello_npc_beaten_corpse;
newscript->pGossipSelect = &GossipSelect_npc_beaten_corpse;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_gilthares";
newscript->GetAI = &GetAI_npc_gilthares;
newscript->pQuestAccept = &QuestAccept_npc_gilthares;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_sputtervalve";
newscript->pGossipHello = &GossipHello_npc_sputtervalve;
newscript->pGossipSelect = &GossipSelect_npc_sputtervalve;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_taskmaster_fizzule";
newscript->GetAI = &GetAI_npc_taskmaster_fizzule;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_twiggy_flathead";
newscript->GetAI = &GetAI_npc_twiggy_flathead;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_wizzlecrank_shredder";
newscript->GetAI = &GetAI_npc_wizzlecrank_shredderAI;
newscript->pQuestAccept = &QuestAccept_npc_wizzlecrank_shredder;
newscript->RegisterSelf();
}