docker-tmserver/docker-xaseco/xaseco/plugins/plugin.matchsave.php

1371 lines
53 KiB
PHP

<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
// ffMod v1.4
// Original version by Sloth, via tm-forum.com
// Hack & Slash by AssemblerManiac
// Another Hack & Slash by (OoR-F)~fuckfish (http://fish.oorf.de) (with the help of XXX-Max and some code by Basti504)
// Formatting cleanup & TMF ManiaLink popups by Xymph
// TeamForce part and Excerpts of Teamchat and List stuff by XXX El Fuego, Thanks a lot for that one =)
// February 1st, 2007
// Forum: http://walesxxx.forumco.com
// Define the members of your team. Put logins of your team into the matchsave.xml to force them into main team
// Everyone else is forced into the challenging team (teamname also defined in xml file)
/* template file layout
// header
// {DATE} {TIME} {TRACK}
// <!-- Player Data Begin -> this tag not output to file
// whatever is here gets duplicated for each person in the race, ranked 1-n, where n = <max_player_count> in the matchsave.xml file
// {RANK} {NICK} {LOGIN} {TIME} {TEAM} {POINTS} are the reserved words
// <!-- Player Data End -> neither is this one
// footer, tots for each team
// <!-- Team Data Begin ->
// {TEAM} {POINTS}
// <!-- Team Data End ->
// any remaining data will be written to the file from here to the end
*/
// if you want the teamname to show up properly when someone connects, make sure this plugin is AFTER the localdatabase plugin
global $matchVersionNumber;
$matchVersionNumber = 'v1.4';
global $matchDebug;
$matchDebug = false;
global $MatchSettings, $teamForceTeams, $matchAdminCommands;
global $matchTeamNameColorsAllowed, $matchOthersCanScore, $matchTeamNameMaxLength;
$MatchSettings = array();
$teamForceTeams = array();
Aseco::registerEvent('onStartup', 'match_startup'); // checks for existence of 2 tables & creates if they don't exist
Aseco::registerEvent('onNewChallenge', 'match_newChallenge');
Aseco::registerEvent('onEndRace', 'match_endrace');
Aseco::registerEvent('onPlayerConnect', 'match_playerconnect');
Aseco::registerEvent('onPlayerDisconnect', 'match_playerdisconnect');
Aseco::addChatCommand('teamname', 'Set your team name OR help for more options');
Aseco::addChatCommand('team', 'Same as teamname');
Aseco::addChatCommand('tc', 'Send a chat message to your team only.');
Aseco::addChatCommand('standings', 'See current match standings');
Aseco::addChatCommand('match', 'admin only match commands');
addMatchChatCommand('start', 'start match');
addMatchChatCommand('start x', 'start match for x rounds');
addMatchChatCommand('start pl x', 'start match with pointlimit x');
addMatchChatCommand('end', 'end match, write results');
// disabled because redundant with /admin readtracklist command - Xymph
//addMatchChatCommand('load x', 'load playlist x');
addMatchChatCommand('list x', 'shows playlist(s) x');
addMatchChatCommand('on/off', 'plugin on/off');
addMatchChatCommand('others on/off', 'teamless players score points');
addMatchChatCommand('force x', '$nx=on/off: TeamForce on/off, x=random: set opponent name$m');
addMatchChatCommand('assign x y', 'force player with login x into team y');
addMatchChatCommand('teams', '$nshow teams ("/match players" shows teams and players)$m');
addMatchChatCommand('tc on/off', 'Teamchat on/off');
global $matchRunning, $matchRound, $matchTotalRounds, $matchPointLimit, $matchPoints,
$matchString, $matchTime, $matchAutoRestart, $betweenChallenges, $startedBetweenChallenges;
$matchRound = -1;
$matchTotalRounds = -1;
$matchTime = -1;
$matchPointLimit = -1;
$matchRunning = false;
$matchPoints = array();
$matchAutoRestart = false;
$betweenChallenges = false;
function addMatchChatCommand($name, $description) {
global $matchAdminCommands;
$i = count($matchAdminCommands);
$matchAdminCommands[$i] = array();
$matchAdminCommands[$i][0] = $name;
$matchAdminCommands[$i][1] = $description;
} // addMatchChatCommand
function getArrayFirstIndex($arr) {
if (!$arr) {
return false;
}
foreach ($arr as $key => $value)
return $key;
} // getArrayFirstIndex
/**
* Show help
*/
function showMatchHelp($player) {
global $aseco;
global $matchAdminCommands, $MatchSettings, $matchRunning, $matchRound, $matchTotalRounds,
$matchPointLimit, $matchPoints, $matchAutoRestart, $matchOthersCanScore, $matchVersionNumber;
$currentLeader = '';
if ($matchRunning) {
$runningMatch = 'Round '.$MatchSettings['col_window_highlite'].$matchRound;
if ($matchTotalRounds != -1)
$runningMatch .= ' '.$MatchSettings['col_window_default'].'of '.$MatchSettings['col_window_highlite'].$matchTotalRounds;
if ($matchPointLimit != -1)
$runningMatch .= ' '.$MatchSettings['col_window_default'].'- PL: '.$MatchSettings['col_window_highlite'].$matchPointLimit;
if ($matchAutoRestart)
$runningMatch .= ' '.$MatchSettings['col_window_special'].$MatchSettings['col_window_default'].'('.$MatchSettings['col_window_highlite'].'Auto'.$MatchSettings['col_window_default'].')$z';
$leader = getArrayFirstIndex($matchPoints);
if ($leader) {
$leader = LF.$MatchSettings['col_window_default'].'Leader: '.$MatchSettings['col_window_highlite'].$leader.' '.$MatchSettings['col_window_default'].'('.$MatchSettings['col_window_highlite'].$matchPoints[$leader].$MatchSettings['col_window_default'].')';
}
} else {
$runningMatch = $MatchSettings['col_window_highlite'].'none';
}
$matchStatus = '$f00OFF';
if ($MatchSettings['enable'])
$matchStatus = '$0f0ON';
$othersStatus = '$f00OFF';
if ($matchOthersCanScore)
$othersStatus = '$0f0ON';
$forceStatus = '$f00OFF';
if ($MatchSettings['teamForceEnabled'])
$forceStatus = '$0f0ON';
$tcStatus = '$f00OFF';
if ($MatchSettings['teamchatEnabled'])
$tcStatus = '$0f0ON';
if ($aseco->server->getGame() == 'TMN') {
$help = $MatchSettings['col_window_default'].'Matchsave MOD '.$matchVersionNumber.' by fuckfish'. LF;
$help .= $MatchSettings['col_window_separator'].'----------'.LF;
$help .= $MatchSettings['col_window_default'].'Plugin is: '.$matchStatus.$MatchSettings['col_window_separator'].' | '.
$MatchSettings['col_window_default'].'Others score: '.$othersStatus.$MatchSettings['col_window_separator'].' | '.
$MatchSettings['col_window_default'].'Force: '.$forceStatus.$MatchSettings['col_window_separator'].' | '.
$MatchSettings['col_window_default'].'TC: '.$tcStatus.$MatchSettings['col_window_separator'].LF;
$help .= $MatchSettings['col_window_default'].'Current match: '.$runningMatch.$leader.LF;
$help .= $MatchSettings['col_window_separator'].'----------'.LF;
$help .= $MatchSettings['col_window_default'].'Supported commands:' . LF;
$help .= $MatchSettings['col_window_hint'].'(TIP: use '.$MatchSettings['col_window_default']
.'/match auto '.$MatchSettings['col_window_hint'].'instead of '.$MatchSettings['col_window_default']
.'/match start '.$MatchSettings['col_window_hint'].'to automate matches)$z'.LF;
$padstg = $MatchSettings['col_window_highlite'].'... ';
if (!empty($matchAdminCommands)) {
foreach ($matchAdminCommands as $chat_command) {
$help .= $padstg . $chat_command[0] . ' '.$MatchSettings['col_window_default'] . $chat_command[1] . LF;
}
}
if (strlen($help) < 1025) {
$aseco->addCall('SendDisplayServerMessageToLogin', array($player->login, $help, 'OK', '', 0));
} else {
$help = substr($help, 0, 1024);
$aseco->addCall('SendDisplayServerMessageToLogin', array($player->login, $help, 'OK', '', 0));
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors('{#error}Help message exceeded valid length, please contact (OoR-F)~fuckfish via tm-forum.com.'), $player->login));
}
} elseif ($aseco->server->getGame() == 'TMF') {
$header = $MatchSettings['col_window_default'].'Matchsave MOD '.$matchVersionNumber.' by fuckfish';
$help = array();
$help[] = array($MatchSettings['col_window_default'].'Plugin is: '.$matchStatus.$MatchSettings['col_window_separator'].' | '.
$MatchSettings['col_window_default'].'Others score: '.$othersStatus.$MatchSettings['col_window_separator'].' | '.
$MatchSettings['col_window_default'].'Force: '.$forceStatus.$MatchSettings['col_window_separator'].' | '.
$MatchSettings['col_window_default'].'TC: '.$tcStatus.$MatchSettings['col_window_separator']);
$help[] = array($MatchSettings['col_window_default'].'Current match: '.$runningMatch.$leader);
$help[] = array($MatchSettings['col_window_separator'].'----------');
$help[] = array($MatchSettings['col_window_default'].'Supported commands:');
$help[] = array($MatchSettings['col_window_hint'].'(TIP: use '.$MatchSettings['col_window_default']
.'/match auto '.$MatchSettings['col_window_hint'].'instead of '.$MatchSettings['col_window_default']
.'/match start '.$MatchSettings['col_window_hint'].'to automate matches)$z');
$padstg = $MatchSettings['col_window_highlite'].'... ';
if (!empty($matchAdminCommands)) {
foreach ($matchAdminCommands as $chat_command) {
$help[] = array($padstg . $chat_command[0] . ' '.$MatchSettings['col_window_default'] . $chat_command[1]);
}
}
// display ManiaLink message
display_manialink($player->login, $header, array('Icons128x128_1', 'ProfileAdvanced', 0.02), $help, array(1.0), 'OK');
}
} // showMatchHelp
function matchDisplayStatus($aseco, $msg) {
global $MatchSettings;
$message = $MatchSettings['col_chat_highlite'].'>> '.$MatchSettings['col_chat_plugin'].'[Matchsave] '.$MatchSettings['col_chat_default'].$msg;
$aseco->addCall('ChatSendServerMessage', array($aseco->formatColors($message)));
} // matchDisplayStatus
// called @ onNewChallenge
function match_newChallenge($aseco, $challenge) {
global $matchRunning, $matchRound, $matchTotalRounds, $MatchSettings, $matchPointLimit,
$matchPoints, $matchAutoRestart, $startedBetweenChallenges, $betweenChallenges;
$betweenChallenges = false;
if ($MatchSettings['enable']) {
if ($matchRunning) {
if ($matchRound == 1 && $startedBetweenChallenges) {
$startedBetweenChallenges = false;
} else {
$matchRound++;
}
$leader = getArrayFirstIndex($matchPoints);
if (($matchRound > $matchTotalRounds && $matchTotalRounds != -1) || ($leader && $matchPointLimit != -1 && $matchPointLimit <= $matchPoints[$leader])) {
matchStop($aseco);
} else {
$autoText = '';
if ($matchAutoRestart)
$autoText = 'Auto';
$msg = 'Current '.$autoText.'Match: Round '.$MatchSettings['col_chat_highlite'].$matchRound.$MatchSettings['col_chat_default'];
if ($matchTotalRounds != -1) {
$msg .= ' of '.$MatchSettings['col_chat_highlite'].$matchTotalRounds;
}
if ($matchPointLimit != -1) {
$msg .= ' (Pointlimit '.$MatchSettings['col_chat_highlite'].$matchPointLimit.$MatchSettings['col_chat_default'].')';
}
matchDisplayStatus($aseco, $msg);
}
}
}
} // match_newChallenge
function matchGetCenteredLines($lines) {
$maxlen = 0;
for ($i = 0; $i < count($lines); $i++) {
$length = strlen(stripColors($lines[$i]));
if ($length > $maxlen)
$maxlen = $length;
}
for ($i = 0; $i < count($lines); $i++) {
while (strlen(stripColors($lines[$i])) < $maxlen) {
$lines[$i] = ' '.$lines[$i].' ';
}
}
return $lines;
} // matchGetCenteredLines
function matchStart($aseco, $admin, $numRounds, $pointLimit, $autoRestart) {
global $matchRunning, $betweenChallenges, $startedBetweenChallenges, $matchRound, $matchTotalRounds,
$matchTime, $matchPointLimit, $matchString, $matchPoints, $MatchSettings, $matchAutoRestart;
if ($numRounds == -1) $numRounds = '';
if ($pointLimit == -1) $pointLimit = '';
$status = '';
$statustpl = array();
$autoText = '';
if ($autoRestart)
$autoText = 'Auto';
$statustpl[] = $autoText.'Match starts now!';
$statustpl[] = $autoText.'Match for '.$MatchSettings['col_chat_highlite'].'{NUMROUNDS} '.$MatchSettings['col_chat_default'].'rounds starts now!';
$statustpl[] = $autoText.'Match starts now! Pointlimit is '.$MatchSettings['col_chat_highlite'].'{POINTLIMIT}'.$MatchSettings['col_chat_default'].'.';
if (!$matchRunning) {
$matchRound = 1;
if ($numRounds) {
if (is_numeric($numRounds)) {
$matchTotalRounds = $numRounds;
$status = str_replace('{NUMROUNDS}', $numRounds, $statustpl[1]);
}
elseif ($numRounds == 'pl') {
if ($pointLimit) {
if (is_numeric($pointLimit)) {
$matchPointLimit = $pointLimit;
$status = str_replace('{POINTLIMIT}', $pointLimit, $statustpl[2]);
} else {
if ($admin) $aseco->addCall('ChatSendToLogin', array($aseco->formatColors('{#error}{#message}'.$pointLimit.' {#error}is not a number. Normal match started'), $admin->login));
$status = $statustpl[0];
}
} else {
if ($admin) $aseco->addCall('ChatSendToLogin', array($aseco->formatColors('{#error}You did not specify the pointlimit. Normal match started'), $admin->login));
$status = $statustpl[0];
}
}
else {
if ($admin) $aseco->addCall('ChatSendToLogin', array($aseco->formatColors('{#error}{#message}'.$numRounds.' {#error}is not a number. Normal match started'), $admin->login));
$status = $statustpl[0];
}
} else {
$status = $statustpl[0];
}
matchDisplayStatus($aseco, $status);
$matchRunning = true;
$matchPoints = array();
$matchString = '';
$matchTime = time();
$matchAutoRestart = $autoRestart;
$startedBetweenChallenges = $betweenChallenges;
} else {
if ($admin) $aseco->addCall('ChatSendToLogin', array($aseco->formatColors('{#error}There is already a match running!'), $admin->login));
}
} // matchStart
function chat_standings($aseco, $command) {
global $matchRunning;
$player = $command['author'];
if ($matchRunning)
showStandings($aseco, 'Current Match Standings', $player, 29);
} // chat_standings
function chat_tc($aseco, $command) {
global $MatchSettings;
$author = $command['author'];
$msg = $command['params'];
$team = $author->teamname;
if ($team) {
if ($MatchSettings['teamchatEnabled']) {
$msg = $aseco->formatColors($MatchSettings['teamchatPrefix'].'$g$m ['.$author->nickname.'$g$m] '.$msg);
foreach ($aseco->server->players->player_list as $player) {
if ($player->teamname == $team || ($aseco->allowAbility($player, 'chat_tc_listen') && $MatchSettings['bigBrother'])) {
$aseco->addCall('ChatSendServerMessageToLogin', array($msg, $player->login));
}
}
} else {
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors('{#error}Teamchat is currently disabled by an Admin.'), $author->login));
}
} else {
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors('{#error}You belong to no team; to join, type $fff/team yourteamname.'), $author->login));
}
} // chat_tc
function showStandings($aseco, $headline, $player, $separatorLength = 17) {
global $MatchSettings, $matchPoints;
if ($aseco->server->getGame() == 'TMN') {
$result = array();
$result[] = $MatchSettings['col_window_default'].$headline;
$sep = '';
for ($i = 0; $i < $separatorLength; $i++) $sep .= '-';
$result[] = $MatchSettings['col_window_separator'].$sep;
if (!$player->teamname) {
$result[] = str_replace('{#server}', '$000', '$n'.$MatchSettings['hlpNoTeam'][0].LF);
}
$count = 1;
foreach ($matchPoints as $key => $value) {
if ($count <= 15) {
$result[] = $MatchSettings['col_window_default'].$count++.'. '.$MatchSettings['col_window_highlite'].$key.' $z'.$MatchSettings['col_window_default'].'('.$MatchSettings['col_window_highlite'].$value.$MatchSettings['col_window_default'].')';
}
}
$result = implode(LF, $result);
$toReplace = $player->teamname;
if (!$toReplace)
$toReplace = 'OTHERS';
$formattedMsg = $aseco->formatColors(str_replace(' '.$MatchSettings['col_window_highlite'].$toReplace.' ', ' '.$MatchSettings['col_window_highlite_team'].$toReplace.' ', $result));
$aseco->addCall('SendDisplayServerMessageToLogin', array($player->login, $formattedMsg, 'OK', '', intval($MatchSettings['resultTimeout'])));
} elseif ($aseco->server->getGame() == 'TMF') {
$header = $MatchSettings['col_window_default'].$headline;
$result = array();
if (!$player->teamname) {
$result[] = array(str_replace('{#server}', '$000', '$n'.$MatchSettings['hlpNoTeam'][0]));
}
$count = 1;
foreach ($matchPoints as $key => $value) {
if ($count <= 15) {
$result[] = array($MatchSettings['col_window_default'].$count++.'. '.$MatchSettings['col_window_highlite'].$key.' $z'.$MatchSettings['col_window_default'].'('.$MatchSettings['col_window_highlite'].$value.$MatchSettings['col_window_default'].')');
}
}
$toReplace = $player->teamname;
if (!$toReplace)
$toReplace = 'OTHERS';
$formattedMsg = str_replace(' '.$MatchSettings['col_window_highlite'].$toReplace.' ', ' '.$MatchSettings['col_window_highlite_team'].$toReplace.' ', $result);
// display ManiaLink message
display_manialink($player->login, $header, array('BgRaceScore2', 'Podium'), $formattedMsg, array(0.8), 'OK');
}
} // showStandings
function matchStop($aseco, $manually = false) {
global $matchRunning, $matchRound, $matchTotalRounds, $MatchSettings, $matchTime,
$matchString, $matchPointLimit, $matchPoints, $matchAutoRestart;
if ($MatchSettings['enable']) {
if ($manually) {
$matchAutoRestart = false;
}
foreach ($aseco->server->players->player_list as $player) {
showStandings($aseco, 'Match Results', $player);
}
$numRounds = $matchTotalRounds;
$pointLimit = $matchPointLimit;
if ($pointLimit > 0)
$numRounds = 'pl';
$autoRestart = $matchAutoRestart;
$matchRound = -1;
$matchTotalRounds = -1;
$matchPointLimit = -1;
$matchPoints = array();
$matchRunning = false;
$matchTime = -1;
$fp = fopen($MatchSettings['outfilematch'], 'w');
fwrite($fp, $matchString);
fclose($fp);
$autoText = '';
if ($matchAutoRestart)
$autoText = 'Auto';
matchDisplayStatus($aseco, $autoText.'Match ended, scores saved.');
if ($matchAutoRestart) {
matchStart($aseco, null, $numRounds, $pointLimit, $autoRestart);
}
}
} // matchStop
// This is where all the Setting-Magic happens
function chat_match($aseco, $command) {
global $matchRunning, $matchRound, $matchTotalRounds, $matchTime, $matchPointLimit,
$matchPoints, $matchString, $MatchSettings, $matchDebug;
$admin = $command['author'];
// check if chat command was used by an admin
if (!$matchDebug) {
if (!$aseco->allowAbility($admin, 'chat_match')) {
// writes warning in console
$aseco->console($admin->login . ' tried to use match chat command (no permission!)');
// sends chat message
$message = $aseco->getChatMessage('NO_ADMIN');
$aseco->addCall('ChatSendToLogin', array($aseco->formatColors($message), $admin->login));
return false;
}
}
// split params into array
$arglist = explode(' ', $command['params'], 2);
$command['params'] = explode(' ', $command['params']);
$cmdcount = count($arglist);
/**
* enable or disable the matchsave plugin
*/
if (strtolower($command['params'][0]) == 'on' || strtolower($command['params'][0]) == 'off') {
if (strtolower($command['params'][0]) == 'on') {
$MatchSettings['enable'] = true;
} else {
$MatchSettings['enable'] = false;
}
matchDisplayStatus($aseco, 'Plugin is now '.$MatchSettings['col_chat_highlite'].strtoupper($command['params'][0]));
/**
* activate or disactivate the score tracking of teamless players
*/
} elseif ($command['params'][0] == 'others' && (strtolower($command['params'][1]) == 'on' || strtolower($command['params'][1]) == 'off')) {
global $matchOthersCanScore;
if (strtolower($command['params'][1]) == 'on') {
$matchOthersCanScore = true;
} else {
$matchOthersCanScore = false;
}
matchDisplayStatus($aseco, 'Players without team get scores: '.$MatchSettings['col_chat_highlite'].strtoupper($command['params'][1]));
/**
* activate or disactivate the score tracking of teamless players
*/
} elseif ($command['params'][0] == 'force' && $command['params'][1] != '') {
$string = $command['params'][1];
if ($string == 'on' || $string == 'off') {
if ($string == 'on') {
$MatchSettings['teamForceEnabled'] = true;
// executeTeamForce($aseco);
} else {
$MatchSettings['teamForceEnabled'] = false;
}
matchDisplayStatus($aseco, 'Teamforce is now: '.$MatchSettings['col_chat_highlite'].strtoupper($command['params'][1]));
} else {
foreach ($aseco->server->players->player_list as $player) {
if ($player->teamname == $MatchSettings['defaultTeam']) {
$player->teamname = $string;
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors($MatchSettings['col_chat_highlite'] .'>'.$MatchSettings['col_chat_plugin'].' Your Teamname was changed to '.$MatchSettings['col_chat_highlite'] . $string), $player->login));
} else {
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors($MatchSettings['col_chat_highlite'] .'>'.$MatchSettings['col_chat_plugin'].' Default Teamname is now: '.$MatchSettings['col_chat_highlite'] . $string), $player->login));
}
}
$MatchSettings['defaultTeam'] = $string;
}
/**
* activate or disactivate the teamchat
*/
} elseif ($command['params'][0] == 'tc' && $command['params'][1] != '') {
$string = $command['params'][1];
if ($string == 'on' || $string == 'off') {
if ($string == 'on') {
$MatchSettings['teamchatEnabled'] = true;
} else {
$MatchSettings['teamchatEnabled'] = false;
}
matchDisplayStatus($aseco, 'Teamchat is now: '.$MatchSettings['col_chat_highlite'].strtoupper($command['params'][1]));
}
/**
* start a match (with our without a specified length)
*/
} elseif ($command['params'][0] == 'start' || $command['params'][0] == 'auto') {
$numRounds = $command['params'][1];
$pointLimit = $command['params'][2];
$autoRestart = false;
if ($command['params'][0] == 'auto')
$autoRestart = true;
matchStart($aseco, $admin, $numRounds, $pointLimit, $autoRestart);
/**
* stop or end a match and display the results
*/
} elseif ($command['params'][0] == 'end') {
if ($matchRunning) {
matchStop($aseco, true);
}
/**
* load playlist txt file
*/
/* disabled because redundant with /admin readtracklist command - Xymph
} elseif ($command['params'][0] == 'load' && $command['params'][1] != '') {
$filename = $command['params'][1];
if (!strstr($filename, '.txt')) {
$filename .= '.txt';
}
$filepath = $MatchSettings['playlistDir'] . '/' . $filename;
//CHECK IF FILE EXISTS
//YES ...
if (file_exists($filepath)) {
//CONSOLE MESSAGE ADD
$aseco->console('admin '.$command['author']->login.' loads new Playlist: '.$filename);
//SUCCESS MESSAGE
$rtn = $aseco->client->query('LoadMatchSettings', $filepath);
if (!$rtn) {
trigger_error('[' . $aseco->client->getErrorCode() . '] LoadMatchSettings - ' . $aseco->client->getErrorMessage(), E_USER_WARNING);
$message = '{#server}> {#error}Error reading {#highlite}$i '.$filepath.' {#error}!';
} else {
$cnt = $aseco->client->getResponse();
$message = 'Successfully set new Playlist: '.$MatchSettings['col_chat_highlite'].$filename.$MatchSettings['col_chat_default'].' with '.$MatchSettings['col_chat_highlite'].$cnt.$MatchSettings['col_chat_default'].' tracks';
}
$aseco->addCall('ChatSendToLogin', array($aseco->formatColors($message), $admin->login));
//NO ...
} else {
//CONSOLE MESSAGE ADD
$aseco->console('admin '.$command['author']->login.' tried to load unavailable Playlist.');
//SENDS A FAILED MESSAGE
$aseco->addCall('ChatSendToLogin', array($aseco->formatColors('{#error}Playlist file unavailable'), $admin->login));
}
disabled */
/**
* show a list of the available playlists
*/
} elseif ($command['params'][0] == 'list') {
$dir = $MatchSettings['playlistDir'] . '//';
$tmp = array();
$tmp = scandir($dir);
$files = array();
$search = '';
if ($command['params'][1])
$search = $command['params'][1];
foreach ($tmp as $file) {
if (stristr($file, '.txt'))
$files[] = str_ireplace('.txt', '', $file);
}
showPlaylistList($aseco, $admin, $files, $search);
/**
* Show Lists of teams and players
*/
} elseif ($command['params'][0] == 'teams' || $command['params'][0] == 'players') {
$search = '';
if ($command['params'][0] == 'players')
$full = true;
showTeamList($aseco, $admin, $full);
/**
* force player into a team
*/
} elseif ($command['params'][0] == 'assign' && $command['params'][1] != '') {
$victim = null;
foreach ($aseco->server->players->player_list as $player) {
if ($player->login == $command['params'][1])
$victim = $player;
}
if ($victim) {
$victim->teamname = $command['params'][2];
$msgend = ' To change type "'.$MatchSettings['col_chat_default'].'/teamname yourteamname$fff$m".';
$msgend = $aseco->formatColors($msgend);
$message = 'An Admin assigned <insert> to team '.$MatchSettings['col_chat_highlite'].$victim->teamname.'$fff$m.';
$message = $aseco->formatColors($message);
$message2 = 'An Admin cleared <insert> teamname.';
$message2 = $aseco->formatColors($message2);
if ($victim->teamname) {
foreach ($aseco->server->players->player_list as $player) {
if ($player->login == $victim->login) {
$msg = str_replace('<insert>', 'you', $message) . $msgend;
} else {
$msg = str_replace('<insert>', stripColors($victim->nickname), $message);
}
$aseco->addCall('ChatSendServerMessageToLogin', array($msg, $player->login));
}
} else {
foreach ($aseco->server->players->player_list as $player) {
if ($player->login == $victim->login) {
$msg = str_replace('<insert>', 'your', $message2).$msgend;
} else {
$msg = str_replace('<insert>', stripColors($victim->nickname)."'s", $message2);
}
$aseco->addCall('ChatSendServerMessageToLogin', array($msg, $player->login));
}
}
} else {
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors('{#error}'.$command['params'][1].' is not a valid login.'), $admin->login));
}
/**
* display help
*/
} else {
showMatchHelp($admin);
}
} // chat_match
function showListWindow($aseco, $player, $messageLines, $headline) {
global $MatchSettings;
if ($aseco->server->getGame() == 'TMN') {
$msg = '';
$lines = 0;
$player->msgs = array();
$player->msgs[0] = 1;
foreach ($messageLines as $message) {
$msg .= $message . LF;
if (++$lines > 9) {
$player->msgs[] = $MatchSettings['col_window_default'].$headline.LF.$MatchSettings['col_window_separator'].'---------------------'.$MatchSettings['col_window_default'].LF. $msg;
$lines = 0;
$msg = '';
}
}
if ($msg != '') {
$player->msgs[] = $MatchSettings['col_window_default'].$headline.LF.$MatchSettings['col_window_separator'].'---------------------'.$MatchSettings['col_window_default'].LF. $msg;
}
if (count($player->msgs) == 2) {
$aseco->addCall('SendDisplayServerMessageToLogin', array($player->login, $player->msgs[1], 'Ok', '', 0));
}
elseif (count($player->msgs) > 2) {
$aseco->addCall('SendDisplayServerMessageToLogin', array($player->login, $player->msgs[1], 'Close', 'Next', 0));
} // else == 1, no message
} elseif ($aseco->server->getGame() == 'TMF') {
$head = $MatchSettings['col_window_default'].$headline;
$msg = array();
$lines = 0;
$player->msgs = array();
$player->msgs[0] = array(1, $head, array(0.8), array('Icons64x64_1', 'GenericButton'));
foreach ($messageLines as $message) {
$msg[] = array($message);
if (++$lines > 14) {
$player->msgs[] = $msg;
$lines = 0;
$msg = array();
}
}
if (!empty($msg)) {
$player->msgs[] = $msg;
}
// display ManiaLink message
display_manialink_multi($player);
}
} // showListWindow
function showTeamList($aseco, $player, $full) {
global $MatchSettings;
$teams = array();
$teamsMembers = array();
foreach ($aseco->server->players->player_list as $playa) {
$teams[$playa->teamname]++;
$teamsMembers[$playa->teamname][] = $playa;
}
arsort($teams);
if (!$full) {
$header = 'Num .. Teamname';
} else {
$header = 'Team .. Nickname (Login)';
}
$helper = array();
foreach ($teams as $team => $members) {
if (!$full) {
$members = str_pad($members, 2, '0', STR_PAD_LEFT);
if ($team == '') $team = 'OTHERS';
$helper[] = '$g$m '.$members.' .. '.$team;
} else {
$mbrs = $teamsMembers[$team];
if ($team == '') $team = 'OTHERS';
foreach ($mbrs as $mbr) {
$helper[] = '$g$m'.$team.'$g$m .. '.$mbr->nickname.'$g$m ('.$mbr->login.'$g$m)';
}
}
}
showListWindow($aseco, $player, $helper, $header);
} // showTeamList
function showPlaylistList($aseco, $player, $files, $search) {
$helper = array();
foreach ($files as $file) {
if (!$search || strstr($file, $search))
$helper[] = $file;
}
showListWindow($aseco, $player, $helper, 'Available Playlists');
} // showPlaylistList
function checkTables() {
$query = 'CREATE TABLE IF NOT EXISTS `match_main` (
`ID` mediumint(9) NOT NULL auto_increment,
`trackID` mediumint(9) NOT NULL default 0,
`dttmrun` timestamp NOT NULL default Now(),
PRIMARY KEY (`ID`)
) ENGINE=MyISAM';
mysql_query($query);
$query = 'CREATE TABLE IF NOT EXISTS `match_details` (
`matchID` mediumint(9) NOT NULL,
`playerID` mediumint(9) NOT NULL default 0,
`teamname` varchar(40),
`points` tinyint default 0,
`score` mediumint(9),
PRIMARY KEY (`matchID`,`playerID`)
) ENGINE=MyISAM';
mysql_query($query);
$tables = array();
$res = mysql_query('SHOW TABLES');
while ($row = mysql_fetch_row($res))
$tables[] = $row[0];
mysql_free_result($res);
$check = array();
$check[1] = in_array('match_main', $tables);
$check[2] = in_array('match_details', $tables);
// add 'teamname' column if not yet done
$res = mysql_query('SELECT teamname FROM players limit 1');
if ($res == false) {
if (mysql_errno() == 1054) {
mysql_query('ALTER TABLE players ADD TeamName char(60)');
}
} else {
mysql_free_result($res);
}
return ($check[1] && $check[2]);
} // checkTables
function executeTeamForce($aseco) {
global $MatchSettings;
foreach ($aseco->server->players->player_list as $player) {
$team = $MatchSettings['defaultTeam'];
if ($teamForceTeams[$player->login]) $team = $teamForceTeams[$player->login];
$player->teamname = $team;
foreach ($aseco->server->players->player_list as $recipient) {
if ($recipient->login == $player->login) {
$msg = $MatchSettings['col_chat_plugin'].'You have been auto-assigned to team '.$MatchSettings['col_chat_highlite']. $team.LF. $MatchSettings['col_chat_default']. 'Type '.$MatchSettings['col_chat_highlite'].'/team yourteamname '.$MatchSettings['col_chat_default'].'to change your team.';
} else {
$msg = $MatchSettings['col_chat_highlite'].stripColors($player->nickname) . $MatchSettings['col_chat_plugin'].' has been auto-assigned to team '.$MatchSettings['col_chat_highlite']. $team;
}
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors($msg), $recipient->login));
}
}
} // executeTeamForce
// called @ onPlayerConnect
function match_playerconnect($aseco, $player) {
global $MatchSettings, $teamForceTeams;
$teamname = '';
if ($MatchSettings['teamForceEnabled']) {
if ($teamForceTeams[$player->login]) {
$teamname = $teamForceTeams[$player->login];
$player->teamname = $teamname;
} else {
$query = 'SELECT teamname FROM players WHERE Login=' . quotedString($player->login) . ' AND Game=' . quotedString($aseco->server->getGame());
$result = mysql_query($query);
if (mysql_num_rows($result) > 0) {
$teamname = mysql_result($result, 0, 'teamname');
}
mysql_free_result($result);
$player->teamname = $teamname;
}
foreach ($aseco->server->players->player_list as $recipient) {
if ($recipient->login == $player->login) {
$msg = $MatchSettings['col_chat_plugin'].'You have been auto-assigned to team '.$MatchSettings['col_chat_highlite']. $teamname.LF. $MatchSettings['col_chat_default']. 'Type '.$MatchSettings['col_chat_highlite'].'/team yourteamname '.$MatchSettings['col_chat_default'].'to change your team.';
} else {
$msg = $MatchSettings['col_chat_highlite'].stripColors($player->nickname) . $MatchSettings['col_chat_plugin'].' has been auto-assigned to team '.$MatchSettings['col_chat_highlite']. $teamname;
}
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors($msg), $recipient->login));
}
} else {
if ($player->teamname == '') {
$query = 'SELECT teamname FROM players WHERE Login=' . quotedString($player->login) . ' AND Game=' . quotedString($aseco->server->getGame());
$result = mysql_query($query);
if (mysql_num_rows($result) > 0) {
$teamname = mysql_result($result, 0, 'teamname');
}
mysql_free_result($result);
$player->teamname = $teamname;
}
}
if ($MatchSettings['enable'] && $player->teamname != '') {
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors($MatchSettings['col_chat_highlite'] .'>'.$MatchSettings['col_chat_plugin'].' Your Team is currently '.$MatchSettings['col_chat_highlite'] . $player->teamname), $player->login));
}
} // match_playerconnect
// called @ onPlayerDisconnect
function match_playerdisconnect($aseco, $player) {
if ($player->teamname != '') {
$query = 'SELECT teamname FROM players WHERE Login=' . quotedString($player->login) . ' AND Game=' . quotedString($aseco->server->getGame());
$result = mysql_query($query);
if (mysql_num_rows($result) > 0) {
$teamname = mysql_result($result, 0, 'teamname');
if ($teamname == '') {
$sql = 'UPDATE players SET teamname=' . quotedString($player->teamname) . ' WHERE login=' . quotedString($player->login);
mysql_query($sql);
}
}
mysql_free_result($result);
}
} // match_playerdisconnect
// called @ onStartup
function match_startup($aseco) {
global $MatchSettings, $matchVersionNumber;
$aseco->addCall('ChatSendServerMessage', array('Now Loading Matchsave ffMod '.$matchVersionNumber));
match_loadsettings();
if ($MatchSettings['savedb']) {
checkTables();
}
} // match_startup
function chat_team($aseco, $command) {
chat_teamname($aseco, $command);
} // chat_team
function chat_teamname($aseco, $command) {
global $matchTeamNameColorsAllowed, $matchOthersCanScore, $matchTeamNameMaxLength, $MatchSettings;
$player = $command['author'];
$teamname = $command['params'];
$oldTeamName = $player->teamname;
if ($teamname == 'help' || trim($teamname) == '') {
if ($aseco->server->getGame() == 'TMN') {
if ($player->teamname) {
$msg = 'You currently belong to team '.$MatchSettings['col_window_highlite_team'].$player->teamname.'$z'.LF;
$msg .= str_replace('{#server}', '$000', '$n'.$MatchSettings['hlp'][0].'$z'.LF);
} else {
$msg = 'You currently belong to no team.'.LF;
$msg .= str_replace('{#server}', '$000', '$n'.$MatchSettings['hlpNoTeam'][0].'$z'.LF);
}
$msg .= '$fff---------------------------------------$z' . LF;
$msg .= 'Optional commands for /team (/teamname works too):' . LF;
$msg .= ' $f00dbsave$z - save your teamname permanently on this server' . LF;
$msg .= ' $f00dbclear$z - erase your permanent teamname from this server' . LF;
$msg .= ' $f00dbget$z - get your teamname for this server' . LF;
$msg .= ' $f00clear$z - clear your current teamname' . LF;
$msg .= ' $f00players$z - show a list of players in your team' . LF;
$msg .= '$fff---------------------------------------' . LF;
$msg .= '$000Use $f00/standings$000 to see current match standings.' . LF;
$msg .= '$000Also use $f00/tc {#message}Hello Teammates $000to chat only with your team.';
if (!$MatchSettings['teamchatEnabled']) {
$msg .= LF.$MatchSettings['col_window_highlite'].' Currently disabled by an Admin.';
}
$aseco->addCall('SendDisplayServerMessageToLogin', array($player->login, $aseco->formatColors($msg), 'OK', '', 0));
} elseif ($aseco->server->getGame() == 'TMF') {
$msg = array();
if ($player->teamname) {
$header = 'You currently belong to team '.$MatchSettings['col_window_highlite_team'].$player->teamname;
$msg[] = array(str_replace('{#server}', '$000', '$n'.$MatchSettings['hlp'][0]));
} else {
$header = 'You currently belong to no team.';
$msg[] = array(str_replace('{#server}', '$000', '$n'.$MatchSettings['hlpNoTeam'][0]));
}
$msg[] = array('$ddd---------------------------------------');
$msg[] = array('Optional commands for /team (/teamname works too):');
$msg[] = array('$f00dbsave', 'save your teamname permanently on this server');
$msg[] = array('$f00dbclear', 'erase your permanent teamname from this server');
$msg[] = array('$f00dbget', 'get your teamname for this server');
$msg[] = array('$f00clear', 'clear your current teamname');
$msg[] = array('$f00players', 'show a list of players in your team');
$msg[] = array('$ddd---------------------------------------');
$msg[] = array('$000Use $f00/standings$000 to see current match standings.');
$msg[] = array('$000Also use $f00/tc {#message}Hello Teammates $000to chat only with your team.');
if (!$MatchSettings['teamchatEnabled']) {
$msg[] = array($MatchSettings['col_window_highlite'].' Currently disabled by an Admin.');
}
// display ManiaLink message
display_manialink($player->login, $header, array('Icons64x64_1', 'TrackInfo', -0.01), $msg, array(1.0, 0.2, 0.8), 'OK');
}
}
elseif ($teamname == 'clear') {
$player->teamname = '';
$aseco->addCall('ChatSendServerMessageToLogin', array('You are no longer a member of a team.', $player->login));
}
elseif ($teamname == 'players') {
if ($player->teamname) {
$helper = array();
foreach ($aseco->server->players->player_list as $playa) {
if ($playa->teamname == $player->teamname) $helper[] = $playa->nickname.'$z';
}
sort($helper);
$header = 'Team '.$MatchSettings['col_window_highlite_team'].$player->teamname.'$z';
showListWindow($aseco, $player, $helper, $header);
} else {
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors('{#error}You belong to no team; to join, type $fff/team yourteamname.'), $player->login));
}
}
elseif ($teamname == 'dbsave') {
$sql = 'UPDATE players SET teamname=' . quotedString($player->teamname) . ' WHERE login=' . quotedString($player->login);
mysql_query($sql);
$aseco->addCall('ChatSendServerMessageToLogin', array('Teamname saved to database.', $player->login));
}
elseif ($teamname == 'dbclear') {
$sql = 'UPDATE players SET teamname=\'\' WHERE login=' . quotedString($player->login);
mysql_query($sql);
$aseco->addCall('ChatSendServerMessageToLogin', array('Teamname cleared from database.', $player->login));
}
elseif ($teamname == 'dbget') {
$query = 'SELECT teamname FROM players WHERE Login=' . quotedString($player->login) . ' AND Game=' . quotedString($aseco->server->getGame());
$result = mysql_query($query);
if (!$result) {
$aseco->addCall('ChatSendServerMessageToLogin', array('MySQL error = ' . mysql_error() . ', teamname not changed', $player->login));
} else {
$row = mysql_fetch_row($result);
$player->teamname = $row[0];
if (!$matchTeamNameColorsAllowed) {
$player->teamname = stripColors($player->teamname);
}
$aseco->addCall('ChatSendServerMessageToLogin', array('You have joined team ' . $player->teamname . '.', $player->login));
mysql_free_result($result);
}
}
else {
if (!$matchTeamNameColorsAllowed) {
$teamname = stripColors($teamname);
}
$teamname = substr($teamname, 0, $matchTeamNameMaxLength);
$player->teamname = $teamname;
$aseco->addCall('ChatSendServerMessageToLogin', array('You have joined team ' . $player->teamname . '.', $player->login));
$command['params'] = 'dbsave';
chat_teamname($aseco, $command);
}
if ($MatchSettings['showTeamChanges']) {
$newTeamName = $player->teamname;
if ($newTeamName != $oldTeamName) {
foreach ($aseco->server->players->player_list as $playa) {
if ($playa->login != $player->login) {
if ($newTeamName == '') {
$msg = stripColors($player->nickname).' left his team.';
} else {
$msg = stripColors($player->nickname).' joined team '.$newTeamName;
}
$aseco->addCall('ChatSendServerMessageToLogin', array($msg, $playa->login));
}
}
}
}
} // chat_teamname
// called @ onEndRace
function match_endrace($aseco, $info) {
global $rasp;
global $matchRunning, $matchRound, $matchTotalRounds, $matchPoints, $matchString,
$matchTime, $betweenChallenges, $MatchSettings, $matchOthersCanScore;
$betweenChallenges = true;
if (!$MatchSettings['enable']) {
return;
}
$ranking = $info[0];
if ($ranking[0]['Login'] == '') {
return;
}
$TeamPoints = array();
$challenge = $info[1];
$db_challenge_id = $aseco->getChallengeId($challenge['UId']);
$sql = 'INSERT INTO match_main (trackID) VALUES (' . $db_challenge_id . ')';
mysql_query($sql);
$newID = mysql_insert_id();
$template = $MatchSettings['template'];
$stgout = str_replace('{HEADER}', '', $template['header']);
if ($matchRound == 1) {
$stgout = str_replace('{HEADER}', '<h2>Match - Started at '.date($MatchSettings['format_date'], $matchTime).' - '.date($MatchSettings['format_time'], $matchTime).'</h2>', $template['header']);
$matchString = '';
}
$ctr = 0;
for ($i = 0; $i < $MatchSettings['pointcount']; $i++) {
if ($ranking[$i]['Login'] > '') {
$player = $aseco->server->players->getPlayer($ranking[$i]['Login']);
if ($player->teamname != '' || $matchOthersCanScore) {
// if two people have the same time, they both get the same points
if (($i > 0 && $ranking[$i]['BestTime'] != $ranking[$i - 1]['BestTime'])) {
$ctr++;
}
$rank = $ranking[$i]['Rank'];
$bt = $ranking[$i]['BestTime'];
if ($bt != -1) {
$bt = formattime($bt);
$pts = $MatchSettings['points'][$ctr];
} else {
$bt = 'DNF';
$pts = 0;
}
$TeamPoints[$player->teamname] += $pts;
if ($MatchSettings['savefile']) {
$nickname = stripcolors($ranking[$i]['NickName']);
// RANK, NICK, TIME, TEAM, POINTS are the substituted words for output
$s = $template['detail'];
$s = str_replace('{RANK}', $rank, $s);
$s = str_replace('{NICK}', $nickname, $s);
$s = str_replace('{TIME}', $bt, $s);
$s = str_replace('{TEAM}', $player->teamname, $s);
$s = str_replace('{POINTS}', $pts, $s);
$stgout .= $s;
}
if ($MatchSettings['savedb']) {
$sql = 'SELECT Id FROM players WHERE Login=' . quotedString($player->login) . ' AND Game=' . quotedString($aseco->server->getGame());
$result = mysql_query($sql);
$db_player = mysql_fetch_array($result);
$db_player_id = $db_player['Id'];
mysql_free_result($result);
$sql = 'INSERT INTO match_details (matchID, playerID, teamname, points, score) VALUES (' . $newID . ', ' . $db_player_id . ', ' . quotedString($player->teamname) . ', ' . $pts . ', ' . $ranking[$i]['BestTime'] . ')';
mysql_query($sql);
}
}
}
}
$matchcell = '';
if ($matchRunning)
$matchcell = '<th>This Match</th>';
$stgout .= str_replace('{MATCHCELL}', $matchcell, $template['middle']);
$tots = '';
$msg = '';
if ($matchRound == 1 || !$matchRunning) {
$matchPoints = array();
}
$matchmsg = '';
foreach ($TeamPoints as $key => $value) {
if ($key == '') {
$key = 'OTHERS';
}
if ($value != 0) {
if (!isset($matchPoints[$key])) {
$matchPoints[$key] = 0;
}
$matchPoints[$key] += $value;
}
}
arsort($matchPoints, SORT_NUMERIC);
foreach ($matchPoints as $key => $value) {
$s = $template['teamdetail'];
$matchmsg .= ' '.$MatchSettings['col_teamname_match'] . $key . ' $z'.$MatchSettings['col_match_points'] . $value . ' ';
$s = str_replace('{TEAM}', $key, $s);
if ($key == 'OTHERS') {
$pts = $TeamPoints[''];
} else {
$pts = $TeamPoints[$key];
}
if (!$pts)
$pts = 0;
$s = str_replace('{POINTS}', $pts, $s);
$matchpts = '';
if ($matchRunning) {
$matchpts = '<td>'.$value.'</td>';
}
$s = str_replace('{MATCHPOINTS}', $matchpts, $s);
$stgout .= $s;
$msg = $msg. ' ' .$MatchSettings['col_teamname_round'] . $key . ' $z'.$MatchSettings['col_round_points'] . $pts . ' ';
}
if ($MatchSettings['savefile']) {
$stgout .= $template['footer'];
$stgout = str_replace('{TRACK}', stripcolors($challenge['Name']), $stgout);
$stgout = str_replace('{DATE}', date($MatchSettings['format_date'], time()), $stgout);
$stgout = str_replace('{TIME}', date($MatchSettings['format_time'], time()), $stgout);
$fp = fopen($MatchSettings['outfile'], 'a');
fwrite($fp, $stgout);
fclose($fp);
$fp = fopen($MatchSettings['outfilelast'], 'w');
fwrite($fp, $stgout);
fclose($fp);
$matchString .= $stgout;
}
$noFinishRace = false;
if ($msg == '') {
$noFinishRace = true;
$msg = '$z'.$MatchSettings['col_round_points'].'Nobody in a team finished.';
}
$noFinishMatch = false;
if ($matchmsg == '') {
$noFinishMatch = true;
$matchmsg = '$z'.$MatchSettings['col_match_points'].'Nobody in a team finished';
}
foreach ($aseco->server->players->player_list as $player) {
$toReplace = $player->teamname;
if (!$toReplace)
$toReplace = 'OTHERS';
if (!$noFinishRace) {
$formattedMsg = str_replace(' '.$MatchSettings['col_teamname_round'].$toReplace.' ', ' '.$MatchSettings['col_teamname_round_highlite'].$toReplace.' ', $msg);
} else {
$formattedMsg = $msg;
}
if (!$noFinishMatch) {
$formattedMatchMsg = str_replace(' '.$MatchSettings['col_teamname_match'].$toReplace.' ', ' '.$MatchSettings['col_teamname_match_highlite'].$toReplace.' ', $matchmsg);
} else {
$formattedMatchMsg = $matchmsg;
}
$formattedMsg = $aseco->formatColors($MatchSettings['str_round'].'$z ' . $formattedMsg);
$formattedMatchMsg = $aseco->formatColors($MatchSettings['str_match'].'$z ' . $formattedMatchMsg);
$aseco->addCall('ChatSendServerMessageToLogin', array($formattedMsg, $player->login));
if ($matchRunning) {
$aseco->addCall('ChatSendServerMessageToLogin', array($formattedMatchMsg, $player->login));
}
showHint($aseco, $player);
}
} // match_endrace
function showHint($aseco, $player) {
global $MatchSettings;
if ($MatchSettings['helpEnabled']) {
if ($player->teamname) {
$array = $MatchSettings['hlp'];
$array[] = $array[0];
$firstprob = 5;
$prob = 10;
} else {
$array = $MatchSettings['hlpNoTeam'];
$firstprob = 2;
$prob = 4;
}
srand(microtime()*1000000);
$showhint = rand(1,10);
if ($showhint > $firstprob) {
$hint = '';
srand(microtime()*100000);
$showmainhint = (rand(1,10)) > $prob;
if ($showmainhint) {
$hint = $array[0];
} else {
srand(microtime()*10000000);
$hint = $array[rand(1,count($array)-1)];
}
$aseco->addCall('ChatSendServerMessageToLogin', array($aseco->formatColors('[Hint] '.$hint), $player->login));
}
}
} // showHint
function match_loadsettings() {
global $aseco, $MatchSettings, $matchOthersCanScore, $matchTeamNameColorsAllowed, $matchTeamNameMaxLength, $teamForceTeams;
if (!$settings = $aseco->xml_parser->parseXml('matchsave.xml')) {
trigger_error('Could not read/parse Matchsave config file matchsave.xml !', E_USER_ERROR);
}
$settings = $settings['MATCHSAVE_SETTINGS'];
$MatchSettings['savedb'] = strtolower($settings['SAVE_TO_DB'][0]) == 'true';
$MatchSettings['savefile'] = strtolower($settings['SAVE_TO_FILE'][0]) == 'true';
$MatchSettings['template'] = $settings['TEMPLATE_NAME'][0];
$MatchSettings['outfile'] = $settings['OUTPUT_NAME'][0];
$MatchSettings['outfilelast'] = $settings['OUTPUT_NAME_LAST'][0];
$MatchSettings['outfilematch'] = $settings['OUTPUT_NAME_MATCH'][0];
$MatchSettings['pointcount'] = $settings['MAX_PLAYER_COUNT'][0];
$MatchSettings['format_date'] = $settings['FORMAT_DATE'][0];
$MatchSettings['format_time'] = $settings['FORMAT_TIME'][0];
$MatchSettings['enable'] = strtolower($settings['ENABLED'][0]) == 'true';
$MatchSettings['teamForceEnabled'] = strtolower($settings['TEAM_FORCE_ENABLED'][0]) == 'true';
$MatchSettings['teamchatEnabled'] = strtolower($settings['TEAMCHAT_ENABLED'][0]) == 'true';
$MatchSettings['helpEnabled'] = strtolower($settings['HELP_ENABLED'][0]) == 'true';
$MatchSettings['playlistDir'] = $settings['PLAYLIST_DIR'][0];
$MatchSettings['str_round'] = $settings['STR_POINTS_THIS_ROUND'][0];
$MatchSettings['str_match'] = $settings['STR_POINTS_THIS_MATCH'][0];
$MatchSettings['col_round_points'] = $settings['COL_ROUND_POINTS'][0];
$MatchSettings['col_match_points'] = $settings['COL_MATCH_POINTS'][0];
$MatchSettings['col_teamname_round'] = $settings['COL_TEAMNAME_ROUND'][0];
$MatchSettings['col_teamname_round_highlite'] = $settings['COL_TEAMNAME_ROUND_HIGHLITE'][0];
$MatchSettings['col_teamname_match'] = $settings['COL_TEAMNAME_MATCH'][0];
$MatchSettings['col_teamname_match_highlite'] = $settings['COL_TEAMNAME_MATCH_HIGHLITE'][0];
$MatchSettings['col_chat_plugin'] = $settings['COL_CHAT_PLUGIN'][0];
$MatchSettings['col_chat_default'] = $settings['COL_CHAT_DEFAULT'][0];
$MatchSettings['col_chat_highlite'] = $settings['COL_CHAT_HIGHLITE'][0];
$MatchSettings['col_window_default'] = $settings['COL_WINDOW_DEFAULT'][0];
$MatchSettings['col_window_highlite'] = $settings['COL_WINDOW_HIGHLITE'][0];
$MatchSettings['col_window_highlite_team'] = $settings['COL_WINDOW_HIGHLITE_TEAM'][0];
$MatchSettings['col_window_special'] = $settings['COL_WINDOW_SPECIAL'][0];
$MatchSettings['col_window_separator'] = $settings['COL_WINDOW_SEPARATOR'][0];
$MatchSettings['col_window_hint'] = $settings['COL_WINDOW_HINT'][0];
$MatchSettings['teamchatPrefix'] = $settings['TEAMCHAT_PREFIX'][0];
$MatchSettings['resultTimeout'] = $settings['MATCH_RESULTS_TIMEOUT'][0];
$MatchSettings['bigBrother'] = strtolower($settings['ADMIN_CAN_READ_TEAMCHAT'][0]) == 'true';
$MatchSettings['showTeamChanges'] = strtolower($settings['SHOW_TEAMNAME_CHANGES_TO_PUBLIC'][0]) == 'true';
$matchOthersCanScore = strtolower($settings['OTHERS_CAN_SCORE'][0]) == 'true';
$matchTeamNameMaxLength = intval($settings['TEAMNAME_MAX_LENGTH'][0]);
$matchTeamNameColorsAllowed = strtolower($settings['TEAMNAME_COLORS_ALLOWED'][0]) == 'true';
$MatchSettings['hlpNoTeam'] = array();
$MatchSettings['hlpNoTeam'][] = $settings['HLP_NO_TEAM'][0];
foreach ($settings['HLP_RANDOM_MSG_NO_TEAM'] as $hlp) {
$MatchSettings['hlpNoTeam'][] = $hlp;
}
$MatchSettings['hlp'] = array();
$MatchSettings['hlp'][] = $settings['HLP_CHANGE_TEAM'][0];
foreach ($settings['HLP_RANDOM_MSG'] as $hlp) {
$MatchSettings['hlp'][] = $hlp;
}
//Team Force addition
$MatchSettings['defaultTeam'] = $settings['TEAMFORCE_TEAMS'][0]['DEFAULT_TEAM_NAME'][0];
if ($settings['TEAMFORCE_TEAMS'][0]['TEAM']) {
foreach ($settings['TEAMFORCE_TEAMS'][0]['TEAM'] as $index => $team) {
if ($team['NAME'][0] && $team['LOGINS'][0]['LOGIN']) {
foreach ($team['LOGINS'][0]['LOGIN'] as $login) {
$teamForceTeams[$login] = $team['NAME'][0];
}
}
}
}
$s = $settings['POINTS'][0];
$s = str_replace(' ', '', $s);
$MatchPoints = explode(',', $s);
foreach ($MatchPoints as $key => $value) {
$MatchPoints[$key] = intval($value);
}
$MatchSettings['points'] = $MatchPoints;
$MatchOutput = array();
if (!$MatchSettings['savefile']) {
return;
}
$fp = fopen($MatchSettings['template'], 'r');
$data = fread($fp, 32767); // get whole template
fclose($fp);
$i = strpos($data, '<!-- Player Data Begin ->'); // strlen = 25
$j = strpos($data, '<!-- Player Data End ->'); // strlen = 23
$k = strpos($data, '<!-- Team Data Begin ->'); // strlen = 23
$l = strpos($data, '<!-- Team Data End ->'); // strlen = 21
$header = substr($data, 0, $i); // strpos returns 0 based, no adj to $i necessary
$detail = substr($data, $i + 25, $j - ($i + 26) + 1);
$middle = substr($data, $j + 23, $k - ($j + 24) + 1);
$teamdetail = substr($data, $k + 23, $l - ($k + 24) + 1);
$footer = substr($data, $l + 21);
$MatchOutput['header'] = $header;
$MatchOutput['detail'] = $detail;
$MatchOutput['middle'] = $middle;
$MatchOutput['teamdetail'] = $teamdetail;
$MatchOutput['footer'] = $footer;
$MatchSettings['template'] = $MatchOutput;
} // match_loadsettings
?>