SpellDetailPage

* attempted cleanup in effect generation and template
 * display summon properties
 * display unit of effect value
 * fix spell effect layout, typos, missing tools, ...
This commit is contained in:
Sarjuuk
2024-08-15 03:49:04 +02:00
parent dab110475c
commit d2e109d818
17 changed files with 767 additions and 671 deletions

View File

@@ -3,7 +3,7 @@
mb_internal_encoding('UTF-8'); mb_internal_encoding('UTF-8');
mysqli_report(MYSQLI_REPORT_ERROR); mysqli_report(MYSQLI_REPORT_ERROR);
define('AOWOW_REVISION', 38); define('AOWOW_REVISION', 39);
define('OS_WIN', substr(PHP_OS, 0, 3) == 'WIN'); // OS_WIN as per compile info of php define('OS_WIN', substr(PHP_OS, 0, 3) == 'WIN'); // OS_WIN as per compile info of php
define('CLI', PHP_SAPI === 'cli'); define('CLI', PHP_SAPI === 'cli');
define('CLI_HAS_E', CLI && // WIN10 and later usually support ANSI escape sequences define('CLI_HAS_E', CLI && // WIN10 and later usually support ANSI escape sequences

View File

@@ -187,8 +187,10 @@ class SpellList extends BaseType
// use if you JUST need the name // use if you JUST need the name
public static function getName($id) public static function getName($id)
{ {
$n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc4, name_loc6, name_loc8 FROM ?_spell WHERE id = ?d', $id ); if ($n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc4, name_loc6, name_loc8 FROM ?_spell WHERE id = ?d', $id))
return Util::localizedString($n, 'name'); return Util::localizedString($n, 'name');
return '';
} }
// end static use // end static use
@@ -484,9 +486,10 @@ class SpellList extends BaseType
return $this->tools; return $this->tools;
} }
public function getModelInfo($spellId = 0, $effIdx = 0) public function getModelInfo(int $spellId = 0, int $effIdx = 0) : array
{ {
$displays = [0 => []]; $displays = $results = [];
foreach ($this->iterate() as $id => $__) foreach ($this->iterate() as $id => $__)
{ {
if ($spellId && $spellId != $id) if ($spellId && $spellId != $id)
@@ -494,6 +497,9 @@ class SpellList extends BaseType
for ($i = 1; $i < 4; $i++) for ($i = 1; $i < 4; $i++)
{ {
if ($spellId && $effIdx && $effIdx != $i)
continue;
$effMV = $this->curTpl['effect'.$i.'MiscValue']; $effMV = $this->curTpl['effect'.$i.'MiscValue'];
if (!$effMV) if (!$effMV)
continue; continue;
@@ -524,16 +530,16 @@ class SpellList extends BaseType
2289 => [2289, 29415, 29418, 29419, 29420, 29421] // Bear - Tauren 2289 => [2289, 29415, 29418, 29419, 29420, 29421] // Bear - Tauren
); );
if ($st = DB::Aowow()->selectRow('SELECT *, displayIdA as model1, displayIdH as model2 FROM ?_shapeshiftforms WHERE id = ?d', $effMV)) if ($st = DB::Aowow()->selectRow('SELECT *, `displayIdA` AS `model1`, `displayIdH` AS `model2` FROM ?_shapeshiftforms WHERE `id` = ?d', $effMV))
{ {
foreach ([1, 2] as $j) foreach ([1, 2] as $j)
if (isset($subForms[$st['model'.$j]])) if (isset($subForms[$st['model'.$j]]))
$st['model'.$j] = $subForms[$st['model'.$j]][array_rand($subForms[$st['model'.$j]])]; $st['model'.$j] = $subForms[$st['model'.$j]][array_rand($subForms[$st['model'.$j]])];
$displays[0][$id][$i] = array( $results[$id][$i] = array(
'typeId' => 0, 'type' => Type::NPC,
'displayId' => $st['model2'] ? $st['model'.rand(1, 2)] : $st['model1'],
'creatureType' => $st['creatureType'], 'creatureType' => $st['creatureType'],
'displayId' => $st['model2'] ? $st['model'.rand(1, 2)] : $st['model1'],
'displayName' => Lang::game('st', $effMV) 'displayName' => Lang::game('st', $effMV)
); );
} }
@@ -541,8 +547,6 @@ class SpellList extends BaseType
} }
} }
$results = $displays[0];
if (!empty($displays[Type::NPC])) if (!empty($displays[Type::NPC]))
{ {
$nModels = new CreatureList(array(['id', array_column($displays[Type::NPC], 1)])); $nModels = new CreatureList(array(['id', array_column($displays[Type::NPC], 1)]));
@@ -555,6 +559,7 @@ class SpellList extends BaseType
foreach ($indizes as $idx) foreach ($indizes as $idx)
{ {
$res = array( $res = array(
'type' => Type::NPC,
'typeId' => $nId, 'typeId' => $nId,
'displayId' => $nModels->getRandomModelId(), 'displayId' => $nModels->getRandomModelId(),
'displayName' => $nModels->getField('name', true) 'displayName' => $nModels->getField('name', true)
@@ -582,6 +587,7 @@ class SpellList extends BaseType
foreach ($indizes as $idx) foreach ($indizes as $idx)
{ {
$results[$srcId][$idx] = array( $results[$srcId][$idx] = array(
'type' => Type::OBJECT,
'typeId' => $oId, 'typeId' => $oId,
'displayId' => $oModels->getField('displayId'), 'displayId' => $oModels->getField('displayId'),
'displayName' => $oModels->getField('name', true) 'displayName' => $oModels->getField('name', true)
@@ -593,12 +599,15 @@ class SpellList extends BaseType
} }
if ($spellId && $effIdx) if ($spellId && $effIdx)
return !empty($results[$spellId][$effIdx]) ? $results[$spellId][$effIdx] : 0; return $results[$spellId][$effIdx] ?? [];
if ($spellId)
return $results[$spellId] ?? [];
return $results; return $results;
} }
private function createRangesForCurrent() private function createRangesForCurrent() : string
{ {
if (!$this->curTpl['rangeMaxHostile']) if (!$this->curTpl['rangeMaxHostile'])
return ''; return '';
@@ -620,7 +629,7 @@ class SpellList extends BaseType
return sprintf(Lang::spell('range'), $this->curTpl['rangeMaxHostile']); return sprintf(Lang::spell('range'), $this->curTpl['rangeMaxHostile']);
} }
public function createPowerCostForCurrent() public function createPowerCostForCurrent() : string
{ {
$str = ''; $str = '';
@@ -664,7 +673,7 @@ class SpellList extends BaseType
return $str; return $str;
} }
public function createCastTimeForCurrent($short = true, $noInstant = true) public function createCastTimeForCurrent(bool $short = true, bool $noInstant = true) : string
{ {
if (!$this->curTpl['castTime'] && $this->isChanneledSpell()) if (!$this->curTpl['castTime'] && $this->isChanneledSpell())
return Lang::spell('channeled'); return Lang::spell('channeled');
@@ -678,7 +687,7 @@ class SpellList extends BaseType
return $short ? Lang::formatTime($this->curTpl['castTime'] * 1000, 'spell', 'castTime') : Util::formatTime($this->curTpl['castTime'] * 1000); return $short ? Lang::formatTime($this->curTpl['castTime'] * 1000, 'spell', 'castTime') : Util::formatTime($this->curTpl['castTime'] * 1000);
} }
private function createCooldownForCurrent() private function createCooldownForCurrent() : string
{ {
if ($this->curTpl['recoveryTime']) if ($this->curTpl['recoveryTime'])
return Lang::formatTime($this->curTpl['recoveryTime'], 'spell', 'cooldown'); return Lang::formatTime($this->curTpl['recoveryTime'], 'spell', 'cooldown');
@@ -689,16 +698,15 @@ class SpellList extends BaseType
} }
// formulae base from TC // formulae base from TC
private function calculateAmountForCurrent(int $effIdx, ?SpellList $altTpl = null, int $nTicks = 1) : array private function calculateAmountForCurrent(int $effIdx, int $nTicks = 1) : array
{ {
$ref = $altTpl ?: $this;
$level = $this->charLevel; $level = $this->charLevel;
$maxBase = 0; $maxBase = 0;
$rppl = $ref->getField('effect'.$effIdx.'RealPointsPerLevel'); $rppl = $this->getField('effect'.$effIdx.'RealPointsPerLevel');
$base = $ref->getField('effect'.$effIdx.'BasePoints'); $base = $this->getField('effect'.$effIdx.'BasePoints');
$add = $ref->getField('effect'.$effIdx.'DieSides'); $add = $this->getField('effect'.$effIdx.'DieSides');
$maxLvl = $ref->getField('maxLevel'); $maxLvl = $this->getField('maxLevel');
$baseLvl = $ref->getField('baseLevel'); $baseLvl = $this->getField('baseLevel');
if ($rppl) if ($rppl)
{ {
@@ -707,8 +715,8 @@ class SpellList extends BaseType
else if ($level < $baseLvl) else if ($level < $baseLvl)
$level = $baseLvl; $level = $baseLvl;
if (!$ref->getField('atributes0') & SPELL_ATTR0_PASSIVE) if (!$this->getField('atributes0') & SPELL_ATTR0_PASSIVE)
$level -= $ref->getField('spellLevel'); $level -= $this->getField('spellLevel');
$maxBase += (int)(($level - $baseLvl) * $rppl); $maxBase += (int)(($level - $baseLvl) * $rppl);
$maxBase *= $nTicks; $maxBase *= $nTicks;
@@ -1060,7 +1068,7 @@ class SpellList extends BaseType
break; break;
case 'm': // BasePoints (minValue) case 'm': // BasePoints (minValue)
case 'M': // BasePoints (maxValue) case 'M': // BasePoints (maxValue)
[$min, $max, $modStrMin, $modStrMax] = $this->calculateAmountForCurrent($effIdx, $srcSpell); [$min, $max, $modStrMin, $modStrMax] = $srcSpell->calculateAmountForCurrent($effIdx);
$mv = $srcSpell->getField('effect'.$effIdx.'MiscValue'); $mv = $srcSpell->getField('effect'.$effIdx.'MiscValue');
$aura = $srcSpell->getField('effect'.$effIdx.'AuraId'); $aura = $srcSpell->getField('effect'.$effIdx.'AuraId');
@@ -1116,7 +1124,7 @@ class SpellList extends BaseType
$periode = 3000; $periode = 3000;
} }
[$min, $max, $modStrMin, $modStrMax] = $this->calculateAmountForCurrent($effIdx, $srcSpell, intVal($duration / $periode)); [$min, $max, $modStrMin, $modStrMax] = $srcSpell->calculateAmountForCurrent($effIdx, intVal($duration / $periode));
if (in_array($op, $signs) && is_numeric($oparg)) if (in_array($op, $signs) && is_numeric($oparg))
{ {
@@ -1155,7 +1163,7 @@ class SpellList extends BaseType
break; break;
case 's': // BasePoints (with variance) case 's': // BasePoints (with variance)
case 'S': case 'S':
[$min, $max, $modStrMin, $modStrMax] = $this->calculateAmountForCurrent($effIdx, $srcSpell); [$min, $max, $modStrMin, $modStrMax] = $srcSpell->calculateAmountForCurrent($effIdx);
$mv = $srcSpell->getField('effect'.$effIdx.'MiscValue'); $mv = $srcSpell->getField('effect'.$effIdx.'MiscValue');
$aura = $srcSpell->getField('effect'.$effIdx.'AuraId'); $aura = $srcSpell->getField('effect'.$effIdx.'AuraId');

View File

@@ -399,12 +399,17 @@ class Lang
return implode(', ', $tmp); return implode(', ', $tmp);
} }
public static function getMagicSchools(int $schoolMask) : string public static function getMagicSchools(int $schoolMask, bool $short = false) : string
{ {
$schoolMask &= SPELL_ALL_SCHOOLS; // clamp to available schools.. $schoolMask &= SPELL_ALL_SCHOOLS; // clamp to available schools..
$tmp = []; $tmp = [];
$i = 0; $i = 0;
if ($short && $schoolMask == SPELL_ALL_SCHOOLS)
return self::main('all');
if ($short && $schoolMask == SPELL_MAGIC_SCHOOLS)
return self::main('all').' ('.self::game('dt', 1).')';
while ($schoolMask) while ($schoolMask)
{ {
if ($schoolMask & (1 << $i)) if ($schoolMask & (1 << $i))

View File

@@ -57,6 +57,8 @@ $lang = array(
'status' => "Status", 'status' => "Status",
'yes' => "Ja", 'yes' => "Ja",
'no' => "Nein", 'no' => "Nein",
'any' => "Beliebig",
'all' => "Alle",
// filter // filter
'extSearch' => "Erweiterte Suche", 'extSearch' => "Erweiterte Suche",
@@ -1577,7 +1579,7 @@ $lang = array(
), ),
'spellModOp' => array( 'spellModOp' => array(
"Schaden", "Dauer", "Bedrohung", "Effekt 1", "Aufladungen", "Schaden", "Dauer", "Bedrohung", "Effekt 1", "Aufladungen",
"Reichweite", "Radius", "kritische Trefferchance", "Alle Effekte", "Zauberzeitverlust", "Reichweite", "Radius", "Kritische Trefferchance", "Alle Effekte", "Zauberzeitverlust",
"Zauberzeit", "Abklingzeit", "Effekt 2", "Ignoriere Rüstung", "Kosten", "Zauberzeit", "Abklingzeit", "Effekt 2", "Ignoriere Rüstung", "Kosten",
"Kritischer Bonusschaden", "Trefferchance", "Sprung-Ziele", "Chance auf Auslösung", "Intervall", "Kritischer Bonusschaden", "Trefferchance", "Sprung-Ziele", "Chance auf Auslösung", "Intervall",
"Multiplikator (Schaden)", "Globale Abklingzeit", "Schaden über Zeit", "Effekt 3", "Multiplikator (Bonus)", "Multiplikator (Schaden)", "Globale Abklingzeit", "Schaden über Zeit", "Effekt 3", "Multiplikator (Bonus)",
@@ -1591,6 +1593,9 @@ $lang = array(
"erhaltene kritische Fernkampftreffer", "erhaltene kritische Zaubertreffer", "Nahkampftempo", "Fernkampftempo", "Zaubertempo", "erhaltene kritische Fernkampftreffer", "erhaltene kritische Zaubertreffer", "Nahkampftempo", "Fernkampftempo", "Zaubertempo",
"Waffenfertigkeit Haupthand", "Waffenfertigkeit Nebenhand", "Waffenfertigkeit Fernkampf", "Waffenkunde", "Rüstungsdurchschlag" "Waffenfertigkeit Haupthand", "Waffenfertigkeit Nebenhand", "Waffenfertigkeit Fernkampf", "Waffenkunde", "Rüstungsdurchschlag"
), ),
'combatRatingMask' => array(
0xE0 => "Trefferchance", 0x700 => "Kritische Trefferchance", 0x1C000 => "Abhärtung"
),
'lockType' => array( 'lockType' => array(
null, "Schlossknacken", "Kräuterkunde", "Bergbau", "Falle entschärfen", null, "Schlossknacken", "Kräuterkunde", "Bergbau", "Falle entschärfen",
"Öffnen", "Schatz (DND)", "Verkalkte Elfenedelsteine (DND)", "Schließen", "Falle scharf machen", "Öffnen", "Schatz (DND)", "Verkalkte Elfenedelsteine (DND)", "Schließen", "Falle scharf machen",
@@ -1659,6 +1664,8 @@ $lang = array(
89 => "Verwendbar, während Ihr verängstigt seid", 89 => "Verwendbar, während Ihr verängstigt seid",
65 => "Braucht alle Ressourcen auf" 65 => "Braucht alle Ressourcen auf"
), ),
'summonControl' => ["Ungesteuert", "Wächter", "Begleiter", "Bezaubert", "Gesteuertes Fahrzeug", "Ungesteuertes Fahrzeug"],
'summonSlot' => ["Begleiter", "Feuertotem", "Erdtotem", "Wassertotem", "Lufttotem", "Haustier", "Quest"],
'unkEffect' => 'Unknown Effect (%1$d)', 'unkEffect' => 'Unknown Effect (%1$d)',
'effects' => array( 'effects' => array(
/*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units', /*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units',
@@ -1683,11 +1690,11 @@ $lang = array(
/*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet', /*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet',
/*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %', /*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %',
/*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound', /*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound',
/*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power', /*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit 2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power',
/*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner', /*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner',
/*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest', /*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest',
/*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons', /*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons',
/*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', null, 'Change Talent Spec. Count', /*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', 'Force Cast 2', 'Change Talent Spec. Count',
/*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase' /*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase'
), ),
'unkAura' => 'Unknown Aura (%1$d)', 'unkAura' => 'Unknown Aura (%1$d)',

View File

@@ -58,6 +58,8 @@ $lang = array(
'status' => "Status", 'status' => "Status",
'yes' => "Yes", 'yes' => "Yes",
'no' => "No", 'no' => "No",
'any' => "Any",
'all' => "All",
// filter // filter
'extSearch' => "Extended search", 'extSearch' => "Extended search",
@@ -1592,6 +1594,9 @@ $lang = array(
"Taken Critical Ranged Hit Chance", "Taken Critical Spell Hit Chance", "Melee Haste", "Ranged Haste", "Spell Haste", "Taken Critical Ranged Hit Chance", "Taken Critical Spell Hit Chance", "Melee Haste", "Ranged Haste", "Spell Haste",
"Mainhand Weapon Skill", "Offhand Weapon Skill", "Ranged Weapon Skill", "Expertise", "Armor Penetration" "Mainhand Weapon Skill", "Offhand Weapon Skill", "Ranged Weapon Skill", "Expertise", "Armor Penetration"
), ),
'combatRatingMask' => array(
0xE0 => "Hit Chance", 0x700 => "Critical Hit Chance", 0x1C000 => "Resilience"
),
'lockType' => array( // lockType.dbc 'lockType' => array( // lockType.dbc
null, "Lockpicking", "Herbalism", "Mining", "Disarm Trap", null, "Lockpicking", "Herbalism", "Mining", "Disarm Trap",
"Open", "Treasure (DND)", "Calcified Elven Gems (DND)", "Close", "Arm Trap", "Open", "Treasure (DND)", "Calcified Elven Gems (DND)", "Close", "Arm Trap",
@@ -1660,6 +1665,8 @@ $lang = array(
89 => "Usable while feared", 89 => "Usable while feared",
65 => "Uses all power" 65 => "Uses all power"
), ),
'summonControl' => ["Uncontrolled", "Guardian", "Pet", "Possessed", "Possessed Vehicle", "Uncontrolled Vehicle"],
'summonSlot' => ["Pet", "Fire Totem", "Earth Totem", "Water Totem", "Air Totem", "Non-combat Pet", "Quest"],
'unkEffect' => 'Unknown Effect (%1$d)', 'unkEffect' => 'Unknown Effect (%1$d)',
'effects' => array( 'effects' => array(
/*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units', /*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units',
@@ -1684,11 +1691,11 @@ $lang = array(
/*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet', /*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet',
/*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %', /*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %',
/*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound', /*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound',
/*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power', /*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit 2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power',
/*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner', /*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner',
/*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest', /*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest',
/*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons', /*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons',
/*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', null, 'Change Talent Spec. Count', /*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', 'Force Cast 2', 'Change Talent Spec. Count',
/*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase' /*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase'
), ),
'unkAura' => 'Unknown Aura (%1$d)', 'unkAura' => 'Unknown Aura (%1$d)',

View File

@@ -57,6 +57,8 @@ $lang = array(
'status' => "Estado", 'status' => "Estado",
'yes' => "", 'yes' => "",
'no' => "No", 'no' => "No",
'any' => "Cualquiera",
'all' => "Todo",
// filter // filter
'extSearch' => "Extender búsqueda", 'extSearch' => "Extender búsqueda",
@@ -1591,6 +1593,9 @@ $lang = array(
"CRIT_TAKEN_RANGED", "CRIT_TAKEN_SPELL", "HASTE_MELEE", "HASTE_RANGED", "HASTE_SPELL", "CRIT_TAKEN_RANGED", "CRIT_TAKEN_SPELL", "HASTE_MELEE", "HASTE_RANGED", "HASTE_SPELL",
"WEAPON_SKILL_MAINHAND", "WEAPON_SKILL_OFFHAND", "WEAPON_SKILL_RANGED", "EXPERTISE", "ARMOR_PENETRATION" "WEAPON_SKILL_MAINHAND", "WEAPON_SKILL_OFFHAND", "WEAPON_SKILL_RANGED", "EXPERTISE", "ARMOR_PENETRATION"
), ),
'combatRatingMask' => array(
0xE0 => "[Hit Chance]", 0x700 => "[Critical Hit Chance]", 0x1C000 => "Temple"
),
'lockType' => array( 'lockType' => array(
null, "Forzar cerradura", "Herboristería", "Minería", "Desactivar trampa", null, "Forzar cerradura", "Herboristería", "Minería", "Desactivar trampa",
"Abrir", "Tesoro (DND)", "Gemas cálcicas elfas (DND)", "Cerrar", "Activar trampa", "Abrir", "Tesoro (DND)", "Gemas cálcicas elfas (DND)", "Cerrar", "Activar trampa",
@@ -1659,6 +1664,8 @@ $lang = array(
89 => "Utilizable mientras se esta aterrorizado", 89 => "Utilizable mientras se esta aterrorizado",
65 => "Utiliza todo el poder" 65 => "Utiliza todo el poder"
), ),
'summonControl' => ["[Uncontrolled]", "Guardián", "Mascota", "Embelesado", "[Possessed Vehicle]", "[Uncontrolled Vehicle]"],
'summonSlot' => ["Mascota", "Tótem de Fuego", "Tótem de Tierra", "Tótem de Agua", "Tótem de Aire", "Mascota mansa", "Misión"],
'unkEffect' => 'Unknown Effect (%1$d)', 'unkEffect' => 'Unknown Effect (%1$d)',
'effects' => array( 'effects' => array(
/*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units', /*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units',
@@ -1683,11 +1690,11 @@ $lang = array(
/*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet', /*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet',
/*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %', /*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %',
/*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound', /*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound',
/*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power', /*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit 2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power',
/*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner', /*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner',
/*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest', /*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest',
/*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons', /*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons',
/*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', null, 'Change Talent Spec. Count', /*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', 'Force Cast 2', 'Change Talent Spec. Count',
/*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase' /*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase'
), ),
'unkAura' => 'Unknown Aura (%1$d)', 'unkAura' => 'Unknown Aura (%1$d)',

View File

@@ -57,6 +57,8 @@ $lang = array(
'status' => "Statut", 'status' => "Statut",
'yes' => "Oui", 'yes' => "Oui",
'no' => "Non", 'no' => "Non",
'any' => "N'importe quelle",
'all' => "Tous",
// filter // filter
'extSearch' => "Recherche avancée", 'extSearch' => "Recherche avancée",
@@ -1591,6 +1593,9 @@ $lang = array(
"CRIT_TAKEN_RANGED", "CRIT_TAKEN_SPELL", "HASTE_MELEE", "HASTE_RANGED", "HASTE_SPELL", "CRIT_TAKEN_RANGED", "CRIT_TAKEN_SPELL", "HASTE_MELEE", "HASTE_RANGED", "HASTE_SPELL",
"WEAPON_SKILL_MAINHAND", "WEAPON_SKILL_OFFHAND", "WEAPON_SKILL_RANGED", "EXPERTISE", "ARMOR_PENETRATION" "WEAPON_SKILL_MAINHAND", "WEAPON_SKILL_OFFHAND", "WEAPON_SKILL_RANGED", "EXPERTISE", "ARMOR_PENETRATION"
), ),
'combatRatingMask' => array(
0xE0 => "[Hit Chance]", 0x700 => "[Critical Hit Chance]", 0x1C000 => "Résilience JcJ"
),
'lockType' => array( 'lockType' => array(
null, "Crochetage", "Herboristerie", "Minage", "Désarmement de piège", null, "Crochetage", "Herboristerie", "Minage", "Désarmement de piège",
"Ouverture", "Trésor (DND)", "Gemmes elfiques calcifiées (DND)", "Fermeture", "Pose de piège", "Ouverture", "Trésor (DND)", "Gemmes elfiques calcifiées (DND)", "Fermeture", "Pose de piège",
@@ -1659,6 +1664,8 @@ $lang = array(
89 => "Utilisable sous l'effet de peur", 89 => "Utilisable sous l'effet de peur",
65 => "Utilise toute la puissance" 65 => "Utilise toute la puissance"
), ),
'summonControl' => ["[Uncontrolled]", "Gardiens", "Familier", "Charmé", "[Possessed Vehicle]", "[Uncontrolled Vehicle]"],
'summonSlot' => ["Familier", "Totem de Feu", "Totem de Terre", "Totem d'Eau", "Totem d'Air", "Familier pacifique", "Quête"],
'unkEffect' => 'Unknown Effect (%1$d)', 'unkEffect' => 'Unknown Effect (%1$d)',
'effects' => array( 'effects' => array(
/*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units', /*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units',
@@ -1683,11 +1690,11 @@ $lang = array(
/*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet', /*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet',
/*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %', /*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %',
/*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound', /*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound',
/*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power', /*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit 2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power',
/*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner', /*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner',
/*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest', /*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest',
/*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons', /*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons',
/*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', null, 'Change Talent Spec. Count', /*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', 'Force Cast 2', 'Change Talent Spec. Count',
/*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase' /*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase'
), ),
'unkAura' => 'Unknown Aura (%1$d)', 'unkAura' => 'Unknown Aura (%1$d)',

View File

@@ -57,6 +57,8 @@ $lang = array(
'status' => "Статус", 'status' => "Статус",
'yes' => "Да", 'yes' => "Да",
'no' => "Нет", 'no' => "Нет",
'any' => "Любой", // Any[one] of X => "Любой из"
'all' => "Все",
// filter // filter
'extSearch' => "Расширенный поиск", 'extSearch' => "Расширенный поиск",
@@ -1591,6 +1593,9 @@ $lang = array(
"CRIT_TAKEN_RANGED", "CRIT_TAKEN_SPELL", "HASTE_MELEE", "HASTE_RANGED", "HASTE_SPELL", "CRIT_TAKEN_RANGED", "CRIT_TAKEN_SPELL", "HASTE_MELEE", "HASTE_RANGED", "HASTE_SPELL",
"WEAPON_SKILL_MAINHAND", "WEAPON_SKILL_OFFHAND", "WEAPON_SKILL_RANGED", "EXPERTISE", "ARMOR_PENETRATION" "WEAPON_SKILL_MAINHAND", "WEAPON_SKILL_OFFHAND", "WEAPON_SKILL_RANGED", "EXPERTISE", "ARMOR_PENETRATION"
), ),
'combatRatingMask' => array(
0xE0 => "[Hit Chance]", 0x700 => "[Critical Hit Chance]", 0x1C000 => "Устойчивость"
),
'lockType' => array( 'lockType' => array(
null, "Взлом замков", "Травничество", "Горное дело", "Обезвреживание ловушки", null, "Взлом замков", "Травничество", "Горное дело", "Обезвреживание ловушки",
"Открытие", "Клад (DND)", "Эльфийские самоцветы (DND)", "Закрытие", "Установка", "Открытие", "Клад (DND)", "Эльфийские самоцветы (DND)", "Закрытие", "Установка",
@@ -1659,6 +1664,8 @@ $lang = array(
89 => "usablefearedМожет быть использовано, пока наложен Страх", 89 => "usablefearedМожет быть использовано, пока наложен Страх",
65 => "Использует ресурс полностью" 65 => "Использует ресурс полностью"
), ),
'summonControl' => ['[Uncontrolled]', "Стражи", "Питомец", "Подчинённый", '[Possessed Vehicle]', '[Uncontrolled Vehicle]'],
'summonSlot' => ["Питомец", "Тотем огня", "Тотем земли", "Тотем воды", "Тотем воздуха", "Спутник", "Задание"],
'unkEffect' => 'Unknown Effect (%1$d)', 'unkEffect' => 'Unknown Effect (%1$d)',
'effects' => array( 'effects' => array(
/*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units', /*0-5 */ 'None', 'Instakill', 'School Damage', 'Dummy', 'Portal Teleport', 'Teleport Units',
@@ -1683,11 +1690,11 @@ $lang = array(
/*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet', /*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet',
/*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %', /*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %',
/*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound', /*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound',
/*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power', /*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit 2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power',
/*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner', /*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner',
/*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest', /*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest',
/*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons', /*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons',
/*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', null, 'Change Talent Spec. Count', /*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', 'Force Cast 2', 'Change Talent Spec. Count',
/*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase' /*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase'
), ),
'unkAura' => 'Unknown Aura (%1$d)', 'unkAura' => 'Unknown Aura (%1$d)',

View File

@@ -58,6 +58,8 @@ $lang = array(
'status' => "状态", 'status' => "状态",
'yes' => "", 'yes' => "",
'no' => "", 'no' => "",
'any' => "任意",
'all' => "全部",
// filter // filter
'extSearch' => "扩展搜索", 'extSearch' => "扩展搜索",
@@ -1591,6 +1593,9 @@ $lang = array(
"受到远程暴击几率", "受到法术暴击几率", "急速(近战)", "急速(远程)", "急速(法术)", "受到远程暴击几率", "受到法术暴击几率", "急速(近战)", "急速(远程)", "急速(法术)",
"主手武器技能", "副手武器技能", "远程武器技能", "精准", "护甲穿透" "主手武器技能", "副手武器技能", "远程武器技能", "精准", "护甲穿透"
), ),
'combatRatingMask' => array(
0xE0 => "[Hit Chance]", 0x700 => "[Critical Hit Chance]", 0x1C000 => "韧性"
),
'lockType' => array( 'lockType' => array(
null, "锁上的物品", "药草", "矿点", "陷阱", null, "锁上的物品", "药草", "矿点", "陷阱",
"未锁上的物品", "宝物", "钙化精灵宝石", "未锁上的物品", "陷阱", "未锁上的物品", "宝物", "钙化精灵宝石", "未锁上的物品", "陷阱",
@@ -1659,6 +1664,8 @@ $lang = array(
89 => "恐惧时可用", 89 => "恐惧时可用",
65 => "消耗所有力量" 65 => "消耗所有力量"
), ),
'summonControl' => ['[Uncontrolled]', "守护者", "宠物", "被魅惑", '[Possessed Vehicle]', '[Uncontrolled Vehicle]'],
'summonSlot' => ["宠物", "火焰图腾", "大地图腾", "水图腾", "空气图腾", "非战斗宠物", "任务"],
'unkEffect' => '未知效果 (%1$d)', 'unkEffect' => '未知效果 (%1$d)',
'effects' => array( 'effects' => array(
/*0-5 */ '无', '杀死', '类型伤害', 'Dummy', '传送门', '传送单位', /*0-5 */ '无', '杀死', '类型伤害', 'Dummy', '传送门', '传送单位',
@@ -1683,11 +1690,11 @@ $lang = array(
/*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet', /*114+ */ 'Taunt', 'Durability Damage - %', 'Skin Player Corpse (PvP)', 'AoE Resurrect with % Health','Learn Skill', 'Apply Area Aura - Pet',
/*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %', /*120+ */ 'Teleport to Graveyard', 'Normalized Weapon Damage', null, 'Take Flight Path', 'Pull Towards', 'Modify Threat - %',
/*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound', /*126+ */ 'Spell Steal ', 'Prospect', 'Apply Area Aura - Friend', 'Apply Area Aura - Enemy', 'Redirect Done Threat %', 'Play Sound',
/*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power', /*132+ */ 'Play Music', 'Unlearn Specialization', 'Kill Credit 2', 'Call Pet', 'Heal for % of Total Health','Give % of Total Power',
/*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner', /*138+ */ 'Leap Back', 'Abandon Quest', 'Force Cast', 'Force Spell Cast with Value','Trigger Spell with Value','Apply Area Aura - Pet Owner',
/*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest', /*144+ */ 'Knockback to Dest.', 'Pull Towards Dest.', 'Activate Rune', 'Fail Quest', null, 'Charge to Dest',
/*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons', /*150+ */ 'Start Quest', 'Trigger Spell 2', 'Summon - Refer-A-Friend', 'Create Tamed Pet', 'Discover Flight Path', 'Dual Wield 2H Weapons',
/*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', null, 'Change Talent Spec. Count', /*156+ */ 'Add Socket to Item', 'Create Tradeskill Item', 'Milling', 'Rename Pet', 'Force Cast 2', 'Change Talent Spec. Count',
/*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase' /*162-167*/ 'Activate Talent Spec.', null, 'Remove Aura', null, null, 'Update Player Phase'
), ),
'unkAura' => '未知光环 (%1$d)', 'unkAura' => '未知光环 (%1$d)',

View File

@@ -861,8 +861,44 @@ class GenericPage
return $buff; return $buff;
} }
protected function fmtCreateIcon(int $iconIdx, int $type, int $typeId, int $pad = 0, string $element = 'icontab-icon', int $size = 1, int $num = 0, int $qty = 0) : string
{
// $element, $iconTabIdx, [typeId, size, num, qty]
$createIconString = "\$WH.ge('%s%d').appendChild(%s.createIcon(%s));\n";
if ($size < 0 || $size > 3)
{
trigger_error('GenericPage::fmtCreateIcon - invalid icon size '.$size.'. Normalied to 1 [small]', E_USER_WARNING);
$size = 1;
}
$jsg = Type::getJSGlobalString($type);
if (!$jsg)
{
trigger_error('GenericPage::fmtCreateIcon - invalid type '.$type.'. Assumed '.Type::SPELL.' [spell]', E_USER_WARNING);
$jsg = Type::getJSGlobalString(Type::SPELL);
}
$params = [$typeId, $size];
if ($num || $qty)
$params[] = is_numeric($num) ? $num : "'".$num."'";
if ($qty)
$params[] = is_numeric($qty) ? $qty : "'".$qty."'";
// $WH.ge('icontab-icon1').appendChild(g_spells.createIcon(40120, 1, '1-4', 0));
return str_repeat(' ', $pad) . sprintf($createIconString, $element, $iconIdx, $jsg, implode(', ', $params));
}
protected function fmtStaffTip(string $text, string $tip) : string
{
if (User::isInGroup(U_GROUP_EMPLOYEE))
return sprintf(Util::$dfnString, $tip, $text);
else
return $text;
}
// load brick // load brick
public function brick(string $file, array $localVars = []) : void protected function brick(string $file, array $localVars = []) : void
{ {
foreach ($localVars as $n => $v) foreach ($localVars as $n => $v)
$$n = $v; $$n = $v;
@@ -874,7 +910,7 @@ class GenericPage
} }
// load listview addIns // load listview addIns
public function lvBrick(string $file) : void protected function lvBrick(string $file) : void
{ {
if (!$this->isSaneInclude('template/listviews/', $file)) if (!$this->isSaneInclude('template/listviews/', $file))
trigger_error('Nonexistant Listview addin requested: template/listviews/'.$file.'.tpl.php', E_USER_ERROR); trigger_error('Nonexistant Listview addin requested: template/listviews/'.$file.'.tpl.php', E_USER_ERROR);
@@ -883,7 +919,7 @@ class GenericPage
} }
// load brick with more text then vars // load brick with more text then vars
public function localizedBrick(string $file, int $loc = LOCALE_EN) : void protected function localizedBrick(string $file, int $loc = LOCALE_EN) : void
{ {
if (!$this->isSaneInclude('template/localized/', $file.'_'.$loc)) if (!$this->isSaneInclude('template/localized/', $file.'_'.$loc))
{ {

File diff suppressed because it is too large Load Diff

View File

@@ -3321,7 +3321,7 @@ UNLOCK TABLES;
LOCK TABLES `aowow_dbversion` WRITE; LOCK TABLES `aowow_dbversion` WRITE;
/*!40000 ALTER TABLE `aowow_dbversion` DISABLE KEYS */; /*!40000 ALTER TABLE `aowow_dbversion` DISABLE KEYS */;
INSERT INTO `aowow_dbversion` VALUES (1720969086,0,NULL,NULL); INSERT INTO `aowow_dbversion` VALUES (1724095917,0,NULL,NULL);
/*!40000 ALTER TABLE `aowow_dbversion` ENABLE KEYS */; /*!40000 ALTER TABLE `aowow_dbversion` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;

View File

@@ -155,7 +155,7 @@ CLISetup::registerUtility(new class extends UtilityScript
if ($this->startStep) if ($this->startStep)
{ {
CLI::write(); CLI::write();
CLI::write(' You are currently on step '.($this->startStep + 1).' / '.count($this->steps).' ('.($this->steps[$this->startStep][1] ?: $this->steps[$this->startStep][0][1]).'). You can resume or restart the setup process.', -1, false); CLI::write(' You are currently on step '.($this->startStep + 1).' / '.count($this->steps).' ('.($this->steps[$this->startStep][1] ?: $this->steps[$this->startStep][0]).'). You can resume or restart the setup process.', -1, false);
} }
CLI::write(); CLI::write();

View File

@@ -1345,6 +1345,14 @@ UNUSED19 = x
UNUSED20 = x UNUSED20 = x
UNUSED21 = x UNUSED21 = x
[summonproperties]
id = n
control = u
faction = x
title = x
slot = u
flags = x
[talent] [talent]
id = n id = n
tabId = i tabId = i

View File

@@ -0,0 +1,18 @@
<?php
if (!defined('AOWOW_REVISION'))
die('illegal access');
if (!CLI)
die('not in cli mode');
CLISetup::registerSetup("sql", new class extends SetupScript
{
use TrDBCcopy;
protected $command = 'summonproperties';
protected $dbcSourceFiles = ['summonproperties'];
});
?>

View File

@@ -0,0 +1 @@
UPDATE `aowow_dbversion` SET `sql` = CONCAT(IFNULL(`sql`, ''), ' summonproperties');

View File

@@ -21,41 +21,41 @@
<?php <?php
$this->brick('tooltip'); $this->brick('tooltip');
if ($this->tools):
echo " <div style=\"float: left; margin-right: 75px\">\n";
endif;
if ($this->reagents[1]): if ($this->reagents[1]):
if ($this->tools):
echo " <div style=\"float: left; margin-right: 75px\">\n";
endif;
$this->brick('reagentList', ['reagents' => $this->reagents[1], 'enhanced' => $this->reagents[0]]); $this->brick('reagentList', ['reagents' => $this->reagents[1], 'enhanced' => $this->reagents[0]]);
endif;
if ($this->tools): if ($this->tools):
echo " </div>\n"; echo " </div>\n";
if ($this->reagents[0]): if ($this->reagents[0]):
echo " <div style=\"float: left\">\n"; echo " <div style=\"float: left\">\n";
endif; endif;
?> ?>
<h3><?=Lang::spell('tools'); ?></h3> <h3><?=Lang::spell('tools'); ?></h3>
<table class="iconlist"> <table class="iconlist">
<?php <?php
foreach ($this->tools as $i => $t): foreach ($this->tools as $i => $t):
echo ' <tr><th align="right" id="iconlist-icon'.($i + 1).'"></th><td><span class="q1"><a href="'.$t['url'].'">'.$t['name']."</a></span></td></tr>\n"; echo ' <tr><th align="right" id="iconlist-icon'.($i + 1).'"></th><td><span class="q1"><a href="'.$t['url'].'">'.$t['name']."</a></span></td></tr>\n";
endforeach; endforeach;
?> ?>
</table> </table>
<script type="text/javascript"> <script type="text/javascript">
<?php <?php
foreach ($this->tools as $i => $t): foreach ($this->tools as $i => $t):
if (isset($t['itemId'])): if (isset($t['itemId'])):
echo " \$WH.ge('iconlist-icon.".($i + 1)."').appendChild(g_items.createIcon(".$t['itemId'].", 0, 1));\n"; echo $this->fmtCreateIcon($i + 1, Type::ITEM, $t['itemId'], 20, 'iconlist-icon', size: 0);
endif; endif;
endforeach; endforeach;
?> ?>
</script> </script>
<?php <?php
if ($this->reagents[0]): if ($this->reagents[0]):
echo " </div>\n"; echo " </div>\n";
endif;
endif; endif;
endif; endif;
?> ?>
@@ -86,23 +86,23 @@ endif;
</tr> </tr>
<tr> <tr>
<th style="border-left: 0; border-top: 0"><?=Lang::game('duration');?></th> <th style="border-left: 0; border-top: 0"><?=Lang::game('duration');?></th>
<td width="100%" style="border-top: 0"><?=(!empty($this->duration) ? $this->duration : '<span class="q0">'.Lang::main('n_a').'</span>');?></td> <td width="100%" style="border-top: 0"><?=($this->duration ?: '<span class="q0">'.Lang::main('n_a').'</span>');?></td>
</tr> </tr>
<tr> <tr>
<th style="border-left: 0"><?=Lang::game('school'); ?></th> <th style="border-left: 0"><?=Lang::game('school'); ?></th>
<td width="100%" style="border-top: 0"><?=(!empty($this->school[1]) ? (User::isInGroup(U_GROUP_STAFF) ? sprintf(Util::$dfnString, $this->school[0], $this->school[1]) : $this->school[1]) : '<span class="q0">'.Lang::main('n_a').'</span>');?></td> <td width="100%" style="border-top: 0"><?=($this->school ?: '<span class="q0">'.Lang::main('n_a').'</span>');?></td>
</tr> </tr>
<tr> <tr>
<th style="border-left: 0"><?=Lang::game('mechanic');?></th> <th style="border-left: 0"><?=Lang::game('mechanic');?></th>
<td width="100%" style="border-top: 0"><?=(!empty($this->mechanic) ? $this->mechanic : '<span class="q0">'.Lang::main('n_a').'</span>');?></td> <td width="100%" style="border-top: 0"><?=($this->mechanic ?:'<span class="q0">'.Lang::main('n_a').'</span>');?></td>
</tr> </tr>
<tr> <tr>
<th style="border-left: 0"><?=Lang::game('dispelType');?></th> <th style="border-left: 0"><?=Lang::game('dispelType');?></th>
<td width="100%" style="border-top: 0"><?=(!empty($this->dispel) ? $this->dispel : '<span class="q0">'.Lang::main('n_a').'</span>');?></td> <td width="100%" style="border-top: 0"><?=($this->dispel ?: '<span class="q0">'.Lang::main('n_a').'</span>');?></td>
</tr> </tr>
<tr> <tr>
<th style="border-bottom: 0; border-left: 0"><?=Lang::spell('_gcdCategory');?></th> <th style="border-bottom: 0; border-left: 0"><?=Lang::spell('_gcdCategory');?></th>
<td style="border-bottom: 0"><?=(!empty($this->gcdCat) ? $this->gcdCat : '<span class="q0">'.Lang::main('n_a').'</span>');?></td> <td style="border-bottom: 0"><?=($this->gcdCat ?: '<span class="q0">'.Lang::main('n_a').'</span>');?></td>
</tr> </tr>
</table> </table>
</td> </td>
@@ -113,7 +113,7 @@ endif;
</tr> </tr>
<tr> <tr>
<th><?=Lang::spell('_range');?></th> <th><?=Lang::spell('_range');?></th>
<td><?=$this->range.' '.Lang::spell('_distUnit').' <small>('.$this->rangeName;?>)</small></td> <td><?=$this->range.' '.Lang::spell('_distUnit').' <small>('.$this->rangeName.')</small>';?></td>
</tr> </tr>
<tr> <tr>
<th><?=Lang::spell('_castTime');?></th> <th><?=Lang::spell('_castTime');?></th>
@@ -121,7 +121,7 @@ endif;
</tr> </tr>
<tr> <tr>
<th><?=Lang::spell('_cooldown');?></th> <th><?=Lang::spell('_cooldown');?></th>
<td><?=(!empty($this->cooldown) ? $this->cooldown : '<span class="q0">'.Lang::main('n_a').'</span>');?></td> <td><?=($this->cooldown ?: '<span class="q0">'.Lang::main('n_a').'</span>');?></td>
</tr> </tr>
<tr> <tr>
<th><dfn title="<?=Lang::spell('_globCD').'">'.Lang::spell('_gcd');?></dfn></th> <th><dfn title="<?=Lang::spell('_globCD').'">'.Lang::spell('_gcd');?></dfn></th>
@@ -138,7 +138,7 @@ if (!in_array(array_values($this->scaling), [[-1, -1, 0, 0], [0, 0, 0, 0]])):
<?php <?php
foreach ($this->scaling as $k => $s): foreach ($this->scaling as $k => $s):
if ($s > 0): if ($s > 0):
echo ' '.sprintf(Lang::spell('scaling', $k), $s * 100)."<br>\n"; echo ' '.Lang::spell('scaling', $k, [$s * 100])."<br>\n";
endif; endif;
endforeach; endforeach;
?> ?>
@@ -147,7 +147,7 @@ if (!in_array(array_values($this->scaling), [[-1, -1, 0, 0], [0, 0, 0, 0]])):
<?php <?php
endif; endif;
if (!empty($this->stances)): if ($this->stances):
?> ?>
<tr> <tr>
<th><?=Lang::spell('_forms');?></th> <th><?=Lang::spell('_forms');?></th>
@@ -156,16 +156,16 @@ if (!empty($this->stances)):
<?php <?php
endif; endif;
if (!empty($this->items)): if ($this->items):
?> ?>
<tr> <tr>
<th><?=Lang::game('requires2');?></th> <th><?=Lang::game('requires2');?></th>
<td colspan="3"><?=(User::isInGroup(U_GROUP_STAFF) ? sprintf(Util::$dfnString, implode('<br />', $this->items[0]), $this->items[1]) : $this->items[1]);?></td> <td colspan="3"><?=$this->items;?></td>
</tr> </tr>
<?php <?php
endif; endif;
$iconTabIdx = -1; $iconTabIdx = 0;
foreach ($this->effects as $i => $e): foreach ($this->effects as $i => $e):
?> ?>
<tr> <tr>
@@ -174,42 +174,8 @@ foreach ($this->effects as $i => $e):
<?php <?php
echo ' '.$e['name']; echo ' '.$e['name'];
$smallBuf = ''; if ($e['footer']):
if (isset($e['value'])): echo "<small><br>".implode("<br>", $e['footer'])."</small>\n";
$smallBuf .= '<br>'.Lang::spell('_value').Lang::main('colon').$e['value'];
endif;
if (isset($e['radius'])):
$smallBuf .= '<br>'.Lang::spell('_radius').Lang::main('colon').$e['radius'].' '.Lang::spell('_distUnit');
endif;
if (isset($e['interval'])):
$smallBuf .= '<br>'.Lang::spell('_interval').Lang::main('colon').$e['interval'];
endif;
if (isset($e['mechanic'])):
$smallBuf .= '<br>'.Lang::game('mechanic') .Lang::main('colon').$e['mechanic'];
endif;
if (isset($e['procData'])):
$smallBuf .= '<br>';
if ($e['procData'][0] < 0):
$smallBuf .= sprintf(Lang::spell('ppm'), Lang::nf(-$e['procData'][0], 1));
elseif ($e['procData'][0] < 100.0):
$smallBuf .= Lang::spell('procChance').Lang::main('colon').$e['procData'][0].'%';
endif;
if ($e['procData'][1]):
if ($e['procData'][0] < 100.0):
$smallBuf .= '<br>';
endif;
$smallBuf .= sprintf(Lang::game('cooldown'), $e['procData'][1]);
endif;
endif;
if ($smallBuf):
echo "<small>".$smallBuf."</small>\n";
endif; endif;
if (isset($e['markup'])): if (isset($e['markup'])):
@@ -218,35 +184,37 @@ $WH.aE(window,\'load\',function(){$WH.ge(\'spelleffectmarkup-'.$i.'\').innerHTML
//]]></script>'; //]]></script>';
endif; endif;
if (isset($e['icon'])): if ($e['icon']):
['type' => $ty, 'typeId' => $ti, 'name' => $na, 'quality' => $qu, 'count' => $co] = $e['icon'];
?> ?>
<table class="icontab"> <table class="icontab">
<tr> <tr>
<th id="icontab-icon<?=++$iconTabIdx;?>"></th> <th id="icontab-icon<?=++$iconTabIdx;?>"></th>
<?php <?php
if (isset($e['icon']['quality'])): if ($qu):
echo ' <td><span class="q'.$e['icon']['quality'].'"><a href="?item='.$e['icon']['id'].'">'.$e['icon']['name']."</a></span></td>\n"; echo ' <td><span class="q'.$qu.'">'.($na ? sprintf('<a href="?item=%d">%s</a>', $ti, $na) : Util::ucFirst(Lang::game('item')).' #'.$ti)."</span></td>\n";
else: else:
echo ' <td>'.(strpos($e['icon']['name'], '#') ? $e['icon']['name'] : sprintf('<a href="?spell=%d">%s</a>', $e['icon']['id'], $e['icon']['name']))."</td>\n"; echo ' <td>'.($na ? sprintf('<a href="?spell=%d">%s</a>', $ti, $na) : Util::ucFirst(Lang::game('spell')).' #'.$ti)."</td>\n";
endif; endif;
?> ?>
<th></th><td></td> <th></th><td></td>
</tr> </tr>
</table> </table>
<script type="text/javascript"> <script type="text/javascript">
<?='$WH.ge(\'icontab-icon'.$iconTabIdx.'\').appendChild('.(isset($e['icon']['quality']) ? 'g_items' : 'g_spells').'.createIcon('.$e['icon']['id'].', 1, '.$e['icon']['count']."));\n";?> <?=$this->fmtCreateIcon($iconTabIdx, $ty, $ti, num: $co);?>
</script> </script>
<?php <?php
endif; endif;
if (isset($e['perfItem'])): if ($e['perfectItem']):
['spellId' => $si, 'spellName' => $sn, 'itemId' => $ii, 'itemName' => $in, 'quality' => $qu, 'icon' => $ic, 'chance' => $ch] = $e['perfectItem'];
?> ?>
<small><a href="?spell=<?=$e['perfItem']['cndSpellId'];?>" class="icontiny"><img src="<?=Cfg::get('STATIC_URL');?>/images/wow/icons/tiny/<?=$e['perfItem']['icon'];?>.gif" align="absmiddle"> <small><a href="?spell=<?=$si;?>" class="icontiny"><img src="<?=Cfg::get('STATIC_URL');?>/images/wow/icons/tiny/<?=$ic;?>.gif" align="absmiddle">
<span class="tinyicontxt"><?=$e['perfItem']['cndSpellName'];?></span></a><?=Lang::main('colon').' '.$e['perfItem']['chance'].'%';?></small><table class="icontab"> <span class="tinyicontxt"><?=$sn;?></span></a><?=Lang::main('colon').' '.$ch.'%';?></small><table class="icontab">
<tr><th id="icontab-icon<?=++$iconTabIdx;?>"></th><td><small><a href="?item=<?=$e['perfItem']['itemId'];?>" class="q<?=$e['perfItem']['quality'];?>"><?=$e['perfItem']['itemName'];?></a></small></td></tr></table> <tr><th id="icontab-icon<?=++$iconTabIdx;?>"></th><td><small><a href="?item=<?=$ii;?>" class="q<?=$qu;?>"><?=$in;?></a></small></td></tr></table>
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
$WH.ge('icontab-icon<?=$iconTabIdx;?>').appendChild(g_items.createIcon(<?=$e['perfItem']['itemId'];?>, 0, "0")); <?=$this->fmtCreateIcon($iconTabIdx, Type::ITEM, $ii);?>
//]]></script> //]]></script>
<?php <?php
@@ -263,8 +231,8 @@ $WH.aE(window,\'load\',function(){$WH.ge(\'spelleffectmarkup-'.$i.'\').innerHTML
$folded = false; $folded = false;
$iconData = []; $iconData = [];
if ($type && count($e['modifies'][0])) if ($type && count($e['modifies'][0])) // #effectspells-856451 < the number is ID from SpellEffect.db2 (not available in 3.3.5a, use effectIdx instead)
echo '<a href="javascript:" class="disclosure-off" onclick="return g_disclose($(\'#effectspells-85645'.($i - 1).'\')[0], this);">'.Lang::spell('_seeMore').'</a><div id="effectspells-85645'.($i - 1).'" style="display: none">'; echo '<a href="javascript:" class="disclosure-off" onclick="return g_disclose($(\'#effectspells-'.$i.'\')[0], this);">'.Lang::spell('_seeMore').'</a><div id="effectspells-'.$i.'" style="display: none">';
echo '<table class="icontab">'; echo '<table class="icontab">';
@@ -297,8 +265,8 @@ $WH.aE(window,\'load\',function(){$WH.ge(\'spelleffectmarkup-'.$i.'\').innerHTML
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
<?php <?php
foreach ($iconData as [$icon, $spell]) foreach ($iconData as [$idx, $spell])
echo sprintf(" \$WH.ge('icontab-icon%d').appendChild(g_spells.createIcon(%d, 0, \"0\"));\n", $icon, $spell); echo $this->fmtCreateIcon($idx, Type::SPELL, $spell, 32, size: 0);
?> ?>
//]]></script> //]]></script>