*Update to HG 730.

--HG--
branch : trunk
This commit is contained in:
megamage
2008-12-31 10:03:07 -06:00
39 changed files with 1408 additions and 511 deletions
+17 -3
View File
@@ -29,6 +29,7 @@ struct StringTextData
uint32 SoundId;
uint8 Type;
uint32 Language;
uint32 Emote;
};
// Enums used by StringTextData::Type
@@ -654,7 +655,7 @@ void LoadDatabase()
LoadTrinityStrings(TScriptDB,"eventai_texts",-1,1+(TEXT_SOURCE_RANGE));
// Gather Additional data from EventAI Texts
result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM eventai_texts");
result = TScriptDB.PQuery("SELECT entry, sound, type, language, emote FROM eventai_texts");
outstring_log("TSCR: Loading EventAI Texts additional data...");
if (result)
@@ -672,6 +673,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
temp.Emote = fields[4].GetInt32();
if (i >= 0)
{
@@ -736,6 +738,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
temp.Emote = fields[4].GetInt32();
if (i >= 0)
{
@@ -782,7 +785,7 @@ void LoadDatabase()
LoadTrinityStrings(TScriptDB,"custom_texts",TEXT_SOURCE_RANGE*2,1+(TEXT_SOURCE_RANGE*3));
// Gather Additional data from Custom Texts
result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM custom_texts");
result = TScriptDB.PQuery("SELECT entry, sound, type, language, emote FROM custom_texts");
outstring_log("TSCR: Loading Custom Texts additional data...");
if (result)
@@ -800,6 +803,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
temp.Emote = fields[4].GetInt32();
if (i >= 0)
{
@@ -1838,7 +1842,7 @@ void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target)
return;
}
debug_log("TSCR: DoScriptText: text entry=%i, Sound=%u, Type=%u, Language=%u",textEntry,(*i).second.SoundId,(*i).second.Type,(*i).second.Language);
debug_log("TSCR: DoScriptText: text entry=%i, Sound=%u, Type=%u, Language=%u, Emote=%u",textEntry,(*i).second.SoundId,(*i).second.Type,(*i).second.Language,(*i).second.Emote);
if((*i).second.SoundId)
{
@@ -1850,6 +1854,16 @@ void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target)
error_log("TSCR: DoScriptText entry %i tried to process invalid sound id %u.",textEntry,(*i).second.SoundId);
}
if((*i).second.Emote)
{
if (pSource->GetTypeId() == TYPEID_UNIT || pSource->GetTypeId() == TYPEID_PLAYER)
{
((Unit*)pSource)->HandleEmoteCommand((*i).second.Emote);
}
else
error_log("TSCR: DoScriptText entry %i tried to process emote for invalid TypeId (%u).",textEntry,pSource->GetTypeId());
}
switch((*i).second.Type)
{
case CHAT_TYPE_SAY:
@@ -37,6 +37,7 @@ content_loc8 This is the actual text presented in the Localization #8 C
sound This value is the Sound ID that corresponds to the actual text used (Defined in SoundEntries.dbc).
type Variables used to define type of text (Say/Yell/Textemote/Whisper).
language This value is the Language that the text is native in (Defined in Languages.dbc).
emote Value from enum Emote (defined in Emotes.dbc). Only source of text will play this emote (not target, if target are defined in DoScriptText)
comment This is a comment regarding the text entry (For ACID, accepted format is to use Creature ID of NPC using it).
Note: Fields `content_loc1` to `content_loc8` are NULL values by default and are handled by seperate localization projects.
@@ -17,13 +17,15 @@
/* ScriptData
SDName: Eversong_Woods
SD%Complete: 100
SDComment: Quest support: 8346, 8483
SDComment: Quest support: 8346, 8483, 8488, 8490
SDCategory: Eversong Woods
EndScriptData */
/* ContentData
mobs_mana_tapped
npc_prospector_anvilward
npc_apprentice_mirveda
npc_infused_crystal
EndContentData */
#include "precompiled.h"
@@ -547,6 +549,208 @@ bool GOHello_go_second_trial(Player *player, GameObject* _GO)
return true;
}
/*######
## npc_apprentice_mirveda
######*/
#define QUEST_UNEXPECTED_RESULT 8488
#define MOB_GHARZUL 15958
#define MOB_ANGERSHADE 15656
struct TRINITY_DLL_DECL npc_apprentice_mirvedaAI : public ScriptedAI
{
npc_apprentice_mirvedaAI(Creature* c) : ScriptedAI(c), Summons(m_creature) {Reset();}
uint32 KillCount;
uint64 PlayerGUID;
bool Summon;
SummonList Summons;
void Reset()
{
KillCount = 0;
PlayerGUID = 0;
Summons.DespawnAll();
Summon = false;
}
void Aggro(Unit* who){}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature);
Summons.Summon(summoned);
}
void SummonedCreatureDespawn(Creature* summoned)
{
Summons.Despawn(summoned);
++KillCount;
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_UNEXPECTED_RESULT);
}
}
void UpdateAI(const uint32 diff)
{
if(KillCount >= 3)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
((Player*)player)->GroupEventHappens(QUEST_UNEXPECTED_RESULT, m_creature);
}
}
if(Summon)
{
m_creature->SummonCreature(MOB_GHARZUL, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
m_creature->SummonCreature(MOB_ANGERSHADE, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
m_creature->SummonCreature(MOB_ANGERSHADE, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
Summon = false;
}
}
};
bool QuestAccept_npc_apprentice_mirveda(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_UNEXPECTED_RESULT)
{
((npc_apprentice_mirvedaAI*)creature->AI())->Summon = true;
((npc_apprentice_mirvedaAI*)creature->AI())->PlayerGUID = player->GetGUID();
}
return true;
}
CreatureAI* GetAI_npc_apprentice_mirvedaAI(Creature *_Creature)
{
return new npc_apprentice_mirvedaAI (_Creature);
}
/*######
## npc_infused_crystal not working yet.
######*/
#define MOB_ENRAGED_WRAITH 17086
#define EMOTE "releases the last of its energies into the nerarby runestone, succesfully reactivating it."
#define QUEST_POWERING_OUR_DEFENSES 8490
struct Location
{
float x, y, z;
};
static Location SpawnLocations[]=
{
{8270.68, -7188.53, 139.619},
{8284.27, -7187.78, 139.603},
{8297.43, -7193.53, 139.603},
{8303.5, -7201.96, 139.577},
{8273.22, -7241.82, 139.382},
{8254.89, -7222.12, 139.603},
{8278.51, -7242.13, 139.162},
{8267.97, -7239.17, 139.517}
};
struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI
{
npc_infused_crystalAI(Creature* c) : Scripted_NoMovementAI(c) {Reset();}
uint32 EndTimer;
uint32 WaveTimer;
bool Completed;
bool Progress;
uint64 PlayerGUID;
void Reset()
{
EndTimer = 0;
WaveTimer = 0;
PlayerGUID = 0;
Completed = false;
Progress = false;
}
void Aggro(Unit* who){}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void MoveInLineOfSight(Unit* who)
{
error_log("MoveLos");
if( who->GetTypeId() == TYPEID_PLAYER && !m_creature->canStartAttack(who) )
{
error_log("TypeId check");
if( ((Player*)who)->GetQuestStatus(QUEST_POWERING_OUR_DEFENSES) == QUEST_STATUS_INCOMPLETE )
{
error_log("Queststaus");
float Radius = 10.0;
if( m_creature->IsWithinDistInMap(who, Radius) )
{
PlayerGUID = who->GetGUID();
WaveTimer = 1000;
EndTimer = 60000;
Progress = true;
error_log("Event started");
}
}
}
}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_POWERING_OUR_DEFENSES);
}
}
void UpdateAI(const uint32 diff)
{
if(EndTimer < diff && Progress)
{
DoTextEmote(EMOTE, NULL);
Completed = true;
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
((Player*)player)->GroupEventHappens(QUEST_POWERING_OUR_DEFENSES, m_creature);
}
m_creature->DealDamage(m_creature,m_creature->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
error_log("EndTimer done");
}else EndTimer -= diff;
if(WaveTimer < diff && !Completed && Progress)
{
uint32 ran = rand()%8;
DoSpawnCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran].x, SpawnLocations[ran].y, SpawnLocations[ran].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
DoSpawnCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran].x, SpawnLocations[ran].y, SpawnLocations[ran].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
DoSpawnCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran].x, SpawnLocations[ran].y, SpawnLocations[ran].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
WaveTimer = 30000;
error_log("Wave summon");
}else WaveTimer -= diff;
}
};
CreatureAI* GetAI_npc_infused_crystalAI(Creature *_Creature)
{
return new npc_infused_crystalAI (_Creature);
}
void AddSC_eversong_woods()
{
Script *newscript;
@@ -579,4 +783,15 @@ void AddSC_eversong_woods()
newscript->Name="go_second_trial";
newscript->pGOHello = &GOHello_go_second_trial;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_apprentice_mirveda";
newscript->GetAI = &GetAI_npc_apprentice_mirvedaAI;
newscript->pQuestAccept = &QuestAccept_npc_apprentice_mirveda;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_infused_crystal";
newscript->GetAI = &GetAI_npc_infused_crystalAI;
newscript->RegisterSelf();
}
@@ -131,13 +131,13 @@ bool GOHello_gilded_brazier(Player *player, GameObject* _GO)
## npc_ranger_lilatha
######*/
#define SAY_START "Let's go."
#define SAY_PROGRESS1 "$N, let's use the antechamber to the right."
#define SAY_PROGRESS2 "I can see the light at the end of the tunnel!"
#define SAY_PROGRESS3 "There's Farstrider Enclave now, $C. Not far to go... Look out! Troll ambush!!"
#define SAY_END1 "Thank you for saving my life and bringing me back to safety, $N"
#define SAY_END2 "Captain Helios, I've been rescued from the Amani Catacombs. Reporting for duty, sir!"
#define CAPTAIN_ANSWER "Liatha, get someone to look at those injuries. Thank you for bringing her back safely."
#define SAY_START -1000140
#define SAY_PROGRESS1 -1000141
#define SAY_PROGRESS2 -1000142
#define SAY_PROGRESS3 -1000143
#define SAY_END1 -1000144
#define SAY_END2 -1000145
#define SAY_CAPTAIN_ANSWER -1000146
#define QUEST_ESCAPE_FROM_THE_CATACOMBS 9212
#define GO_CAGE 181152
@@ -164,18 +164,18 @@ struct TRINITY_DLL_DECL npc_ranger_lilathaAI : public npc_escortAI
GameObject* Cage = FindGameObject(GO_CAGE);
if(Cage)
Cage->SetGoState(0);
DoSay(SAY_START, LANG_UNIVERSAL, player);
DoScriptText(SAY_START, m_creature, player);
break;
}
case 5:
DoSay(SAY_PROGRESS1, LANG_UNIVERSAL, player); break;
DoScriptText(SAY_PROGRESS1, m_creature, player);
case 11:
DoSay(SAY_PROGRESS2, LANG_UNIVERSAL, player);
DoScriptText(SAY_PROGRESS2, m_creature, player);
m_creature->SetOrientation(4.762841);
break;
case 18:
{
DoSay(SAY_PROGRESS3, LANG_UNIVERSAL, player);
DoScriptText(SAY_PROGRESS3, m_creature, player);
Creature* Summ1 = m_creature->SummonCreature(16342, 7627.083984, -7532.538086, 152.128616, 1.082733, TEMPSUMMON_DEAD_DESPAWN, 0);
Creature* Summ2 = m_creature->SummonCreature(16343, 7620.432129, -7532.550293, 152.454865, 0.827478, TEMPSUMMON_DEAD_DESPAWN, 0);
Summ1->Attack(m_creature, true);
@@ -193,14 +193,14 @@ struct TRINITY_DLL_DECL npc_ranger_lilathaAI : public npc_escortAI
break;
case 32:
m_creature->SetOrientation(2.978281);
DoSay(SAY_END1, LANG_UNIVERSAL, player);
DoScriptText(SAY_END1, m_creature, player);
break;
case 33:
m_creature->SetOrientation(5.858011);
DoSay(SAY_END2, LANG_UNIVERSAL, player);
DoScriptText(SAY_END2, m_creature, player);
Unit* CaptainHelios = FindCreature(NPC_CAPTAIN_HELIOS, 50);
if(CaptainHelios)
((Creature*)CaptainHelios)->Say(CAPTAIN_ANSWER, LANG_UNIVERSAL, PlayerGUID);
DoScriptText(SAY_CAPTAIN_ANSWER, CaptainHelios, player);
break;
}
}