Template/Update (Part 21)

* convert dbtype 'emotes'
 * in setup use voicemacros as additional aliasses
 * also fix emote text descriptor
This commit is contained in:
Sarjuuk
2025-08-10 21:43:32 +02:00
parent e33bc9117c
commit 2dd9265700
4 changed files with 156 additions and 110 deletions

View File

@@ -6,46 +6,57 @@ if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
// menuId 100: Emotes g_initPath() class EmoteBaseResponse extends TemplateResponse implements ICache
// tabid 0: Database g_initHeader()
class EmotePage extends GenericPage
{ {
use TrDetailPage; use TrDetailPage, TrCache;
protected $type = Type::EMOTE; protected int $cacheType = CACHE_TYPE_PAGE;
protected $typeId = 0;
protected $tpl = 'detail-page-generic';
protected $path = [0, 100];
protected $tabId = 0;
protected $mode = CACHE_TYPE_PAGE;
public function __construct($pageCall, $id) protected string $template = 'detail-page-generic';
protected string $pageName = 'emote';
protected ?int $activeTab = parent::TAB_DATABASE;
protected array $breadcrumb = [0, 100];
public int $type = Type::EMOTE;
public int $typeId = 0;
private EmoteList $subject;
public function __construct(string $id)
{ {
parent::__construct($id);
/* /*
* id > 0: player text emote * id > 0: player text emote
* id < 0: creature emote * id < 0: creature emote
*/ */
parent::__construct($pageCall, $id); $this->typeId = intVal($id);
$this->contribute = Type::getClassAttrib($this->type, 'contribute') ?? CONTRIBUTE_NONE;
$this->typeId = intVal($id); }
protected function generate() : void
{
$this->subject = new EmoteList(array(['id', $this->typeId])); $this->subject = new EmoteList(array(['id', $this->typeId]));
if ($this->subject->error) if ($this->subject->error)
$this->notFound(Lang::game('emote'), Lang::emote('notFound')); $this->generateNotFound(Lang::game('emote'), Lang::emote('notFound'));
$this->name = Util::ucFirst($this->subject->getField('cmd')); $this->h1 = Util::ucFirst($this->subject->getField('cmd'));
}
protected function generatePath() { } $this->gPageInfo += array(
'type' => $this->type,
'typeId' => $this->typeId,
'name' => $this->h1
);
/**************/
/* Page Title */
/**************/
array_unshift($this->title, $this->h1, Util::ucFirst(Lang::game('emote')));
protected function generateTitle()
{
array_unshift($this->title, $this->name, Util::ucFirst(Lang::game('emote')));
}
protected function generateContent()
{
/***********/ /***********/
/* Infobox */ /* Infobox */
/***********/ /***********/
@@ -83,6 +94,10 @@ class EmotePage extends GenericPage
} }
} }
if ($infobox)
$this->infobox = new InfoboxMarkup($infobox, ['allow' => Markup::CLASS_STAFF, 'dbpage' => true], 'infobox-contents0');
/****************/ /****************/
/* Main Content */ /* Main Content */
/****************/ /****************/
@@ -110,7 +125,7 @@ class EmotePage extends GenericPage
if ($_ = $this->subject->getField('extToNone', true)) if ($_ = $this->subject->getField('extToNone', true))
$noTarget[] = $this->prepare($_); $noTarget[] = $this->prepare($_);
if ($_ = $this->subject->getField('meToNone', true)) if ($_ = $this->subject->getField('meToNone', true))
$noTarget[] =$this->prepare($_); $noTarget[] = $this->prepare($_);
if (!$target && !$noTarget) if (!$target && !$noTarget)
$text .= '[div][i class=q0]'.Lang::emote('noText').'[/i][/div]'; $text .= '[div][i class=q0]'.Lang::emote('noText').'[/i][/div]';
@@ -138,17 +153,21 @@ class EmotePage extends GenericPage
$text .= '[h3]'.Lang::emote('eventSound').'[/h3][sound='.$_.']'; $text .= '[h3]'.Lang::emote('eventSound').'[/h3][sound='.$_.']';
} }
$this->extraText = $text; if ($text)
$this->infobox = $infobox ? '[ul][li]'.implode('[/li][li]', $infobox).'[/li][/ul]' : null; $this->extraText = new Markup($text, ['dbpage' => true, 'allow' => Markup::CLASS_ADMIN], 'text-generic');
$this->redButtons = array( $this->redButtons = array(
BUTTON_LINKS => ['type' => $this->type, 'typeId' => $this->typeId], BUTTON_LINKS => ['type' => $this->type, 'typeId' => $this->typeId],
BUTTON_WOWHEAD => false BUTTON_WOWHEAD => false
); );
/**************/ /**************/
/* Extra Tabs */ /* Extra Tabs */
/**************/ /**************/
$this->lvTabs = new Tabs(['parent' => "\$\$WH.ge('tabs-generic')"], 'tabsRelated', true);
// tab: achievement // tab: achievement
$condition = array( $condition = array(
['ac.type', ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE], ['ac.type', ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE],
@@ -157,32 +176,42 @@ class EmotePage extends GenericPage
$acv = new AchievementList($condition); $acv = new AchievementList($condition);
if (!$acv->error) if (!$acv->error)
{ {
$this->lvTabs[] = [AchievementList::$brickFile, ['data' => array_values($acv->getListviewData())]];
$this->extendGlobalData($acv->getJsGlobals()); $this->extendGlobalData($acv->getJsGlobals());
$this->lvTabs->addListviewTab(new Listview(['data' => $acv->getListviewData()], AchievementList::$brickFile));
} }
// tab: sound // tab: sound
if ($em = DB::Aowow()->select('SELECT `soundId` AS ARRAY_KEY, BIT_OR(1 << (`raceId` - 1)) AS "raceMask", BIT_OR(1 << (`gender` - 1)) AS "gender" FROM ?_emotes_sounds WHERE -`emoteId` = ?d GROUP BY `soundId`', $this->typeId > 0 ? $this->subject->getField('parentEmote') : $this->typeId)) $ems = DB::Aowow()->select(
'SELECT `soundId` AS ARRAY_KEY, BIT_OR(1 << (`raceId` - 1)) AS "raceMask", BIT_OR(1 << (`gender` - 1)) AS "gender"
FROM ?_emotes_sounds
WHERE `emoteId` = ?d { OR -`emoteId` = ?d }
GROUP BY `soundId`',
$this->typeId,
$this->typeId < 0 ? $this->subject->getField('parentEmote') : DBSIMPLE_SKIP
);
if ($ems)
{ {
$sounds = new SoundList(array(['id', array_keys($em)])); $sounds = new SoundList(array(['id', array_keys($ems)]));
if (!$sounds->error) if (!$sounds->error)
{ {
$this->extendGlobalData($sounds->getJSGlobals(GLOBALINFO_SELF)); $this->extendGlobalData($sounds->getJSGlobals(GLOBALINFO_SELF));
$data = $sounds->getListviewData(); $data = $sounds->getListviewData();
foreach($data as $id => &$d) foreach ($data as $id => &$d)
{ {
$d['races'] = $em[$id]['raceMask']; $d['races'] = $ems[$id]['raceMask'];
$d['gender'] = $em[$id]['gender']; $d['gender'] = $ems[$id]['gender'];
} }
$this->lvTabs[] = [SoundList::$brickFile, array( $this->lvTabs->addListviewTab(new Listview(array(
'data' => array_values($data), 'data' => $data,
// gender races // gender races
'extraCols' => ['$Listview.templates.title.columns[1]', '$Listview.templates.classs.columns[1]'] 'extraCols' => ['$Listview.templates.title.columns[1]', '$Listview.templates.classs.columns[1]']
)]; ), SoundList::$brickFile));
} }
} }
parent::generate();
} }
private function prepare(string $emote) : string private function prepare(string $emote) : string

View File

@@ -0,0 +1,61 @@
<?php
namespace Aowow;
if (!defined('AOWOW_REVISION'))
die('illegal access');
class EmotesBaseResponse extends TemplateResponse implements ICache
{
use TrListPage, TrCache;
protected int $cacheType = CACHE_TYPE_PAGE;
protected int $type = Type::EMOTE;
protected string $template = 'list-page-generic';
protected string $pageName = 'emotes';
protected ?int $activeTab = parent::TAB_DATABASE;
protected array $breadcrumb = [0, 100];
public function __construct(string $pageParam)
{
$this->getCategoryFromUrl($pageParam);
parent::__construct($pageParam);
}
protected function generate() : void
{
$this->h1 = Util::ucFirst(Lang::game('emotes'));
/**************/
/* Page Title */
/**************/
array_unshift($this->title, $this->h1);
/****************/
/* Main Content */
/****************/
$cnd = [Cfg::get('SQL_LIMIT_NONE')];
if (!User::isInGroup(U_GROUP_STAFF))
$cnd[] = [['cuFlags', CUSTOM_EXCLUDE_FOR_LISTVIEW, '&'], 0];
$this->lvTabs = new Tabs(['parent' => "\$\$WH.ge('tabs-generic')"]);
$tabData = array(
'data' => (new EmoteList($cnd))->getListviewData(),
'name' => Util::ucFirst(Lang::game('emotes'))
);
$this->lvTabs->addListviewTab(new Listview($tabData, EmoteList::$brickFile, 'emote'));
parent::generate();
}
}
?>

View File

@@ -1,50 +0,0 @@
<?php
namespace Aowow;
if (!defined('AOWOW_REVISION'))
die('illegal access');
// menuId 100: Emotes g_initPath()
// tabid 0: Database g_initHeader()
class EmotesPage extends GenericPage
{
use TrListPage;
protected $type = Type::EMOTE;
protected $tpl = 'list-page-generic';
protected $path = [0, 100];
protected $tabId = 0;
protected $mode = CACHE_TYPE_PAGE;
public function __construct($pageCall, $pageParam)
{
parent::__construct($pageCall, $pageParam);
$this->name = Util::ucFirst(Lang::game('emotes'));
}
protected function generateContent()
{
$cnd = [Cfg::get('SQL_LIMIT_NONE')];
if (!User::isInGroup(U_GROUP_STAFF))
$cnd[] = [['cuFlags', CUSTOM_EXCLUDE_FOR_LISTVIEW, '&'], 0];
$tabData = array(
'data' => array_values((new EmoteList($cnd))->getListviewData()),
'name' => Util::ucFirst(Lang::game('emotes'))
);
$this->lvTabs[] = [EmoteList::$brickFile, $tabData, 'emote'];
}
protected function generateTitle()
{
array_unshift($this->title, $this->name);
}
protected function generatePath() { }
}
?>

View File

@@ -42,15 +42,15 @@ CLISetup::registerSetup("sql", new class extends SetupScript
/*********************/ /*********************/
/* EmotesText Data offsets /* EmotesText Data offsets
gender seenBy hasTarget mergedWith example gender seenBy hasTarget effective mergedWith example
0 male others yes 8 %s raises <his/her> fist in anger at %s. 0 male others yes ext -> ext 8 %s raises <his/her> fist in anger at %s.
1 male self yes 9 %s raises <his/her> fist in anger at you. 1 male self yes ext -> me 9 %s raises <his/her> fist in anger at you.
2 self self yes You raise your fist in anger at %s. 2 self self yes me -> ext You raise your fist in anger at %s.
4 male others no 12 %s raises <his/her> fist in anger. 4 male others no ext -> none 12 %s raises <his/her> fist in anger.
6 self self no You raise your fist in anger. 6 self self no me -> none You raise your fist in anger.
8 female others yes 0 - 8 female others yes ext -> ext 0 -
9 female self yes 1 - 9 female self yes ext -> me 1 -
12 female others no 4 - 12 female others no ext -> none 4 -
*/ */
$this->textData = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `text_loc0` AS "0", `text_loc2` AS "2", `text_loc3` AS "3", `text_loc4` AS "4", `text_loc6` AS "6", `text_loc8` AS "8" FROM dbc_emotestextdata'); $this->textData = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `text_loc0` AS "0", `text_loc2` AS "2", `text_loc3` AS "3", `text_loc4` AS "4", `text_loc6` AS "6", `text_loc8` AS "8" FROM dbc_emotestextdata');
@@ -70,39 +70,45 @@ CLISetup::registerSetup("sql", new class extends SetupScript
VALUES VALUES
(?d, ?, ?d, ?d, ?d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', (?d, ?, ?d, ?d, ?d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
$id, $t['cmd'], $t['anim'], $t['parent'], $t['soundId'], $id, $t['cmd'], $t['anim'], $t['parent'], $t['soundId'],
$this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::EN), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::EN), $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::EN), $this->textData[$t['etd2']][Locale::EN->value] ?? '', $this->textData[$t['etd6']][Locale::EN->value] ?? '', $this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::EN), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::EN), $this->textData[$t['etd2']][Locale::EN->value] ?? '', $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::EN), $this->textData[$t['etd6']][Locale::EN->value] ?? '',
$this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::FR), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::FR), $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::FR), $this->textData[$t['etd2']][Locale::FR->value] ?? '', $this->textData[$t['etd6']][Locale::FR->value] ?? '', $this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::FR), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::FR), $this->textData[$t['etd2']][Locale::FR->value] ?? '', $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::FR), $this->textData[$t['etd6']][Locale::FR->value] ?? '',
$this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::DE), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::DE), $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::DE), $this->textData[$t['etd2']][Locale::DE->value] ?? '', $this->textData[$t['etd6']][Locale::DE->value] ?? '', $this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::DE), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::DE), $this->textData[$t['etd2']][Locale::DE->value] ?? '', $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::DE), $this->textData[$t['etd6']][Locale::DE->value] ?? '',
$this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::CN), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::CN), $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::CN), $this->textData[$t['etd2']][Locale::CN->value] ?? '', $this->textData[$t['etd6']][Locale::CN->value] ?? '', $this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::CN), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::CN), $this->textData[$t['etd2']][Locale::CN->value] ?? '', $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::CN), $this->textData[$t['etd6']][Locale::CN->value] ?? '',
$this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::ES), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::ES), $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::ES), $this->textData[$t['etd2']][Locale::ES->value] ?? '', $this->textData[$t['etd6']][Locale::ES->value] ?? '', $this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::ES), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::ES), $this->textData[$t['etd2']][Locale::ES->value] ?? '', $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::ES), $this->textData[$t['etd6']][Locale::ES->value] ?? '',
$this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::RU), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::RU), $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::RU), $this->textData[$t['etd2']][Locale::RU->value] ?? '', $this->textData[$t['etd6']][Locale::RU->value] ?? '' $this->mergeGenderedStrings($t['etd0'], $t['etd8'], Locale::RU), $this->mergeGenderedStrings($t['etd1'], $t['etd9'], Locale::RU), $this->textData[$t['etd2']][Locale::RU->value] ?? '', $this->mergeGenderedStrings($t['etd4'], $t['etd12'], Locale::RU), $this->textData[$t['etd6']][Locale::RU->value] ?? ''
); );
} }
// i have no idea, how the indexing in this file works. // i have no idea, how the indexing in this file works.
// sometimes the \d+ after EMOTE is the emoteTextId, but not nearly often enough // sometimes the \d+ after EMOTE is the emoteTextId, but not nearly often enough
$aliasses = []; $aliasses = $voiceAliases = [];
foreach (CLISetup::searchGlobalStrings('/^EMOTE(\d+)_CMD\d+\s=\s\"\/([^"]+)\";$/') as $lId => $match) foreach (CLISetup::searchGlobalStrings('/^EMOTE(\d+)_CMD\d+ = \"\/([^"]+)\";$/') as $locId => [, $etID, $cmd])
$aliasses[$match[1]][] = [$lId, $match[2]]; $aliasses[$etID][] = [$locId, $cmd];
foreach (CLISetup::searchGlobalStrings('/^VOICEMACRO_LABEL_([A-Z]+)\d+ = \"([^"]+)\";$/') as $locId => [, $cmd, $alias])
$voiceAliases[$cmd][] = [$locId, $alias];
$emotes = DB::Aowow()->selectCol('SELECT id AS ARRAY_KEY, cmd FROM ?_emotes'); $emotes = DB::Aowow()->selectCol('SELECT id AS ARRAY_KEY, cmd FROM ?_emotes');
foreach($emotes as $eId => $cmd) foreach($emotes as $eId => $cmd)
{ {
foreach ($voiceAliases[strtoupper($cmd)] ?? [] as [$locId, $alias])
DB::Aowow()->query('INSERT IGNORE INTO ?_emotes_aliasses VALUES (?d, ?d, ?) ON DUPLICATE KEY UPDATE `locales` = `locales` | ?d', $eId, (1 << $locId), mb_strtolower($alias), (1 << $locId));
foreach ($aliasses as $data) foreach ($aliasses as $data)
{ {
if (!in_array($cmd, array_column($data, 1))) if (!in_array($cmd, array_column($data, 1)))
continue; continue;
foreach ($data as $d) foreach ($data as [$locId, $alias])
DB::Aowow()->query('INSERT IGNORE INTO ?_emotes_aliasses VALUES (?d, ?d, ?) ON DUPLICATE KEY UPDATE locales = locales | ?d', $eId, (1 << $d[0]), strtolower($d[1]), (1 << $d[0])); DB::Aowow()->query('INSERT IGNORE INTO ?_emotes_aliasses VALUES (?d, ?d, ?) ON DUPLICATE KEY UPDATE `locales` = `locales` | ?d', $eId, (1 << $locId), mb_strtolower($alias), (1 << $locId));
continue 2; break;
} }
DB::Aowow()->query('UPDATE ?_emotes SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', CUSTOM_EXCLUDE_FOR_LISTVIEW | EMOTE_CU_MISSING_CMD, $eId);
} }
DB::Aowow()->query('UPDATE ?_emotes e LEFT JOIN ?_emotes_aliasses ea ON ea.`id` = e.`id` SET e.`cuFlags` = e.`cuFlags` | ?d WHERE ea.`id` IS NULL', CUSTOM_EXCLUDE_FOR_LISTVIEW | EMOTE_CU_MISSING_CMD);
/*********************/ /*********************/
/* Server controlled */ /* Server controlled */