mirror of
https://github.com/Sarjuuk/aowow.git
synced 2025-11-29 15:58:16 +08:00
NPC/Trainer
* add support for https://github.com/TrinityCore/TrinityCore/commit/bf3ab6d9c43 * fixed some bugs causing conditions to not be displayed * fixed some trainer not being displayed for most skills
This commit is contained in:
@@ -43,17 +43,15 @@ SqlGen::register(new class extends SetupScript
|
||||
unit_class,
|
||||
unit_flags, unit_flags2, dynamicflags,
|
||||
family,
|
||||
trainer_type,
|
||||
trainer_spell,
|
||||
trainer_class,
|
||||
trainer_race,
|
||||
IFNULL(t.Type, 0),
|
||||
IFNULL(t.Requirement, 0),
|
||||
(CASE ct.exp WHEN 0 THEN min.damage_base WHEN 1 THEN min.damage_exp1 ELSE min.damage_exp2 END) AS dmgMin,
|
||||
(CASE ct.exp WHEN 0 THEN max.damage_base WHEN 1 THEN max.damage_exp1 ELSE max.damage_exp2 END) AS dmgMax,
|
||||
min.attackpower AS mleAtkPwrMin,
|
||||
max.attackpower AS mleAtkPwrMax,
|
||||
min.rangedattackpower AS rmgAtkPwrMin,
|
||||
max.rangedattackpower AS rmgAtkPwrMax,
|
||||
type,
|
||||
ct.type,
|
||||
type_flags,
|
||||
lootid, pickpocketloot, skinloot,
|
||||
IFNULL(cts0.Spell, 0), IFNULL(cts1.Spell, 0), IFNULL(cts2.Spell, 0), IFNULL(cts3.Spell, 0), IFNULL(cts4.Spell, 0), IFNULL(cts5.Spell, 0), IFNULL(cts6.Spell, 0), IFNULL(cts7.Spell, 0),
|
||||
@@ -77,6 +75,10 @@ SqlGen::register(new class extends SetupScript
|
||||
creature_classlevelstats min ON ct.unit_class = min.class AND ct.minlevel = min.level
|
||||
JOIN
|
||||
creature_classlevelstats max ON ct.unit_class = max.class AND ct.maxlevel = max.level
|
||||
LEFT JOIN
|
||||
creature_default_trainer cdt ON cdt.CreatureId = ct.entry
|
||||
LEFT JOIN
|
||||
trainer t ON t.Id = cdt.TrainerId
|
||||
LEFT JOIN
|
||||
creature_template_locale ctl2 ON ct.entry = ctl2.entry AND ctl2.`locale` = "frFR"
|
||||
LEFT JOIN
|
||||
|
||||
@@ -12,7 +12,7 @@ SqlGen::register(new class extends SetupScript
|
||||
protected $command = 'source';
|
||||
|
||||
protected $tblDependancyAowow = ['spell', 'achievement'];
|
||||
protected $tblDependancyTC = ['playercreateinfo_skills', 'playercreateinfo_item', 'skill_discovery_template', 'achievement_reward', 'skill_perfect_item_template', 'item_template', 'gameobject_template', 'quest_template', 'quest_template_addon', 'creature_template', 'creature', 'npc_trainer', 'npc_vendor', 'game_event_npc_vendor', 'reference_loot_template', 'item_loot_template', 'creature_loot_template', 'gameobject_loot_template', 'mail_loot_template', 'disenchant_loot_template', 'fishing_loot_template', 'skinning_loot_template', 'milling_loot_template', 'prospecting_loot_template', 'pickpocketing_loot_template'];
|
||||
protected $tblDependancyTC = ['playercreateinfo_skills', 'playercreateinfo_item', 'skill_discovery_template', 'achievement_reward', 'skill_perfect_item_template', 'item_template', 'gameobject_template', 'quest_template', 'quest_template_addon', 'creature_template', 'creature', 'trainer_spell', 'npc_vendor', 'game_event_npc_vendor', 'reference_loot_template', 'item_loot_template', 'creature_loot_template', 'gameobject_loot_template', 'mail_loot_template', 'disenchant_loot_template', 'fishing_loot_template', 'skinning_loot_template', 'milling_loot_template', 'prospecting_loot_template', 'pickpocketing_loot_template'];
|
||||
protected $dbcSourceFiles = ['charstartoutfit', 'talent', 'spell', 'skilllineability', 'itemextendedcost', 'lock'];
|
||||
|
||||
private function queryfy(array $data, string $query) : string
|
||||
@@ -1043,22 +1043,16 @@ SqlGen::register(new class extends SetupScript
|
||||
$buff = [];
|
||||
|
||||
foreach ($qSpells as $sId => $spell)
|
||||
{
|
||||
for ($i = 1; $i <= 3; $i++)
|
||||
{
|
||||
if ($spell['effect'.$i.'Id'] != 36) // effect: learnSpell
|
||||
continue;
|
||||
|
||||
$this->pushBuffer($buff, TYPE_SPELL, $spell['effect'.$i.'TriggerSpell'], $quests[$sId]['qty'] > 1 ? 0 : TYPE_QUEST, $quests[$sId]['qty'] > 1 ? 0 : $quests[$sId]['id'], $quests[$sId]['side']);
|
||||
}
|
||||
}
|
||||
if ($spell['effect'.$i.'Id'] == 36) // effect: learnSpell
|
||||
$this->pushBuffer($buff, TYPE_SPELL, $spell['effect'.$i.'TriggerSpell'], $quests[$sId]['qty'] > 1 ? 0 : TYPE_QUEST, $quests[$sId]['qty'] > 1 ? 0 : $quests[$sId]['id'], $quests[$sId]['side']);
|
||||
|
||||
DB::Aowow()->query($this->queryfy($buff, $insMore), 4, 4, 4);
|
||||
}
|
||||
|
||||
# 6: Trainer
|
||||
CLI::write(' * #6 Trainer');
|
||||
if ($tNpcs = DB::World()->select('SELECT SpellID AS ARRAY_KEY, ID AS entry, COUNT(1) AS qty FROM npc_trainer WHERE SpellID > 0 GROUP BY ARRAY_KEY'))
|
||||
if ($tNpcs = DB::World()->select('SELECT SpellID AS ARRAY_KEY, cdt.CreatureId AS entry, COUNT(1) AS qty FROM `trainer_spell` ts JOIN `creature_default_trainer` cdt ON cdt.TrainerId = ts.TrainerId GROUP BY ARRAY_KEY'))
|
||||
{
|
||||
$tSpells = DB::Aowow()->select('SELECT id AS ARRAY_KEY, effect1Id, effect2Id, effect3Id, effect1TriggerSpell, effect2TriggerSpell, effect3TriggerSpell FROM dbc_spell WHERE id IN (?a)', array_keys($tNpcs));
|
||||
$buff = [];
|
||||
@@ -1070,20 +1064,13 @@ SqlGen::register(new class extends SetupScript
|
||||
continue;
|
||||
|
||||
$effects = $tSpells[$spellId];
|
||||
$trainerId = $npc['entry'] > 200000 || $npc['qty'] > 1 ? 0 : $npc['entry'];
|
||||
$trainerId = $npc['qty'] > 1 ? 0 : $npc['entry'];
|
||||
|
||||
$triggered = false;
|
||||
for ($i = 1; $i <= 3; $i++)
|
||||
{
|
||||
if ($effects['effect'.$i.'Id'] != 36) // effect: learnSpell
|
||||
continue;
|
||||
if ($effects['effect'.$i.'Id'] == 36) // effect: learnSpell
|
||||
$this->pushBuffer($buff, TYPE_SPELL, $effects['effect'.$i.'TriggerSpell'], $trainerId ? TYPE_NPC : 0, $trainerId);
|
||||
|
||||
$triggered = true;
|
||||
$this->pushBuffer($buff, TYPE_SPELL, $effects['effect'.$i.'TriggerSpell'], $trainerId ? TYPE_NPC : 0, $trainerId);
|
||||
}
|
||||
|
||||
if (!$triggered)
|
||||
$this->pushBuffer($buff, TYPE_SPELL, $spellId, $trainerId ? TYPE_NPC : 0, $trainerId);
|
||||
$this->pushBuffer($buff, TYPE_SPELL, $spellId, $trainerId ? TYPE_NPC : 0, $trainerId);
|
||||
}
|
||||
|
||||
DB::Aowow()->query($this->queryfy($buff, $insMore), 6, 6, 6);
|
||||
|
||||
@@ -12,7 +12,7 @@ SqlGen::register(new class extends SetupScript
|
||||
protected $command = 'spell';
|
||||
|
||||
protected $tblDependancyAowow = ['icons'];
|
||||
protected $tblDependancyTC = ['item_template', 'creature_template', 'creature_template_addon', 'smart_scripts', 'npc_trainer', 'disables', 'spell_ranks', 'spell_dbc', 'skill_discovery_template'];
|
||||
protected $tblDependancyTC = ['item_template', 'creature_template', 'creature_template_addon', 'smart_scripts', 'trainer_spell', 'disables', 'spell_ranks', 'spell_dbc', 'skill_discovery_template'];
|
||||
protected $dbcSourceFiles = ['spell', 'spellradius', 'spellduration', 'spellrunecost', 'spellcasttimes', 'skillline', 'skilllineability', 'skillraceclassinfo', 'talent', 'talenttab', 'glyphproperties', 'spellicon'];
|
||||
|
||||
public function generate(array $ids = []) : bool
|
||||
@@ -346,7 +346,7 @@ SqlGen::register(new class extends SetupScript
|
||||
}
|
||||
|
||||
// fill learnedAt, trainingCost from trainer
|
||||
if ($trainer = DB::World()->select('SELECT SpellID AS ARRAY_KEY, MIN(ReqSkillRank) AS reqSkill, MIN(MoneyCost) AS cost, COUNT(*) AS count FROM npc_trainer GROUP BY SpellID'))
|
||||
if ($trainer = DB::World()->select('SELECT SpellID AS ARRAY_KEY, MIN(ReqSkillRank) AS reqSkill, MIN(MoneyCost) AS cost, ReqAbility1 AS reqSpellId, COUNT(*) AS count FROM trainer_spell GROUP BY SpellID'))
|
||||
{
|
||||
$spells = DB::Aowow()->select('SELECT id AS ARRAY_KEY, effect1Id, effect2Id, effect3Id, effect1TriggerSpell, effect2TriggerSpell, effect3TriggerSpell FROM dbc_spell WHERE id IN (?a)', array_keys($trainer));
|
||||
$links = [];
|
||||
@@ -370,7 +370,7 @@ SqlGen::register(new class extends SetupScript
|
||||
$l = &$links[$effects['effect'.$i.'TriggerSpell']];
|
||||
|
||||
if (!isset($l))
|
||||
$l = [$tData['reqSkill'], $tData['cost']];
|
||||
$l = [$tData['reqSkill'], $tData['cost'], $tData['reqSpellId']];
|
||||
|
||||
if ($tData['reqSkill'] < $l[0])
|
||||
$l[0] = $tData['reqSkill'];
|
||||
@@ -384,7 +384,7 @@ SqlGen::register(new class extends SetupScript
|
||||
$l = &$links[$spell];
|
||||
|
||||
if (!isset($l))
|
||||
$l = [$tData['reqSkill'], $tData['cost']];
|
||||
$l = [$tData['reqSkill'], $tData['cost'], $tData['reqSpellId']];
|
||||
|
||||
if ($tData['reqSkill'] < $l[0])
|
||||
$l[0] = $tData['reqSkill'];
|
||||
@@ -483,26 +483,10 @@ SqlGen::register(new class extends SetupScript
|
||||
if (isset($itemInfo[$itemId]))
|
||||
DB::Aowow()->query('UPDATE ?_spell s, ?_icons ic, dbc_spellicon si SET s.iconIdAlt = ?d, s.cuFlags = s.cuFlags | ?d WHERE s.iconIdBak = si.id AND ic.name = LOWER(SUBSTRING_INDEX(si.iconPath, "\\\\", -1)) AND s.id = ?d', -$itemInfo[$itemId]['d'], ((7 - $itemInfo[$itemId]['q']) << 8), $sId);
|
||||
|
||||
// apply specializations [trainerTemplate => reqSpell]
|
||||
$specs = array(
|
||||
201007 => 9788,
|
||||
201008 => 9787,
|
||||
201015 => 20222,
|
||||
201016 => 20219,
|
||||
201030 => 10660,
|
||||
201031 => 10656,
|
||||
201032 => 10658
|
||||
);
|
||||
foreach ($specs as $tt => $req)
|
||||
if ($spells = DB::World()->selectCol('SELECT SpellID FROM npc_trainer WHERE ID = ?d', $tt))
|
||||
DB::Aowow()->query('UPDATE ?_spell SET reqSpellId = ?d WHERE id IN (?a)', $req, $spells);
|
||||
|
||||
$itemReqs = DB::World()->selectCol('SELECT entry AS ARRAY_KEY, requiredSpell FROM item_template WHERE requiredSpell NOT IN (?a)', [0, 34090, 34091]); // not riding
|
||||
foreach ($itemReqs AS $itemId => $req)
|
||||
DB::Aowow()->query('UPDATE ?_spell SET reqSpellId = ?d WHERE skillLine1 IN (?a) AND effect1CreateItemId = ?d', $req, [164, 165, 197, 202], $itemId);
|
||||
|
||||
DB::Aowow()->query('UPDATE ?_spell SET reqSpellId = id WHERE id IN (?a)', [9788, 9787, 20222, 20219, 10660, 10656, 10658, 26797, 26798, 26801, 17039, 17040, 17041]);
|
||||
|
||||
// setting icons
|
||||
DB::Aowow()->query('UPDATE ?_spell s, ?_icons ic, dbc_spellicon si SET s.iconId = ic.id WHERE s.iconIdBak = si.id AND ic.name = LOWER(SUBSTRING_INDEX(si.iconPath, "\\\\", -1))');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user