From 606fb0673c0168d8061d67effdd4799596421dac Mon Sep 17 00:00:00 2001 From: slawkens Date: Fri, 16 May 2025 15:03:03 +0200 Subject: [PATCH] Option to extend the highscores with hooks --- system/pages/highscores.php | 187 +++++++++++++++----------- system/src/global.php | 2 + system/templates/highscores.html.twig | 4 +- 3 files changed, 111 insertions(+), 82 deletions(-) diff --git a/system/pages/highscores.php b/system/pages/highscores.php index 6deb842c..3099e1f1 100644 --- a/system/pages/highscores.php +++ b/system/pages/highscores.php @@ -58,64 +58,79 @@ if($vocation !== 'all') { } } -$skill = POT::SKILL__LEVEL; -if(is_numeric($list)) -{ - $list = (int) $list; - if($list >= POT::SKILL_FIRST && $list <= POT::SKILL__LAST) - $skill = $list; +$categories = [ + 'experience' => 'Experience', + 'magic' => 'Magic', + 'shield' => 'Shielding', + 'distance' => 'Distance', + 'club' => 'Club', + 'sword' => 'Sword', + 'axe' => 'Axe', + 'fist' => 'Fist', + 'fishing' => 'Fishing', +]; + +if(setting('core.highscores_frags')) { + $categories['frags'] = 'Frags'; } -else +if(setting('core.highscores_balance')) + $categories['balance'] = 'Balance'; + +$skill = POT::SKILL__LEVEL; +switch($list) { - switch($list) - { - case 'fist': - $skill = POT::SKILL_FIST; - break; + case 'fist': + $skill = POT::SKILL_FIST; + break; - case 'club': - $skill = POT::SKILL_CLUB; - break; + case 'club': + $skill = POT::SKILL_CLUB; + break; - case 'sword': - $skill = POT::SKILL_SWORD; - break; + case 'sword': + $skill = POT::SKILL_SWORD; + break; - case 'axe': - $skill = POT::SKILL_AXE; - break; + case 'axe': + $skill = POT::SKILL_AXE; + break; - case 'distance': - $skill = POT::SKILL_DIST; - break; + case 'distance': + $skill = POT::SKILL_DIST; + break; - case 'shield': - $skill = POT::SKILL_SHIELD; - break; + case 'shield': + $skill = POT::SKILL_SHIELD; + break; - case 'fishing': - $skill = POT::SKILL_FISH; - break; + case 'fishing': + $skill = POT::SKILL_FISH; + break; - case 'level': - case 'experience': - $skill = POT::SKILL_LEVEL; - break; + case 'magic': + $skill = POT::SKILL__MAGLEVEL; + break; - case 'magic': - $skill = POT::SKILL__MAGLEVEL; - break; + case 'frags': + if(setting('core.highscores_frags')) + $skill = SKILL_FRAGS; + break; - case 'frags': - if(setting('core.highscores_frags')) - $skill = SKILL_FRAGS; - break; + case 'balance': + if(setting('core.highscores_balance')) + $skill = SKILL_BALANCE; + break; +} - case 'balance': - if(setting('core.highscores_balance')) - $skill = SKILL_BALANCE; - break; - } +$args = ['list' => $list, 'skill' => $skill, 'categories' => $categories]; +$hooks->triggerFilter(HOOK_FILTER_HIGHSCORES_LIST, $args); + +$list = $args['list']; +$skill = $args['skill']; +$categories = $args['categories']; + +if (!isset($categories[$list])) { + $skill = null; } $promotion = ''; @@ -162,8 +177,18 @@ $query->join('accounts', 'accounts.id', '=', 'players.account_id') ->selectRaw('accounts.country, players.id, players.name, players.account_id, players.level, players.vocation' . $outfit . $promotion) ->orderByDesc('value'); +if ($skill == SKILL_FRAGS) { + $skillName = 'Frags'; +} +else if($skill == SKILL_BALANCE) { + $skillName = 'Balance'; +} +else { + $skillName = getSkillName($skill); +} + if (empty($highscores)) { - if ($skill >= POT::SKILL_FIRST && $skill <= POT::SKILL_LAST) { // skills + if ($skill && $skill >= POT::SKILL_FIRST && $skill <= POT::SKILL_LAST) { // skills if ($db->hasColumn('players', 'skill_fist')) {// tfs 1.0 $skill_ids = array( POT::SKILL_FIST => 'skill_fist', @@ -193,20 +218,37 @@ if (empty($highscores)) { { $query ->addSelect('players.balance as value'); - } else { - if ($skill == POT::SKILL__MAGLEVEL) { - $query - ->addSelect('players.maglevel as value', 'players.maglevel') - ->orderBy('manaspent'); - } else { // level - $query - ->addSelect('players.level as value', 'players.experience') - ->orderBy('experience'); - $list = 'experience'; - } + } + else if ($skill == POT::SKILL__MAGLEVEL) { + $query + ->addSelect('players.maglevel as value', 'players.maglevel') + ->orderBy('manaspent'); + } else if ($skill == POT::SKILL__LEVEL) { + $query + ->addSelect('players.level as value', 'players.experience') + ->orderBy('experience', 'desc'); + $list = 'experience'; + } + else if ($skill) { + $args = [ + 'list' => $list, + 'skill' => $skill, + 'skillName' => $skillName, + 'query' => $query + ]; + + $hooks->triggerFilter(HOOK_FILTER_HIGHSCORES, $args); + + $list = $args['list']; + $skill = $args['skill']; + $skillName = $args['skillName']; + $query = $args['query']; + } + else { + $query = null; } - $highscores = $query->get()->map(function($row) { + $highscores = ($query ? $query->get()->map(function($row) { $tmp = $row->toArray(); $tmp['online'] = $row->online_status; $tmp['vocation'] = $row->vocation_name; @@ -214,7 +256,7 @@ if (empty($highscores)) { unset($tmp['online_table']); return $tmp; - })->toArray(); + })->toArray() : []); } if ($highscoresTTL > 0 && $cache->enabled() && $needReCache) { @@ -239,9 +281,11 @@ foreach($highscores as $id => &$player) $player['link'] = getPlayerLink($player['name'], false); $player['flag'] = getFlagImage($player['country']); + if($settingHighscoresOutfit) { $player['outfit'] = ''; } + $player['rank'] = $offset + $i; } else { @@ -263,24 +307,6 @@ if($show_link_to_next_page) { $linkNextPage = getLink('highscores') . '/' . $list . ($vocation !== 'all' ? '/' . $vocation : '') . '/' . ($page + 1); } -$types = array( - 'experience' => 'Experience', - 'magic' => 'Magic', - 'shield' => 'Shielding', - 'distance' => 'Distance', - 'club' => 'Club', - 'sword' => 'Sword', - 'axe' => 'Axe', - 'fist' => 'Fist', - 'fishing' => 'Fishing', -); - -if(setting('core.highscores_frags')) { - $types['frags'] = 'Frags'; -} -if(setting('core.highscores_balance')) - $types['balance'] = 'Balance'; - if ($highscoresTTL > 0 && $cache->enabled()) { echo '*Note: Highscores are updated every' . ($highscoresTTL > 1 ? ' ' . $highscoresTTL : '') . ' minute' . ($highscoresTTL > 1 ? 's' : '') . '.

'; } @@ -290,11 +316,12 @@ $twig->display('highscores.html.twig', [ 'highscores' => $highscores, 'list' => $list, 'skill' => $skill, - 'skillName' => ($skill == SKILL_FRAGS ? 'Frags' : ($skill == SKILL_BALANCE ? 'Balance' : getSkillName($skill))), + 'skillName' => $skillName, 'levelName' => ($skill != SKILL_FRAGS && $skill != SKILL_BALANCE ? 'Level' : ($skill == SKILL_BALANCE ? 'Balance' : 'Frags')), 'vocation' => $vocation !== 'all' ? $vocation : null, 'vocationId' => $vocationId, - 'types' => $types, + 'categories' => $categories, + 'types' => $categories, // leave for compatibility with outdated twigs 'linkPreviousPage' => $linkPreviousPage, 'linkNextPage' => $linkNextPage, ]); diff --git a/system/src/global.php b/system/src/global.php index 62366c1c..bea074cf 100644 --- a/system/src/global.php +++ b/system/src/global.php @@ -98,6 +98,8 @@ define('HOOK_INSTALL_FINISH', ++$i); define('HOOK_INSTALL_FINISH_END', ++$i); // hook filters +define('HOOK_FILTER_HIGHSCORES_LIST', ++$i); +define('HOOK_FILTER_HIGHSCORES', ++$i); define('HOOK_FILTER_ROUTES', ++$i); define('HOOK_FILTER_TWIG_DISPLAY', ++$i); define('HOOK_FILTER_TWIG_RENDER', ++$i); diff --git a/system/templates/highscores.html.twig b/system/templates/highscores.html.twig index 86599b90..ea00d524 100644 --- a/system/templates/highscores.html.twig +++ b/system/templates/highscores.html.twig @@ -9,7 +9,7 @@ @@ -102,7 +102,7 @@ - {% for link, name in types %} + {% for link, name in categories %} {{ name }}
{% endfor %}