1371 lines
53 KiB
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
|
|
?>
|