2013-11-12 16:52:23 +01:00
< ? php
namespace ManiaControl\Maps ;
2014-01-05 00:43:46 +01:00
use FML\Controls\Quad ;
2014-01-04 18:18:46 +01:00
use FML\Controls\Quads\Quad_Icons64x64_1 ;
2014-01-05 01:29:49 +01:00
use FML\Controls\Quads\Quad_UIConstruction_Buttons ;
2014-01-05 00:43:46 +01:00
use ManiaControl\Callbacks\CallbackListener ;
2013-11-12 16:52:23 +01:00
use ManiaControl\Commands\CommandListener ;
2014-01-04 18:49:33 +01:00
use ManiaControl\ManiaControl ;
2014-01-05 00:43:46 +01:00
use ManiaControl\Manialinks\IconManager ;
2014-01-04 18:18:46 +01:00
use ManiaControl\Manialinks\ManialinkPageAnswerListener ;
2013-11-12 16:52:23 +01:00
use ManiaControl\Players\Player ;
2014-02-13 14:21:25 +01:00
use Maniaplanet\DedicatedServer\Xmlrpc\Exception ;
2013-11-12 16:52:23 +01:00
/**
* Class offering commands to manage maps
*
* @ author steeffeen & kremsy
*/
2014-01-05 13:32:59 +01:00
class MapCommands implements CommandListener , ManialinkPageAnswerListener , CallbackListener {
2014-01-04 18:18:46 +01:00
/**
* Constants
*/
2014-01-08 20:11:48 +01:00
const ACTION_OPEN_MAPLIST = 'MapCommands.OpenMapList' ;
const ACTION_OPEN_XLIST = 'MapCommands.OpenMXList' ;
const ACTION_RESTART_MAP = 'MapCommands.RestartMap' ;
const ACTION_SKIP_MAP = 'MapCommands.NextMap' ;
2013-11-12 16:52:23 +01:00
/**
2014-01-06 18:50:26 +01:00
* Private Properties
2013-11-12 16:52:23 +01:00
*/
private $maniaControl = null ;
/**
* Create MapCommands instance
*
2014-01-04 18:49:33 +01:00
* @ param \ManiaControl\ManiaControl $maniaControl
2013-11-12 16:52:23 +01:00
*/
public function __construct ( ManiaControl $maniaControl ) {
$this -> maniaControl = $maniaControl ;
2014-01-05 13:32:59 +01:00
$this -> initActionsMenuButtons ();
2014-01-08 20:11:48 +01:00
2013-12-15 11:29:49 +01:00
// Register for admin chat commands
2013-12-15 09:00:30 +01:00
$this -> maniaControl -> commandManager -> registerCommandListener ( 'nextmap' , $this , 'command_NextMap' , true );
$this -> maniaControl -> commandManager -> registerCommandListener ( 'restartmap' , $this , 'command_RestartMap' , true );
$this -> maniaControl -> commandManager -> registerCommandListener ( 'addmap' , $this , 'command_AddMap' , true );
2014-01-10 12:32:11 +01:00
$this -> maniaControl -> commandManager -> registerCommandListener ( array ( 'removemap' , 'removethis' , 'erasemap' , 'erasethis' ), $this , 'command_RemoveMap' , true );
2014-01-11 17:06:32 +01:00
$this -> maniaControl -> commandManager -> registerCommandListener ( array ( 'shufflemaps' , 'shuffle' ), $this , 'command_ShuffleMaps' , true );
2014-01-08 20:11:48 +01:00
2013-12-15 11:29:49 +01:00
// Register for player chat commands
2014-01-14 20:35:31 +01:00
$this -> maniaControl -> commandManager -> registerCommandListener ( 'nextmap' , $this , 'command_showNextMap' );
2014-01-06 18:50:26 +01:00
$this -> maniaControl -> commandManager -> registerCommandListener ( array ( 'maps' , 'list' ), $this , 'command_List' );
$this -> maniaControl -> commandManager -> registerCommandListener ( array ( 'xmaps' , 'xlist' ), $this , 'command_xList' );
2014-01-08 20:11:48 +01:00
2014-01-05 13:32:59 +01:00
// Menu Buttons
2014-01-04 18:49:33 +01:00
$this -> maniaControl -> manialinkManager -> registerManialinkPageAnswerListener ( self :: ACTION_OPEN_XLIST , $this , 'command_xList' );
2014-01-05 00:43:46 +01:00
$this -> maniaControl -> manialinkManager -> registerManialinkPageAnswerListener ( self :: ACTION_OPEN_MAPLIST , $this , 'command_List' );
$this -> maniaControl -> manialinkManager -> registerManialinkPageAnswerListener ( self :: ACTION_RESTART_MAP , $this , 'command_RestartMap' );
$this -> maniaControl -> manialinkManager -> registerManialinkPageAnswerListener ( self :: ACTION_SKIP_MAP , $this , 'command_NextMap' );
}
/**
2014-01-05 13:32:59 +01:00
* Add all Actions Menu Buttons
2014-01-05 00:43:46 +01:00
*/
2014-01-05 13:32:59 +01:00
private function initActionsMenuButtons () {
// Menu Open xList
2014-01-05 00:43:46 +01:00
$itemQuad = new Quad ();
$itemQuad -> setImage ( $this -> maniaControl -> manialinkManager -> iconManager -> getIcon ( IconManager :: MX_ICON ));
2014-01-05 13:32:59 +01:00
$itemQuad -> setImageFocus ( $this -> maniaControl -> manialinkManager -> iconManager -> getIcon ( IconManager :: MX_ICON_MOVER ));
2014-01-04 18:49:33 +01:00
$itemQuad -> setAction ( self :: ACTION_OPEN_XLIST );
2014-01-05 13:32:59 +01:00
$this -> maniaControl -> actionsMenu -> addPlayerMenuItem ( $itemQuad , 5 , 'Open MX List' );
2014-01-08 20:11:48 +01:00
2014-01-05 13:32:59 +01:00
// Menu Open List
2014-01-04 18:18:46 +01:00
$itemQuad = new Quad_Icons64x64_1 ();
2014-01-05 01:29:49 +01:00
$itemQuad -> setSubStyle ( $itemQuad :: SUBSTYLE_ToolRoot );
2014-01-04 18:18:46 +01:00
$itemQuad -> setAction ( self :: ACTION_OPEN_MAPLIST );
2014-01-05 13:32:59 +01:00
$this -> maniaControl -> actionsMenu -> addPlayerMenuItem ( $itemQuad , 10 , 'Open MapList' );
2014-01-08 20:11:48 +01:00
2014-01-05 13:32:59 +01:00
// Menu RestartMap
2014-01-05 01:29:49 +01:00
$itemQuad = new Quad_UIConstruction_Buttons ();
$itemQuad -> setSubStyle ( $itemQuad :: SUBSTYLE_Reload );
2014-01-04 18:49:33 +01:00
$itemQuad -> setAction ( self :: ACTION_RESTART_MAP );
2014-01-31 20:12:01 +01:00
$this -> maniaControl -> actionsMenu -> addAdminMenuItem ( $itemQuad , 10 , 'Restart Map' );
2014-01-08 20:11:48 +01:00
2014-01-05 13:32:59 +01:00
// Menu NextMap
2014-01-04 18:49:33 +01:00
$itemQuad = new Quad_Icons64x64_1 ();
$itemQuad -> setSubStyle ( $itemQuad :: SUBSTYLE_ArrowFastNext );
$itemQuad -> setAction ( self :: ACTION_SKIP_MAP );
2014-01-31 20:12:01 +01:00
$this -> maniaControl -> actionsMenu -> addAdminMenuItem ( $itemQuad , 20 , 'Skip Map' );
2014-01-05 00:43:46 +01:00
}
2014-01-05 13:32:59 +01:00
2014-01-14 20:35:31 +01:00
/**
* Shows which map is the next
*
* @ param array $chat
* @ param Player $player
*/
public function command_ShowNextMap ( array $chat , Player $player ) {
$nextQueued = $this -> maniaControl -> mapManager -> mapQueue -> getNextQueuedMap ();
2014-01-28 16:54:23 +01:00
if ( $nextQueued != null ) {
2014-01-14 20:35:31 +01:00
/** @var Player $requester */
$requester = $nextQueued [ 0 ];
/** @var Map $map */
$map = $nextQueued [ 1 ];
$this -> maniaControl -> chat -> sendInformation ( " Next map is $ < " . $map -> name . " $ > from $ < " . $map -> authorNick . " $ > requested by $ < " . $requester -> nickname . " $ >. " , $player -> login );
} else {
2014-01-31 21:55:30 +01:00
try {
$mapIndex = $this -> maniaControl -> client -> getNextMapIndex ();
2014-02-13 14:21:25 +01:00
} catch ( Exception $e ) {
// TODO: is it even possible that an exception other than connection errors will be thrown? - remove try-catch?
2014-01-31 21:55:30 +01:00
trigger_error ( " Error while Reading the next Map Index " );
$this -> maniaControl -> chat -> sendError ( " Error while Reading next Map Inde " );
return ;
}
$maps = $this -> maniaControl -> mapManager -> getMaps ();
$map = $maps [ $mapIndex ];
2014-01-14 20:35:31 +01:00
$this -> maniaControl -> chat -> sendInformation ( " Next map is $ < " . $map -> name . " $ > from $ < " . $map -> authorNick . " $ >. " , $player -> login );
}
}
2013-11-12 16:52:23 +01:00
/**
* Handle removemap command
*
2014-01-08 20:11:48 +01:00
* @ param array $chat
2014-01-04 18:49:33 +01:00
* @ param \ManiaControl\Players\Player $player
2013-11-12 16:52:23 +01:00
*/
public function command_RemoveMap ( array $chat , Player $player ) {
2014-01-28 16:54:23 +01:00
if ( ! $this -> maniaControl -> authenticationManager -> checkPermission ( $player , MapManager :: SETTING_PERMISSION_REMOVE_MAP )) {
2013-11-13 01:43:12 +01:00
$this -> maniaControl -> authenticationManager -> sendNotAllowed ( $player );
2013-12-15 09:00:30 +01:00
return ;
2013-11-12 16:52:23 +01:00
}
2013-11-27 02:42:39 +01:00
// Get map
$map = $this -> maniaControl -> mapManager -> getCurrentMap ();
2014-01-28 16:54:23 +01:00
if ( ! $map ) {
2013-11-12 16:52:23 +01:00
$this -> maniaControl -> chat -> sendError ( " Couldn't remove map. " , $player -> login );
2013-12-15 09:00:30 +01:00
return ;
2013-11-12 16:52:23 +01:00
}
2014-01-14 15:45:36 +01:00
2014-01-10 12:32:11 +01:00
//RemoveMap
$this -> maniaControl -> mapManager -> removeMap ( $player , $map -> uid );
2013-11-12 16:52:23 +01:00
}
/**
* Handle addmap command
*
2014-01-08 20:11:48 +01:00
* @ param array $chatCallback
2014-01-04 18:49:33 +01:00
* @ param \ManiaControl\Players\Player $player
2014-01-11 16:34:05 +01:00
*/
public function command_ShuffleMaps ( array $chatCallback , Player $player ) {
2014-01-28 16:54:23 +01:00
if ( ! $this -> maniaControl -> authenticationManager -> checkPermission ( $player , MapManager :: SETTING_PERMISSION_SHUFFLE_MAPS )) {
2014-01-11 16:34:05 +01:00
$this -> maniaControl -> authenticationManager -> sendNotAllowed ( $player );
return ;
}
2014-01-11 16:36:34 +01:00
// Shuffles the maps
2014-01-14 15:45:36 +01:00
$this -> maniaControl -> mapManager -> shuffleMapList ( $player );
2014-01-11 16:34:05 +01:00
}
/**
* Handle addmap command
*
* @ param array $chatCallback
* @ param \ManiaControl\Players\Player $player
2013-11-12 16:52:23 +01:00
*/
2013-11-27 02:42:39 +01:00
public function command_AddMap ( array $chatCallback , Player $player ) {
2014-01-31 16:55:01 +01:00
if ( ! $this -> maniaControl -> authenticationManager -> checkPermission ( $player , MapManager :: SETTING_PERMISSION_ADD_MAP )) {
2013-11-13 01:43:12 +01:00
$this -> maniaControl -> authenticationManager -> sendNotAllowed ( $player );
2013-12-15 09:00:30 +01:00
return ;
2013-11-12 16:52:23 +01:00
}
2013-11-27 02:42:39 +01:00
$params = explode ( ' ' , $chatCallback [ 1 ][ 2 ], 2 );
2014-01-28 16:54:23 +01:00
if ( count ( $params ) < 2 ) {
2013-11-19 20:29:37 +01:00
$this -> maniaControl -> chat -> sendUsageInfo ( 'Usage example: //addmap 1234' , $player -> login );
2013-12-15 09:00:30 +01:00
return ;
2013-11-12 16:52:23 +01:00
}
2014-01-08 20:11:48 +01:00
2014-01-05 13:32:59 +01:00
// add Map from Mania Exchange
2014-01-04 18:49:33 +01:00
$this -> maniaControl -> mapManager -> addMapFromMx ( $params [ 1 ], $player -> login );
2013-11-12 16:52:23 +01:00
}
/**
2014-01-06 18:50:26 +01:00
* Handle / nextmap Command
2013-11-12 16:52:23 +01:00
*
2014-01-08 20:11:48 +01:00
* @ param array $chat
2014-01-04 18:49:33 +01:00
* @ param \ManiaControl\Players\Player $player
2013-11-12 16:52:23 +01:00
*/
public function command_NextMap ( array $chat , Player $player ) {
2014-01-31 16:55:01 +01:00
if ( ! $this -> maniaControl -> authenticationManager -> checkPermission ( $player , MapManager :: SETTING_PERMISSION_SKIP_MAP )) {
2013-11-13 01:43:12 +01:00
$this -> maniaControl -> authenticationManager -> sendNotAllowed ( $player );
2013-12-15 09:00:30 +01:00
return ;
2013-11-12 16:52:23 +01:00
}
2014-01-31 21:55:30 +01:00
try {
$this -> maniaControl -> client -> nextMap ();
2014-02-13 14:21:25 +01:00
} catch ( Exception $e ) {
// TODO: is it even possible that an exception other than connection errors will be thrown? - remove try-catch?
2014-01-31 21:55:30 +01:00
$this -> maniaControl -> chat -> sendError ( " Error while Skipping the Map " );
return ;
}
2014-01-14 16:30:02 +01:00
$message = '$<' . $player -> nickname . '$> skipped the current Map!' ;
$this -> maniaControl -> chat -> sendSuccess ( $message );
$this -> maniaControl -> log ( $message , true );
2013-11-12 16:52:23 +01:00
}
/**
2013-12-15 09:00:30 +01:00
* Handle restartmap command
2013-11-12 16:52:23 +01:00
*
2014-01-08 20:11:48 +01:00
* @ param array $chat
2014-01-04 18:49:33 +01:00
* @ param \ManiaControl\Players\Player $player
2013-11-12 16:52:23 +01:00
*/
public function command_RestartMap ( array $chat , Player $player ) {
2014-01-31 16:55:01 +01:00
if ( ! $this -> maniaControl -> authenticationManager -> checkPermission ( $player , MapManager :: SETTING_PERMISSION_RESTART_MAP )) {
2013-11-13 01:43:12 +01:00
$this -> maniaControl -> authenticationManager -> sendNotAllowed ( $player );
2013-12-15 09:00:30 +01:00
return ;
2013-11-12 16:52:23 +01:00
}
2014-01-14 16:30:02 +01:00
$message = '$<' . $player -> nickname . '$> restarted the current Map!' ;
$this -> maniaControl -> chat -> sendSuccess ( $message );
$this -> maniaControl -> log ( $message , true );
2014-01-31 21:55:30 +01:00
try {
$this -> maniaControl -> client -> restartMap ();
2014-02-13 14:21:25 +01:00
} catch ( Exception $e ) {
// TODO: is it even possible that an exception other than connection errors will be thrown? - remove try-catch?
2014-01-31 21:55:30 +01:00
//do nothing
}
2013-11-12 16:52:23 +01:00
}
2013-12-14 22:00:59 +01:00
2013-12-15 09:00:30 +01:00
/**
2014-01-06 18:50:26 +01:00
* Handle / maps command
2013-12-15 09:00:30 +01:00
*
2014-01-08 20:11:48 +01:00
* @ param array $chatCallback
2014-01-04 18:49:33 +01:00
* @ param Player $player
2013-12-15 09:00:30 +01:00
*/
public function command_List ( array $chatCallback , Player $player ) {
2014-01-06 18:50:26 +01:00
$this -> maniaControl -> mapManager -> mapList -> showMapList ( $player );
2013-12-14 22:00:59 +01:00
}
2013-12-15 11:29:49 +01:00
/**
* Handle ManiaExchange list command
2014-01-04 18:49:33 +01:00
*
2014-01-08 20:11:48 +01:00
* @ param array $chatCallback
2013-12-15 11:29:49 +01:00
* @ param Player $player
*/
public function command_xList ( array $chatCallback , Player $player ) {
2014-02-07 14:05:10 +01:00
$this -> maniaControl -> mapManager -> mxList -> showList ( $chatCallback , $player );
2013-12-15 11:29:49 +01:00
}
2013-11-12 16:52:23 +01:00
}