docker-tmserver/xaseco/includes/manialinks.inc.php

1405 lines
57 KiB
PHP
Raw Permalink Normal View History

2022-06-26 17:43:44 +02:00
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Provides simple ManiaLink windows as replacement for TMN windows.
* Also handles special panels and custom UI changes.
* Created by Xymph
*
* Currently reserved ManiaLink id's and action's:
* id= "0": dummy for custom_ui block
* "1": Main pop-up window
* "2": CheckPoints panel
* "3": Admin panel
* "4": Records panel
* "5": Vote panel
* "6": Donate panel
* "7": Messages window
* "8": /msglog button
* "9": Scoreboard stats panel
* action= "0": Close main pop-up window
* "-1": Ignore action (by server)
* "-4": First page of main window
* "-3": Previous5 page of main window
* "-2": Previous page of main window
* "1": Refresh current page
* "2": Next page of main window
* "3": Next5 page of main window
* "4": Last page of main window
* "-5": /stats field Time Played call "/active"
* "-6": /stats field Server Rank call "/top100"
* "5": /stats field Records call "/toprecs"
* "6": /stats field Races Won call "/topwins"
* "7": Records panel PB field call "/topsums"
* "8": Records panel Local field call "/recs"
* "9": Records panel Dedi field call "/dedirecs"
* "10": Records panel TMX field call "/tmxrecs"
* "11": /list Env field Stadium call "/list env:Stadium"
* "12": /list Env field Alpine call "/list env:Alpine"
* "13": /list Env field Bay call "/list env:Bay"
* "14": /list Env field Coast call "/list env:Coast"
* "15": /list Env field Island call "/list env:Island"
* "16": /list Env field Rally call "/list env:Rally"
* "17": /list Env field Speed call "/list env:Speed"
* "18": Vote panel Yes, F5 key call "/y"
* "19": Vote panel No, F6 key
* "20": /jukebox display Clear button call "/admin clearjukebox"
* "21": Admin panel ClipRewind button call "/admin restartmap"
* "22": Admin panel ClipPause button call "/admin endround"
* "23": Admin panel ClipPlay button call "/admin nextmap"
* "24": Admin panel Refresh button call "/admin replaymap"
* "25": Admin panel ArrowGreen button call "/admin pass"
* "26": Admin panel ArrowRed button call "/admin cancel"
* "27": Admin panel Buddies button call "/admin players"
* "28": Server coppers Payment dialog Yes
* "29": Server coppers Payment dialog No
* "30": Donate panel, button 1 call "/donate 20"
* "31": Donate panel, button 2 call "/donate 50"
* "32": Donate panel, button 3 call "/donate 100"
* "33": Donate panel, button 4 call "/donate 200"
* "34": Donate panel, button 5 call "/donate 500"
* "35": Donate panel, button 6 call "/donate 1000"
* "36": Donate panel, button 7 call "/donate 2000"
* "37"-"48": Vote panels, handled in plugin.panels.php
* "-7"-"-48": Admin panels, handled in plugin.panels.php
* "49"-"100": Window styles, handled in plugin.style.php
* "-49"-"-100": Records panels, handled in plugin.panels.php
* "101"-"2000": Track numbers for /jukebox, handled in plugin.rasp_jukebox.php
* "-101"-"-2000": Track authors for /list, handled in plugin.rasp_jukebox.php
*"-2001"-"-2100": Jukebox drop numbers, handled in plugin.rasp_jukebox.php
*"-2101"-"-4000": Song numbers, handled in plugin.music_server.php
* "2001"-"2200": Player numbers for /stats, handled in chat.players.php
* "2201"-"2400": Player numbers for /admin warn, handled in chat.admin.php
* "2401"-"2600": Player numbers for /admin ignore, handled in chat.admin.php
* "2601"-"2800": Player numbers for /admin unignore, handled in chat.admin.php
* "2801"-"3000": Player numbers for /admin kick, handled in chat.admin.php
* "3001"-"3200": Player numbers for /admin ban, handled in chat.admin.php
* "3201"-"3400": Player numbers for /admin unban, handled in chat.admin.php
* "3401"-"3600": Player numbers for /admin black, handled in chat.admin.php
* "3601"-"3800": Player numbers for /admin unblack, handled in chat.admin.php
* "3801"-"4000": Player numbers for /admin addguest, handled in chat.admin.php
* "4001"-"4200": Player numbers for /admin removeguest, handled in chat.admin.php
* "4201"-"4400": Player numbers for /admin forcespec, handled in chat.admin.php
* "4401"-"4600": Player numbers for /admin listignores, handled in chat.admin.php
* "4601"-"4800": Player numbers for /admin listbans, handled in chat.admin.php
* "4801"-"5000": Player numbers for /admin listblacks, handled in chat.admin.php
* "5001"-"5200": Player numbers for /admin listguests, handled in chat.admin.php
* "5201"-"5700": TMX numbers for /tmxinfo, handled in plugin.rasp_jukebox.php
* "5701"-"6200": TMX numbers for /add, handled in plugin.rasp_jukebox.php
* "6201"-"6700": TMX numbers for /admin add, handled in plugin.rasp_jukebox.php
* "6701"-"7200": Authors for /xlist auth:, handled in plugin.rasp_jukebox.php
* "7201"-"7222": Donate panels, handled in plugin.panels.php
* "7223": /msglog button, handled in plugin.msglog.php
*"-4001"-"-4200": Player numbers for /jfreu badword, handled in jfreu.chat.php
*"-4201"-"-4400": Player numbers for /jfreu banfor 1H, handled in jfreu.chat.php
*"-4401"-"-4600": Player numbers for /jfreu banfor 24H, handled in jfreu.chat.php
*"-4601"-"-4800": Player numbers for /jfreu unban, handled in jfreu.chat.php
*"-4801"-"-5000": Player numbers for /jfreu addvip, handled in jfreu.chat.php
*"-5001"-"-5200": Player numbers for /jfreu removevip, handled in jfreu.chat.php
*"-5201"-"-5400": Player numbers for /jfreu unspec, handled in jfreu.chat.php
*"-5401"-"-5600": Player numbers for /jfreu listbans, handled in jfreu.chat.php
*"-5601"-"-5800": Player numbers for /jfreu listvips, handled in jfreu.chat.php
*"-5801"-"-6000": Team numbers for /jfreu listvipteams, handled in jfreu.chat.php
*"-6001"-"-7900": Track numbers for /karma, handled in plugin.rasp_jukebox.php
*"-7901"-"-8100": Player numbers for /admin unbanip, handled in chat.admin.php
*/
Aseco::registerEvent('onPlayerManialinkPageAnswer', 'event_manialink');
Aseco::registerEvent('onNewChallenge', 'scorepanel_off');
Aseco::registerEvent('onNewChallenge', 'statspanels_off');
Aseco::registerEvent('onEndRace', 'scorepanel_on');
Aseco::registerEvent('onEndRace', 'allwindows_off');
Aseco::registerEvent('onBeginRound', 'roundspanel_off');
Aseco::registerEvent('onPlayerFinish', 'roundspanel_on');
// stores/inits <custom_ui> block fields & records panel
global $ml_custom_ui, $ml_records;
$ml_custom_ui = array('global' => true,
'notice' => true,
'challenge_info' => true,
'net_infos' => true,
'chat' => true,
'checkpoint_list' => true,
'round_scores' => true,
'scoretable' => true
);
$ml_records = array('local' => ' --.--', 'dedi' => ' --.--', 'tmx' => ' --.--');
/**
* Displays a single ManiaLink window to a player
*
* $login : player login to send window to
* $header: string
* $icon : array( $style, $substyle {, $sizechg} )
* $data : array( $line1=array($col1, $col2, ...), $line2=array(...) )
* $widths: array( $overal, $col1, $col2, ...)
* $button: string
*
* A $line with one $col will occupy the full window width,
* otherwise all $line's must have the same number of columns,
* as should $widths (+1 for $overall).
* line height=".046" is required minimum to prevent alignment glitches
* due to large characters in some cells.
* If $colX is an array, it contains the string and the button's action id.
*/
function display_manialink($login, $header, $icon, $data, $widths, $button) {
global $aseco;
$player = $aseco->server->players->getPlayer($login);
$style = $player->style;
// check for old TMN-style window
if (empty($style)) {
$tsp = 'B'; // 'F' = solid, '0' = invisible
$txt = '333' . $tsp; // dark grey
$bgd = 'FFF' . $tsp; // white
$spc = 'DDD' . $tsp; // light grey
// build manialink header
$xml = '<manialink id="1" posx="' . ($widths[0]/2) . '" posy="0.47">' .
'<background bgcolor="' . $bgd . '" bgborderx="0.01" bgbordery="0.01"/>' . LF .
'<format textsize="3" textcolor="' . $txt . '"/>' . LF;
// add header
$xml .= '<line><cell bgcolor="' . $spc . '" width="' . $widths[0] . '"><text> $o' . htmlspecialchars(validateUTF8String($header)) . '</text></cell></line>' . LF;
// add spacer
$xml .= '<format textsize="2" textcolor="' . $txt . '"/>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
// add lines with optional columns
foreach ($data as $line) {
$xml .= '<line height=".046">';
if (!empty($line)) {
if (count($line) > 1) {
for ($i = 0; $i < count($widths)-1; $i++) {
if (is_array($line[$i])) {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[$i+1] . '"><text action="' . $line[$i][1] . '"> $o' . htmlspecialchars(validateUTF8String($line[$i][0])) . '</text></cell>';
} else {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[$i+1] . '"><text> $o' . htmlspecialchars(validateUTF8String($line[$i])) . '</text></cell>';
}
}
} else {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text> $o' . htmlspecialchars(validateUTF8String($line[0])) . '</text></cell>';
}
} else { // spacer
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell>';
}
$xml .= '</line>' . LF;
}
// add spacer, button (action "0" = close) & footer
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
$xml .= '<line height=".046"><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text halign="center" action="0">$o' . $button . '</text></cell></line></manialink>';
} else { // TMF-style window
$hsize = $style['HEADER'][0]['TEXTSIZE'][0];
$bsize = $style['BODY'][0]['TEXTSIZE'][0];
$lines = count($data);
// build manialink header & window
$xml = '<manialink id="1"><frame pos="' . ($widths[0]/2) . ' 0.47 0">' .
'<quad size="' . $widths[0] . ' ' . (0.11+$hsize+$lines*$bsize) .
'" style="' . $style['WINDOW'][0]['STYLE'][0] .
'" substyle="' . $style['WINDOW'][0]['SUBSTYLE'][0] . '"/>' . LF;
// add header and optional icon
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -0.01 -0.1" size="' . ($widths[0]-0.02) . ' ' . $hsize .
'" halign="center" style="' . $style['HEADER'][0]['STYLE'][0] .
'" substyle="' . $style['HEADER'][0]['SUBSTYLE'][0] . '"/>' . LF;
if (is_array($icon)) {
$isize = $hsize;
if (isset($icon[2]))
$isize += $icon[2];
$xml .= '<quad pos="-0.055 -0.045 -0.2" size="' . $isize . ' ' . $isize .
'" halign="center" valign="center" style="' . $icon[0] . '" substyle="' . $icon[1] . '"/>' . LF;
$xml .= '<label pos="-0.10 -0.025 -0.2" size="' . ($widths[0]-0.12) . ' ' . $hsize .
'" halign="left" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($header)) . '"/>' . LF;
} else {
$xml .= '<label pos="-0.03 -0.025 -0.2" size="' . ($widths[0]-0.05) . ' ' . $hsize .
'" halign="left" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($header)) . '"/>' . LF;
}
// add body
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.02+$hsize) .
' -0.1" size="' . ($widths[0]-0.02) . ' ' . (0.02+$lines*$bsize) .
'" halign="center" style="' . $style['BODY'][0]['STYLE'][0] .
'" substyle="' . $style['BODY'][0]['SUBSTYLE'][0] . '"/>' . LF;
// add lines with optional columns
$xml .= '<format style="' . $style['BODY'][0]['TEXTSTYLE'][0] . '"/>' . LF;
$cnt = 0;
foreach ($data as $line) {
$cnt++;
if (!empty($line)) {
if (count($line) > 1) {
for ($i = 0; $i < count($widths)-1; $i++) {
if (is_array($line[$i])) {
$xml .= '<quad pos="-' . (0.015+array_sum(array_slice($widths,1,$i))) .
' -' . ($hsize-0.013+$cnt*$bsize) .
' -0.15" size="' . ($widths[$i+1]-0.03) . ' ' . ($bsize+0.005) .
'" halign="left" style="' . $style['BUTTON'][0]['STYLE'][0] .
'" substyle="' . $style['BUTTON'][0]['SUBSTYLE'][0] .
'" action="' . $line[$i][1] . '"/>' . LF;
$xml .= '<label pos="-' . (0.025+array_sum(array_slice($widths,1,$i))) .
' -' . ($hsize-0.008+$cnt*$bsize) .
' -0.2" size="' . ($widths[$i+1]-0.05) . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[$i][0])) . '"/>' . LF;
} else {
$xml .= '<label pos="-' . (0.025+array_sum(array_slice($widths,1,$i))) .
' -' . ($hsize-0.008+$cnt*$bsize) .
' -0.2" size="' . ($widths[$i+1]-0.05) . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[$i])) . '"/>' . LF;
}
}
} else {
$xml .= '<label pos="-0.025 -' . ($hsize-0.008+$cnt*$bsize) .
' -0.2" size="' . ($widths[0]-0.04) . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[0])) . '"/>' . LF;
}
}
}
// add button (action "0" = close) & footer
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.04+$hsize+$lines*$bsize) .
' -0.2" size="0.06 0.06" halign="center" style="Icons64x64_1" substyle="Close" action="0"/>' . LF;
$xml .= '</frame></manialink>';
$xml = str_replace('{#black}', $style['WINDOW'][0]['BLACKCOLOR'][0], $xml);
}
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $aseco->formatColors($xml), 0, true));
} // display_manialink
/**
* Displays custom TMX track ManiaLink window to a player
*
* $login : player login to send window to
* $header: string
* $icon : array( $style, $substyle {, $sizechg} )
* $links : array( $image, $square, $page, $download )
* $data : array( $line1=array($col1, $col2, ...), $line2=array(...) )
* $widths: array( $overal, $col1, $col2, ...)
* $button: string
*
* A $line with one $col will occupy the full window width,
* otherwise all $line's must have the same number of columns,
* as should $widths (+1 for $overall).
* line height=".046" is required minimum to prevent alignment glitches
* due to large characters in some cells.
*/
function display_manialink_track($login, $header, $icon, $links, $data, $widths, $button) {
global $aseco;
$player = $aseco->server->players->getPlayer($login);
$style = $player->style;
$square = $links[1];
// check for old TMN-style window
if (empty($style)) {
$tsp = 'B'; // 'F' = solid, '0' = invisible
$txt = '333' . $tsp; // dark grey
$bgd = 'FFF' . $tsp; // white
$spc = 'DDD' . $tsp; // light grey
// build manialink header
$xml = '<manialink id="1" posx="' . ($widths[0]/2) . '" posy="0.47">' .
'<background bgcolor="' . $bgd . '" bgborderx="0.01" bgbordery="0.01"/>' . LF .
'<format textsize="3" textcolor="' . $txt . '"/>' . LF;
// add header
$xml .= '<line><cell bgcolor="' . $spc . '" width="' . $widths[0] . '"><text> $o' . htmlspecialchars(validateUTF8String($header)) . '</text></cell></line>' . LF;
// add spacers & image
$xml .= '<format textsize="2" textcolor="' . $txt . '"/>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><icon width="0.4" height="' . ($square ? '0.4' : '0.3') . '" halign="center">' . htmlspecialchars($links[0]) . '</icon></cell></line>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
// add lines with optional columns
foreach ($data as $line) {
$xml .= '<line height=".046">';
if (!empty($line)) {
for ($i = 0; $i < count($widths)-1; $i++) {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[$i+1] . '"><text> $o' . htmlspecialchars(validateUTF8String($line[$i])) . '</text></cell>';
}
} else { // spacer
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell>';
}
$xml .= '</line>' . LF;
}
// add spacer & links
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
$xml .= '<format textsize="3" textcolor="' . $txt . '"/>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . ($widths[0]/2) . '"><text halign="center">$o' . htmlspecialchars($links[2]) . '</text></cell>' .
'<cell bgcolor="' . $bgd . '" width="' . ($widths[0]/2) . '"><text halign="center">$o' . htmlspecialchars($links[3]) . '</text></cell></line>' . LF;
// add spacer, button (action "0" = close) & footer
$xml .= '<format textsize="2" textcolor="' . $txt . '"/>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
$xml .= '<line height=".046"><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text halign="center" action="0">$o' . $button . '</text></cell></line></manialink>';
} else { // TMF-style window
$hsize = $style['HEADER'][0]['TEXTSIZE'][0];
$bsize = $style['BODY'][0]['TEXTSIZE'][0];
$lines = count($data);
// build manialink header & window
$xml = '<manialink id="1"><frame pos="' . ($widths[0]/2) . ' 0.47 0">' .
'<quad size="' . $widths[0] . ' ' . (0.42+($square?0.1:0)+2*$hsize+$lines*$bsize) .
'" style="' . $style['WINDOW'][0]['STYLE'][0] .
'" substyle="' . $style['WINDOW'][0]['SUBSTYLE'][0] . '"/>' . LF;
// add header
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -0.01 -0.1" size="' . ($widths[0]-0.02) . ' ' . $hsize .
'" halign="center" style="' . $style['HEADER'][0]['STYLE'][0] .
'" substyle="' . $style['HEADER'][0]['SUBSTYLE'][0] . '"/>' . LF;
if (is_array($icon)) {
$isize = $hsize;
if (isset($icon[2]))
$isize += $icon[2];
$xml .= '<quad pos="-0.055 -0.045 -0.2" size="' . $isize . ' ' . $isize .
'" halign="center" valign="center" style="' . $icon[0] . '" substyle="' . $icon[1] . '"/>' . LF;
$xml .= '<label pos="-0.10 -0.025 -0.2" size="' . ($widths[0]-0.12) . ' ' . $hsize .
'" halign="left" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($header)) . '"/>' . LF;
} else {
$xml .= '<label pos="-0.03 -0.025 -0.2" size="' . ($widths[0]-0.05) . ' ' . $hsize .
'" halign="left" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($header)) . '"/>' . LF;
}
// add image
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.02+$hsize) .
' -0.2" size="0.4 ' . ($square ? '0.4' : '0.3') . '" halign="center" image="' . htmlspecialchars($links[0]) . '"/>' . LF;
// add body
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.33+($square?0.1:0)+$hsize) .
' -0.1" size="' . ($widths[0]-0.02) . ' ' . (0.02+$hsize+$lines*$bsize) .
'" halign="center" style="' . $style['BODY'][0]['STYLE'][0] .
'" substyle="' . $style['BODY'][0]['SUBSTYLE'][0] . '"/>' . LF;
// add lines with optional columns
$xml .= '<format style="' . $style['BODY'][0]['TEXTSTYLE'][0] . '"/>' . LF;
$cnt = 0;
foreach ($data as $line) {
$cnt++;
if (!empty($line)) {
for ($i = 0; $i < count($widths)-1; $i++) {
$xml .= '<label pos="-' . (0.025+array_sum(array_slice($widths,1,$i))) .
' -' . (0.305+($square?0.1:0)+$hsize+$cnt*$bsize) .
' -0.2" size="' . $widths[$i+1] . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[$i])) . '"/>' . LF;
}
}
}
// add links
$xml .= '<format style="' . $style['HEADER'][0]['TEXTSTYLE'][0] . '"/>' . LF;
$xml .= '<label pos="-' . ($widths[0]*0.25) . ' -' . (0.36+($square?0.1:0)+$hsize+$lines*$bsize) .
' -0.2" size="' . ($widths[0]/2) . ' ' . $hsize .
'" halign="center" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars($links[2]) . '"/>' . LF;
$xml .= '<label pos="-' . ($widths[0]*0.75) . ' -' . (0.36+($square?0.1:0)+$hsize+$lines*$bsize) .
' -0.2" size="' . ($widths[0]/2) . ' ' . $hsize .
'" halign="center" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars($links[3]) . '"/>' . LF;
// add button (action "0" = close) & footer
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.35+($square?0.1:0)+2*$hsize+$lines*$bsize) .
' -0.2" size="0.06 0.06" halign="center" style="Icons64x64_1" substyle="Close" action="0"/>' . LF;
$xml .= '</frame></manialink>';
$xml = str_replace('{#black}', $style['WINDOW'][0]['BLACKCOLOR'][0], $xml);
}
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $aseco->formatColors($xml), 0, true));
} // display_manialink_track
/**
* Displays a multipage ManiaLink window to a player
*
* $player: player object to send windows to
* ->msgs: array( array( $ptr, $header, $widths, $icon ),
* page1: array( $line1=array($col1, $col2, ...), $line2=array(...) ),
* 2: array( $line1=array($col1, $col2, ...), $line2=array(...) ),
* ... )
* $header: string
* $widths: array( $overal, $col1, $col2, ...)
* $icon : array( $style, $substyle {, $sizechg} )
*
* A $line with one $col will occupy the full window width,
* otherwise all $line's must have the same number of columns,
* as should $widths (+1 for $overall).
* line height=".046" is required minimum to prevent alignment glitches
* due to large characters in some cells.
* If $colX is an array, it contains the string and the button's action id.
*/
function display_manialink_multi($player) {
global $aseco;
// fake current page event
event_manialink($aseco, array(0, $player->login, 1));
} // display_manialink_multi
// called @ onPlayerManialinkPageAnswer
// Handles all ManiaLink main system responses,
// as well as multi-page ManiaLink windows
// [0]=PlayerUid, [1]=Login, [2]=Answer
function event_manialink($aseco, $answer) {
global $donation_values;
// leave actions outside -6 - 36 to other handlers
if ($answer[2] < -6 || $answer[2] > 36)
return;
// get player
$login = $answer[1];
$player = $aseco->server->players->getPlayer($login);
// check player answer
switch ($answer[2]) {
case 0:
// close main pop-up window
mainwindow_off($aseco, $login);
return;
// /stats fields
case -5:
// log clicked command
$aseco->console('player {1} clicked command "/active "', $player->login);
// /stats field Time Played
$command = array();
$command['author'] = $player;
chat_active($aseco, $command);
return;
case -6:
// log clicked command
$aseco->console('player {1} clicked command "/top100 "', $player->login);
// /stats field Server Rank
$command = array();
$command['author'] = $player;
chat_top100($aseco, $command);
return;
case 5:
// log clicked command
$aseco->console('player {1} clicked command "/toprecs "', $player->login);
// /stats field Records
$command = array();
$command['author'] = $player;
chat_toprecs($aseco, $command);
return;
case 6:
// log clicked command
$aseco->console('player {1} clicked command "/topwins "', $player->login);
// /stats field Races Won
$command = array();
$command['author'] = $player;
chat_topwins($aseco, $command);
return;
// Records panel fields
case 7:
// log clicked command
$aseco->console('player {1} clicked command "/topsums "', $player->login);
// records panel PB field
$command = array();
$command['author'] = $player;
chat_topsums($aseco, $command);
return;
case 8:
// log clicked command
$aseco->console('player {1} clicked command "/recs "', $player->login);
// records panel Local field
$command = array();
$command['author'] = $player;
$command['params'] = '';
chat_recs($aseco, $command);
return;
case 9:
// log clicked command
$aseco->console('player {1} clicked command "/dedirecs "', $player->login);
// records panel Dedi field
$command = array();
$command['author'] = $player;
$command['params'] = '';
if (function_exists('chat_dedirecs')) chat_dedirecs($aseco, $command);
return;
case 10:
// log clicked command
$aseco->console('player {1} clicked command "/tmxrecs "', $player->login);
// records panel TMX field
$command = array();
$command['author'] = $player;
$command['params'] = '';
if (function_exists('chat_tmxrecs')) chat_tmxrecs($aseco, $command);
return;
// /list Env fields
case 11:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Stadium"', $player->login);
// /list Env field Stadium
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Stadium';
chat_list($aseco, $command);
return;
case 12:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Alpine"', $player->login);
// /list Env field Alpine
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Alpine';
chat_list($aseco, $command);
return;
case 13:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Bay"', $player->login);
// /list Env field Bay
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Bay';
chat_list($aseco, $command);
return;
case 14:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Coast"', $player->login);
// /list Env field Coast
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Coast';
chat_list($aseco, $command);
return;
case 15:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Island"', $player->login);
// /list Env field Island
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Island';
chat_list($aseco, $command);
return;
case 16:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Rally"', $player->login);
// /list Env field Rally
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Rally';
chat_list($aseco, $command);
return;
case 17:
// close main window because /list can take a while
mainwindow_off($aseco, $login);
// log clicked command
$aseco->console('player {1} clicked command "/list env:Speed"', $player->login);
// /list Env field Speed
$command = array();
$command['author'] = $player;
$command['params'] = 'env:Speed';
chat_list($aseco, $command);
return;
// Vote panel buttons/keys
case 18:
// log clicked command
$aseco->console('player {1} clicked command "/y "', $player->login);
// /y on chat-based vote
$command = array();
$command['author'] = $player;
chat_y($aseco, $command);
return;
case 19:
// log clicked command
$aseco->console('player {1} clicked command "/n " (ignored)', $player->login);
// /n on chat-based vote (ignored)
return;
case 20:
// log clicked command
$aseco->console('player {1} clicked command "/admin clearjukebox"', $player->login);
// close main window
mainwindow_off($aseco, $login);
// /jukebox display Clear Jukebox button
$command = array();
$command['author'] = $player;
$command['params'] = 'clearjukebox';
chat_admin($aseco, $command);
return;
// Admin panel buttons
case 21:
// log clicked command
$aseco->console('player {1} clicked command "/admin restartmap"', $player->login);
// admin panel ClipRewind button
$command = array();
$command['author'] = $player;
$command['params'] = 'restartmap';
chat_admin($aseco, $command);
return;
case 22:
// log clicked command
$aseco->console('player {1} clicked command "/admin endround"', $player->login);
// admin panel ClipPause button
$command = array();
$command['author'] = $player;
$command['params'] = 'endround';
chat_admin($aseco, $command);
return;
case 23:
// log clicked command
$aseco->console('player {1} clicked command "/admin nextmap"', $player->login);
// admin panel ClipPlay button
$command = array();
$command['author'] = $player;
$command['params'] = 'nextmap';
chat_admin($aseco, $command);
return;
case 24:
// log clicked command
$aseco->console('player {1} clicked command "/admin replaymap"', $player->login);
// admin panel Refresh button
$command = array();
$command['author'] = $player;
$command['params'] = 'replaymap';
chat_admin($aseco, $command);
return;
case 25:
// log clicked command
$aseco->console('player {1} clicked command "/admin pass"', $player->login);
// admin panel ArrowGreen button
$command = array();
$command['author'] = $player;
$command['params'] = 'pass';
chat_admin($aseco, $command);
return;
case 26:
// log clicked command
$aseco->console('player {1} clicked command "/admin cancel"', $player->login);
// admin panel ArrowRed button
$command = array();
$command['author'] = $player;
$command['params'] = 'cancel';
chat_admin($aseco, $command);
return;
case 27:
// log clicked command
$aseco->console('player {1} clicked command "/admin players live"', $player->login);
// admin panel Buddies button
$command = array();
$command['author'] = $player;
$command['params'] = 'players live';
chat_admin($aseco, $command);
return;
// Payment dialog buttons
case 28:
// log clicked command
$aseco->console('player {1} confirmed command "/admin pay"', $player->login);
admin_pay($aseco, $player->login, true);
return;
case 29:
// log clicked command
$aseco->console('player {1} cancelled command "/admin pay"', $player->login);
admin_pay($aseco, $player->login, false);
return;
// Donate panel buttons
case 30:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[0] . '"', $player->login);
// donate panel field 1
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[0];
chat_donate($aseco, $command);
return;
case 31:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[1] . '"', $player->login);
// donate panel field 2
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[1];
chat_donate($aseco, $command);
return;
case 32:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[2] . '"', $player->login);
// donate panel field 3
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[2];
chat_donate($aseco, $command);
return;
case 33:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[3] . '"', $player->login);
// donate panel field 4
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[3];
chat_donate($aseco, $command);
return;
case 34:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[4] . '"', $player->login);
// donate panel field 5
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[4];
chat_donate($aseco, $command);
return;
case 35:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[5] . '"', $player->login);
// donate panel field 6
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[5];
chat_donate($aseco, $command);
return;
case 36:
// log clicked command
$aseco->console('player {1} clicked command "/donate ' . $donation_values[6] . '"', $player->login);
// donate panel field 7
$command = array();
$command['author'] = $player;
$command['params'] = $donation_values[6];
chat_donate($aseco, $command);
return;
}
// Handle multi-page ManiaLink windows in all styles
// update page pointer
$tot = count($player->msgs) - 1;
switch ($answer[2]) {
case -4: $player->msgs[0][0] = 1; break;
case -3: $player->msgs[0][0] -= 5; break;
case -2: $player->msgs[0][0] -= 1; break;
case 1: break; // stay on current page
case 2: $player->msgs[0][0] += 1; break;
case 3: $player->msgs[0][0] += 5; break;
case 4: $player->msgs[0][0] = $tot; break;
}
// stay within boundaries
if ($player->msgs[0][0] < 1)
$player->msgs[0][0] = 1;
elseif ($player->msgs[0][0] > $tot)
$player->msgs[0][0] = $tot;
// get control variables
$ptr = $player->msgs[0][0];
$header = $player->msgs[0][1];
$widths = $player->msgs[0][2];
$icon = $player->msgs[0][3];
$style = $player->style;
// check for old TMN-style window
if (empty($style)) {
$tsp = 'B'; // 'F' = solid, '0' = invisible
$txt = '333' . $tsp; // dark grey
$bgd = 'FFF' . $tsp; // white
$spc = 'DDD' . $tsp; // light grey
// build manialink header
$xml = '<manialink id="1" posx="' . ($widths[0]/2) . '" posy="0.47">' .
'<background bgcolor="' . $bgd . '" bgborderx="0.01" bgbordery="0.01"/>' . LF .
'<format textsize="3" textcolor="' . $txt . '"/>' . LF;
// add header
$xml .= '<line><cell bgcolor="' . $spc . '" width="' . ($widths[0]-0.12) . '"><text> $o' . htmlspecialchars(validateUTF8String($header)) . '</text></cell>' .
'<cell bgcolor="' . $spc . '" width="0.12"><text halign="right">$n(' . $ptr . '/' . $tot . ')</text></cell></line>' . LF;
// add spacer
$xml .= '<format textsize="2" textcolor="' . $txt . '"/>' . LF;
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
// add lines with optional columns
foreach ($player->msgs[$ptr] as $line) {
$xml .= '<line height=".046">';
if (!empty($line)) {
if (count($line) > 1) {
for ($i = 0; $i < count($widths)-1; $i++) {
if (is_array($line[$i])) {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[$i+1] . '"><text action="' . $line[$i][1] . '"> $o' . htmlspecialchars(validateUTF8String($line[$i][0])) . '</text></cell>';
} else {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[$i+1] . '"><text> $o' . htmlspecialchars(validateUTF8String($line[$i])) . '</text></cell>';
}
}
} else {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text> $o' . htmlspecialchars(validateUTF8String($line[0])) . '</text></cell>';
}
} else { // spacer
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell>';
}
$xml .= '</line>' . LF;
}
// add spacer
$xml .= '<line><cell bgcolor="' . $bgd . '" width="' . $widths[0] . '"><text>$</text></cell></line>' . LF;
// add button(s)
$add5 = ($tot > 5);
$butw = ($widths[0] - ($add5 ? 0.22 : 0)) / 3;
$xml .= '<line height=".046">';
// check for preceding page(s), then Prev(5) button(s)
if ($ptr > 1) {
if ($add5)
$xml .= '<cell bgcolor="' . $bgd . '" width="0.11"><text halign="center" action="-3">$oPrev5</text></cell>';
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $butw . '"><text halign="center" action="-2">$oPrev</text></cell>';
} else {
if ($add5)
$xml .= '<cell bgcolor="' . $bgd . '" width="0.11"><text>$</text></cell>';
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $butw . '"><text>$</text></cell>';
}
// always a Close button
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $butw . '"><text halign="center" action="0">$oClose</text></cell>';
// check for succeeding page(s), then Next(5) button(s)
if ($ptr < $tot) {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $butw . '"><text halign="center" action="2">$oNext</text></cell>';
if ($add5)
$xml .= '<cell bgcolor="' . $bgd . '" width="0.11"><text halign="center" action="3">$oNext5</text></cell>';
} else {
$xml .= '<cell bgcolor="' . $bgd . '" width="' . $butw . '"><text>$</text></cell>';
if ($add5)
$xml .= '<cell bgcolor="' . $bgd . '" width="0.11"><text>$</text></cell>';
}
$xml .= '</line></manialink>';
} else { // TMF-style window
$hsize = $style['HEADER'][0]['TEXTSIZE'][0];
$bsize = $style['BODY'][0]['TEXTSIZE'][0];
$lines = count($player->msgs[$ptr]);
// fill up multipage windows
if ($tot > 1)
$lines = max($lines, count($player->msgs[1]));
// build manialink header & window
$xml = '<manialink id="1"><frame pos="' . ($widths[0]/2) . ' 0.47 0">' .
'<quad size="' . $widths[0] . ' ' . (0.11+$hsize+$lines*$bsize) .
'" style="' . $style['WINDOW'][0]['STYLE'][0] .
'" substyle="' . $style['WINDOW'][0]['SUBSTYLE'][0] . '"/>' . LF;
// add header
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -0.01 -0.1" size="' . ($widths[0]-0.02) . ' ' . $hsize .
'" halign="center" style="' . $style['HEADER'][0]['STYLE'][0] .
'" substyle="' . $style['HEADER'][0]['SUBSTYLE'][0] . '"/>' . LF;
if (is_array($icon)) {
$isize = $hsize;
if (isset($icon[2]))
$isize += $icon[2];
$xml .= '<quad pos="-0.055 -0.045 -0.2" size="' . $isize . ' ' . $isize .
'" halign="center" valign="center" style="' . $icon[0] . '" substyle="' . $icon[1] . '"/>' . LF;
$xml .= '<label pos="-0.10 -0.025 -0.2" size="' . ($widths[0]-0.25) . ' ' . $hsize .
'" halign="left" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($header)) . '"/>' . LF;
} else {
$xml .= '<label pos="-0.03 -0.025 -0.2" size="' . ($widths[0]-0.18) . ' ' . $hsize .
'" halign="left" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($header)) . '"/>' . LF;
}
$xml .= '<label pos="-' . ($widths[0]-0.02) . ' -0.025 -0.2" size="0.12 ' . $hsize .
'" halign="right" style="' . $style['HEADER'][0]['TEXTSTYLE'][0] .
'" text="$n(' . $ptr . '/' . $tot . ')"/>' . LF;
// add body
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.02+$hsize) .
' -0.1" size="' . ($widths[0]-0.02) . ' ' . (0.02+$lines*$bsize) .
'" halign="center" style="' . $style['BODY'][0]['STYLE'][0] .
'" substyle="' . $style['BODY'][0]['SUBSTYLE'][0] . '"/>' . LF;
// add lines with optional columns
$xml .= '<format style="' . $style['BODY'][0]['TEXTSTYLE'][0] . '"/>' . LF;
$cnt = 0;
foreach ($player->msgs[$ptr] as $line) {
$cnt++;
if (!empty($line)) {
if (count($line) > 1) {
for ($i = 0; $i < count($widths)-1; $i++) {
if (isset($line[$i])) {
// check for action button
if (is_array($line[$i])) {
$xml .= '<quad pos="-' . (0.015+array_sum(array_slice($widths,1,$i))) .
' -' . ($hsize-0.013+$cnt*$bsize) .
' -0.15" size="' . ($widths[$i+1]-0.03) . ' ' . ($bsize+0.005) .
'" halign="left" style="' . $style['BUTTON'][0]['STYLE'][0] .
'" substyle="' . $style['BUTTON'][0]['SUBSTYLE'][0] .
'" action="' . $line[$i][1] . '"/>' . LF;
$xml .= '<label pos="-' . (0.025+array_sum(array_slice($widths,1,$i))) .
' -' . ($hsize-0.008+$cnt*$bsize) .
' -0.2" size="' . ($widths[$i+1]-0.05) . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[$i][0])) . '"/>' . LF;
} else {
$xml .= '<label pos="-' . (0.025+array_sum(array_slice($widths,1,$i))) .
' -' . ($hsize-0.008+$cnt*$bsize) .
' -0.2" size="' . ($widths[$i+1]-0.05) . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[$i])) . '"/>' . LF;
}
}
}
} else {
$xml .= '<label pos="-0.025 -' . ($hsize-0.008+$cnt*$bsize) .
' -0.2" size="' . ($widths[0]-0.04) . ' ' . (0.02+$bsize) .
'" halign="left" style="' . $style['BODY'][0]['TEXTSTYLE'][0] .
'" text="' . htmlspecialchars(validateUTF8String($line[0])) . '"/>' . LF;
}
}
}
// add button(s) & footer
$add5 = ($tot > 5);
// check for preceding page(s), then First & Prev(5) button(s)
if ($ptr > 1) {
$first = '"ArrowFirst" action="-4"';
$prev5 = '"ArrowFastPrev" action="-3"';
$prev1 = '"ArrowPrev" action="-2"';
} else { // first page so dummy buttons
$first = '"StarGold"';
$prev5 = '"StarGold"';
$prev1 = '"StarGold"';
}
$xml .= '<quad pos="-0.04 -' . (0.045+$hsize+$lines*$bsize) .
' -0.2" size="0.055 0.055" halign="center" style="Icons64x64_1" substyle=' . $first . '/>' . LF;
if ($add5) {
$xml .= '<quad pos="-0.095 -' . (0.045+$hsize+$lines*$bsize) .
' -0.2" size="0.055 0.055" halign="center" style="Icons64x64_1" substyle=' . $prev5 . '/>' . LF;
}
$xml .= '<quad pos="-' . ($widths[0]*0.25) . ' -' . (0.045+$hsize+$lines*$bsize) .
' -0.2" size="0.055 0.055" halign="center" style="Icons64x64_1" substyle=' . $prev1 . '/>' . LF;
// always a Close button
$xml .= '<quad pos="-' . ($widths[0]/2) . ' -' . (0.04+$hsize+$lines*$bsize) .
' -0.2" size="0.06 0.06" halign="center" style="Icons64x64_1" substyle="Close" action="0"/>' . LF;
// check for succeeding page(s), then Next(5) & Last button(s)
if ($ptr < $tot) {
$next1 = '"ArrowNext" action="2"';
$next5 = '"ArrowFastNext" action="3"';
$last = '"ArrowLast" action="4"';
} else { // last page so dummy buttons
$next1 = '"StarGold"';
$next5 = '"StarGold"';
$last = '"StarGold"';
}
$xml .= '<quad pos="-' . ($widths[0]*0.75) . ' -' . (0.045+$hsize+$lines*$bsize) .
' -0.2" size="0.055 0.055" halign="center" style="Icons64x64_1" substyle=' . $next1 . '/>' . LF;
if ($add5) {
$xml .= '<quad pos="-' . ($widths[0]-0.095) . ' -' . (0.045+$hsize+$lines*$bsize) .
' -0.2" size="0.055 0.055" halign="center" style="Icons64x64_1" substyle=' . $next5 . '/>' . LF;
}
$xml .= '<quad pos="-' . ($widths[0]-0.04) . ' -' . (0.045+$hsize+$lines*$bsize) .
' -0.2" size="0.055 0.055" halign="center" style="Icons64x64_1" substyle=' . $last . '/>' . LF;
$xml .= '</frame></manialink>';
$xml = str_replace('{#black}', $style['WINDOW'][0]['BLACKCOLOR'][0], $xml);
}
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($player->login, $aseco->formatColors($xml), 0, false));
} // event_manialink
/**
* Displays a payment dialog
*
* $login : player login to send dialog to
* $server: server name for payment
* $label : payment label string
*/
function display_payment($aseco, $login, $server, $label) {
// build manialink
$xml = '<manialink id="1"><frame pos="0.5 0.15 0">' .
'<quad size="1.0 0.3" style="Bgs1" substyle="BgWindow3"/>' .
'<label pos="-0.04 -0.04 -0.2" textsize="2" text="$fffInitiating payment from server ' . $server . '$z $fff:"/>' .
'<label pos="-0.04 -0.08 -0.2" textsize="2" text="$fffLabel: ' . $label . '"/>' .
'<label pos="-0.04 -0.12 -0.2" textsize="2" text="$fffWould you like to pay?"/>' .
'<label pos="-0.27 -0.19 -0.2" halign="center" style="CardButtonMedium" text="Yes" action="28"/>' .
'<label pos="-0.73 -0.19 -0.2" halign="center" style="CardButtonMedium" text="No" action="29"/>' .
'</frame></manialink>';
//$aseco->console_text($xml);
// disable dialog once clicked
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, true));
} // display_payment
/**
* Closes main window
*
* $login: player login to close window for
*/
function mainwindow_off($aseco, $login) {
// close main window
$xml = '<manialink id="1"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // mainwindow_off
// called @ onEndRace
function allwindows_off($aseco, $data) {
if ($aseco->server->getGame() == 'TMF') {
// disable all pop-up windows and records & donate panels
$xml = '<manialinks><manialink id="1"></manialink><manialink id="4"></manialink><manialink id="6"></manialink></manialinks>';
$aseco->client->query('SendDisplayManialinkPage', $xml, 0, false);
}
} // allwindows_off
/**
* Displays a CheckPoints panel
*
* $login: player login(s) to send panel to
* $cp : CP number
* $diff : color+sign+diff
*/
function display_cpspanel($aseco, $login, $cp, $diff) {
// build manialink
$xml = '<manialink id="2"><frame posn="-7.9 -38.1 0">' .
'<quad sizen="16 4" style="Bgs1InRace" substyle="NavButton"/>' .
'<label posn="6.4 -0.7 1" sizen="6.0 4" textsize="3" textcolor="000" halign="right" text="CP' . $cp . ':"/>' .
'<label posn="6.8 -0.7 1" sizen="8.8 4" textsize="3" halign="left" text="$o' . $diff . '"/>' .
'</frame></manialink>';
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // display_cpspanel
/**
* Disables a CheckPoints panel
*
* $login: player login(s) to disable panel for
*/
function cpspanel_off($aseco, $login) {
$xml = '<manialink id="2"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // cpspanel_off
/**
* Disables all CheckPoints panels
*/
function allcpspanels_off($aseco) {
$xml = '<manialink id="2"></manialink>';
$aseco->client->query('SendDisplayManialinkPage', $xml, 0, false);
} // allcpspanels_off
/**
* Displays an Admin panel
*
* $player: player to send panel to
*/
function display_admpanel($aseco, $player) {
// build manialink
$xml = $player->panels['admin'];
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($player->login, $xml, 0, false));
} // display_admpanel
/**
* Disables an Admin panel
*
* $login: player login to disable panel for
*/
function admpanel_off($aseco, $login) {
$xml = '<manialink id="3"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // admpanel_off
/**
* Displays a Donate panel
*
* $player : player to send panel to
* $coppers: donation values
*/
function display_donpanel($aseco, $player, $coppers) {
// build manialink
$xml = $player->panels['donate'];
for ($i = 1; $i <= 7; $i++)
$xml = str_replace('%COP' . $i . '%', $coppers[$i-1], $xml);
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($player->login, $xml, 0, false));
} // display_donpanel
/**
* Disables a Donate panel
*
* $login: player login to disable panel for
*/
function donpanel_off($aseco, $login) {
$xml = '<manialink id="6"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // donpanel_off
/**
* Displays a Records panel
*
* $player: player to send panel to
* $pb : personal best
*/
function display_recpanel($aseco, $player, $pb) {
global $ml_records;
// build manialink
$xml = str_replace(array('%PB%', '%TMX%', '%LCL%', '%DED%'),
array($pb, $ml_records['tmx'], $ml_records['local'], $ml_records['dedi']),
$player->panels['records']);
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($player->login, $xml, 0, false));
} // display_recpanel
/**
* Disables a Records panel
*
* $login: player login to disable panel for
*/
function recpanel_off($aseco, $login) {
$xml = '<manialink id="4"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // recpanel_off
function setRecordsPanel($field, $value) {
global $ml_records;
$ml_records[$field] = $value;
} // setRecordsPanel
/**
* Displays a Vote panel
*
* $player : player to send panel to
* $yesstr : string for the Yes button
* $nostr : string for the No button
* $timeout: timeout for temporary panel (used only by /votepanel list)
*/
function display_votepanel($aseco, $player, $yesstr, $nostr, $timeout) {
// build manialink
$xml = str_replace(array('%YES%', '%NO%'),
array($yesstr, $nostr), $player->panels['vote']);
//$aseco->console_text($xml);
// disable panel once clicked
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($player->login, $xml, $timeout, true));
} // display_votepanel
/**
* Disables a Vote panel
*
* $login: player login to disable panel for
*/
function votepanel_off($aseco, $login) {
$xml = '<manialink id="5"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // votepanel_off
/**
* Disables all Vote panels
*/
function allvotepanels_off($aseco) {
$xml = '<manialink id="5"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPage', array($xml, 0, false));
} // allvotepanels_off
/**
* Displays the Message window
*
* $msgs : lines to be displayed
* $timeout: timeout for window in msec
*/
function display_msgwindow($aseco, $msgs, $timeout) {
$cnt = count($msgs);
$xml = '<manialink id="7"><frame posn="-49 43.5 0">' . LF .
'<quad sizen="93 ' . (1.5 + $cnt*2.5) . '" style="Bgs1" substyle="NavButton"/>' . LF;
$pos = -1;
foreach ($msgs as $msg) {
$xml .= '<label posn="1 ' . $pos . ' 1" sizen="91 1" style="TextRaceChat" text="' . htmlspecialchars(validateUTF8String($msg)) . '"/>' . LF .
$pos -= 2.5;
}
$xml .= '</frame></manialink>';
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPage', array($xml, $timeout, false));
} // display_msgwindow
/**
* Displays the /msglog button
*
* $login: player login to display button for
*/
function display_msglogbutton($aseco, $login) {
$xml = '<manialink id="8"><frame posn="-63.9 -33.5 0">' . LF .
'<quad sizen="1.65 1.65" style="Icons64x64_1" substyle="ArrowUp" action="7223"/>' . LF .
'</frame></manialink>';
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($login, $xml, 0, false));
} // display_msglogbutton
/**
* Displays a Scoreboard Stats panel
*
* $player : player to send panel to
* $rank : server rank
* $avg : record average
* $recs : records total
* $wins : wins total
* $play : session play time
* $dons : donations total
*/
function display_statspanel($aseco, $player, $rank, $avg, $recs, $wins, $play, $dons) {
// build manialink
$xml = str_replace(array('%RANK%', '%AVG%', '%RECS%', '%WINS%', '%PLAY%', '%DONS%'),
array($rank, $avg, $recs, $wins, $play, $dons), $aseco->statspanel);
//$aseco->console_text($xml);
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($player->login, $xml, 0, false));
} // display_votepanel
/**
* Disables all Scoreboard Stats panels
*
* called @ onNewChallenge
*/
function statspanels_off($aseco, $data) {
$xml = '<manialink id="9"></manialink>';
$aseco->client->addCall('SendDisplayManialinkPage', array($xml, 0, false));
} // statspanels_off
// called @ onNewChallenge
// Disables Automatic Scorepanel at start of track if $auto_scorepanel = off
function scorepanel_off($aseco, $data) {
global $auto_scorepanel;
if ($aseco->server->getGame() == 'TMF' && !$auto_scorepanel) {
setCustomUIField('scoretable', false);
// dummy ManiaLink to preserve custom_ui
$xml = '<manialinks><manialink id="0"><line></line></manialink>' .
getCustomUIBlock() . '</manialinks>';
$aseco->client->addCall('SendDisplayManialinkPage', array($xml, 0, false));
}
} // scorepanel_off
// called @ onEndRace
// Enables Automatic Scorepanel at end of track
function scorepanel_on($aseco, $data) {
if ($aseco->server->getGame() == 'TMF') {
setCustomUIField('scoretable', true);
// dummy ManiaLink to preserve custom_ui
$xml = '<manialinks><manialink id="0"><line></line></manialink>' .
getCustomUIBlock() . '</manialinks>';
$aseco->client->addCall('SendDisplayManialinkPage', array($xml, 0, false));
}
} // scorepanel_on
// called @ onBeginRound
// Disables Rounds Finishpanel at start of round if $rounds_finishpanel = off
function roundspanel_off($aseco) {
global $auto_scorepanel, $rounds_finishpanel;
// check for Rounds/Team/Cup modes
if ($aseco->server->gameinfo->mode == Gameinfo::RNDS ||
$aseco->server->gameinfo->mode == Gameinfo::TEAM ||
$aseco->server->gameinfo->mode == Gameinfo::CUP) {
// check whether to disable panel
if ($aseco->server->getGame() == 'TMF' && !$rounds_finishpanel) {
setCustomUIField('round_scores', false);
// dummy ManiaLink to preserve custom_ui
$xml = '<manialinks><manialink id="0"><line></line></manialink>' .
getCustomUIBlock() . '</manialinks>';
$aseco->client->addCall('SendDisplayManialinkPage', array($xml, 0, false));
}
}
} // roundspanel_off
// called @ onPlayerFinish
// Enables Rounds Finishpanel at player finish
function roundspanel_on($aseco, $finish_item) {
global $auto_scorepanel, $rounds_finishpanel;
// check for Rounds/Team/Cup modes
if ($aseco->server->gameinfo->mode == Gameinfo::RNDS ||
$aseco->server->gameinfo->mode == Gameinfo::TEAM ||
$aseco->server->gameinfo->mode == Gameinfo::CUP) {
// check whether panel was disabled
if ($aseco->server->getGame() == 'TMF' && !$rounds_finishpanel) {
setCustomUIField('round_scores', true);
// dummy ManiaLink to preserve custom_ui
$xml = '<manialinks><manialink id="0"><line></line></manialink>' .
getCustomUIBlock() . '</manialinks>';
$aseco->client->addCall('SendDisplayManialinkPageToLogin', array($finish_item->player->login, $xml, 0, false));
}
}
} // roundspanel_on
function setCustomUIField($field, $value) {
global $ml_custom_ui;
$ml_custom_ui[$field] = $value;
} // setCustomUIField
function getCustomUIBlock() {
global $ml_custom_ui;
return '<custom_ui>' .
'<notice visible="' . bool2text($ml_custom_ui['notice']) . '"/>' .
'<challenge_info visible="' . bool2text($ml_custom_ui['challenge_info']) . '"/>' .
'<net_infos visible="' . bool2text($ml_custom_ui['net_infos']) . '"/>' .
'<chat visible="' . bool2text($ml_custom_ui['chat']) . '"/>' .
'<checkpoint_list visible="' . bool2text($ml_custom_ui['checkpoint_list']) . '"/>' .
'<round_scores visible="' . bool2text($ml_custom_ui['round_scores']) . '"/>' .
'<scoretable visible="' . bool2text($ml_custom_ui['scoretable']) . '"/>' .
'<global visible="' . bool2text($ml_custom_ui['global']) . '"/>' .
'</custom_ui>';
} // getCustomUIBlock
?>