[S] PHP Server Files (Nexon Client, Outbox, much more)

06/18/2012 21:23 Supremex3#1
Hello my friends.
I'm working on my PHP Server in WarRock and i wanted to sell it (or parts of it) to everybody who wants to learn off it. I wanted to get some more private money so here we go..
I'll add one or two source codes in this post to let you see what i did until now (everythings object orientated)

server.php (main file, only tcp)
Code:
<?php
	
	echo "\n    _______________________________";
	echo "\n   /                               \ ";
	echo "\n  |      Rexiles WarRock Server     |";
	echo "\n  |              - - -              |";
	echo "\n  |   (c) 2012 Felix F. (Supreme)   |";
	echo "\n  |                                 |";
	echo "\n   \_______________________________/";
	echo "\n\n";
	
	//	Master includes
	include("functions.php");
	include("data.php");
	
	WriteLine("Server", "L.U.C.S. (Version): ".$arrPatch[0].";".$arrPatch[1].";".$arrPatch[2].";".$arrPatch[3]);
	// Launcher.Updater.Client.Sub
	
	//	Needed Classes
	//	~ Network
	include("network/tcpserver.php");
	include("network/clienthandler.php");
	include("network/packet.php");
	include("network/crypter.php");
	include("network/packets.php");
	//	~ Data
	include("data/mysql.php");
	include("data/user.php");
	include("data/login_user_nexon.php");
	include("data/inventory.php");
	include("data/outboxitem.php");
	include("data/room.php");
	include("data/luckyshot.php");
	include("data/itemmanager/itemmanager.php");
	include("data/weaponmanager/weaponmanager.php");
	
	//	Other Servers
	include("servers/login_nexon.php");
	include("servers/game.php");
	include("servers/udp.php");
	
	$objMysql = new MysqlClass($arrMysqlData['host'], $arrMysqlData['user'], $arrMysqlData['password'], $arrMysqlData['database']);
	WriteLine("MySQL", "Successfully connected to ".$objMysql->getHost()." as '".$objMysql->getUser()."'");
	$objMysql->query("UPDATE `account` SET `online`='false' WHERE `online`='true';");
	
	$objItemManager = new ItemManagerClass("data/itemmanager/items.list");
	$objWeaponManager = new WeaponManager();
	
	$arrLuckyshotItems = LuckyshotItem::loadItems(); //load items from database
	
	include("data/equipment_default.php");
	
	$arrServers = array();
	
	$arrServers['login'] = new LoginServer('0.0.0.0', 5330);
	$arrServers['game'] = new GameServer('0.0.0.0', $serverData['port']);
	//$arrServers['udp'] = new UdpServer('127.0.0.1', 5350);
	//$arrServers['http'] = new HTTPServer('127.0.0.1', 80);
	
	while(true)
	{
		foreach($arrServers as $strKey => $objServer)
		{
			$objServer->onServerRun();
			if($strKey == 'game')
			{
				$objServer->masterTick();
			}
		}
		usleep(1); //let cpu do its work...
	}
?>

servers/game.php (Packet handling, ...)
Code:
<?php
	
	class GameHandler extends ClientHandler
	{
		
		protected $objUser = NULL;
		public function getUser()
		{
			return $this->objUser;
		}
		public function setUser($objUser)
		{
			if(!isset($this->objUser) || $this->objUser == NULL)
			{
				$this->objUser = $objUser;
			}
		}
		
		public function OnConnect()
		{
			parent::OnConnect();
		}
		
		public function OnDisconnect()
		{
			parent::OnDisconnect();
			$this->leaveServer();
		}
		public function leaveServer()
		{
			WriteLine("GameServer", $this->objUser->getNickname()." [#".$this->objUser->getUserId()."] left the Server");
			$this->objUser->leaveRoom();
			foreach($this->objUser->getFriendedOnline() as $objFriend)
			{
				$objFriendHandler = $objFriend->getHandler($this->objServer);
				$objFriendUser = $objFriendHandler->getUser();
				$objFriendUser->chatPlayer("'".$this->objUser->getNickname()."' left the Server", "Messenger");
			}
			$this->objUser->goOffline();
		}
		
		public function kickClient()
		{
			$this->objServer->killClient($this->objClient); //just terminate connection and remove us from handlers / connections list
		}
		
		public function OnDataReceive($strData)
		{
			try
			{
				global $GameOperationcodes;
				global $objMysql;
				parent::OnDataReceive($strData);
				$objPacket = Crypter::uncryptPacket($strData, Crypter::PACKETTYPE_Game());
				$arrOperationcodeNames = array_flip($GameOperationcodes);
				if(array_search($objPacket->getOperationcode(), $arrOperationcodeNames) == -1)
				{
					WriteLine("GameServer", "(Unknown) Packet: ".$objPacket->getPacket());
				}
				else
				{
					$strPacketName = strtolower(substr($arrOperationcodeNames[$objPacket->getOperationcode()], 2, strlen($arrOperationcodeNames[$objPacket->getOperationcode()]) - 2));
					$strFunctionName = "gameHandler_".$strPacketName."::handle";
					if(is_callable($strFunctionName))
					{
						call_user_func($strFunctionName, $objPacket, $this, $this->objServer, $this->objUser);
					}
					else
					{
						WriteLine("GameServer", "No Handler for Packet (".$strPacketName.")");
					}
				}
			}
			catch(Exception $ex)
			{
				$this->kickClient(); //cya bastard =D
			}
		}
		
		public function tryHandleCommand($strMessage)
		{
			$strTrueMessage = substr($strMessage, strlen($this->objUser->getNickname()) + 4);
			$strPrefix = substr($strTrueMessage, 0, 1);
			$arrSplit = explode(chr(0x1D), $strTrueMessage);
			if($strPrefix == "/")
			{
				$this->handleCommand($arrSplit);
				return true;
			}
		}
		protected function handleCommand($arrBlocks)
		{
			$intCount = count($arrBlocks);
			$arrBlocks[0] = substr($arrBlocks[0], 1);
			$thisUser = $this->getUser();
			
			switch($arrBlocks[0])
			{
				case 'msn':
				{
					if($intCount < 2)
					{
						$this->objUser->chatPlayerGreen("Please enter an Action ( add/remmove/list )", "Messenger");
						return;
					}
					$strAction = $arrBlocks[1];
					if($strAction == 'add')
					{
						if($intCount < 3)
						{
							$this->objUser->chatPlayerGreen("Please enter a Nickname", "Messenger");
							return;
						}
						$strNickname = $arrBlocks[2];
						$arrFriends = $thisUser->getFriends();
						$boolAlreadyFriends = false;
						foreach($arrFriends as $objFriend)
						{
							if($objFriend->getNickname() == $strNickname)
							{
								$boolAlreadyFriends = true;
								break;
							}
						}
						if($boolAlreadyFriends == true)
						{
							$this->objUser->chatPlayerGreen("'".$strNickname."' is already your Friend!", "Messenger");
						}
						else
						{
							global $objMysql;
							$objQuery = $objMysql->query("SELECT `id` FROM `account` WHERE `nickname`='".mysql_real_escape_string($strNickname)."' LIMIT 0,1;");
							if(mysql_num_rows($objQuery) > 0)
							{
								$objRow = mysql_fetch_array($objQuery);
								$objMysql->query("INSERT INTO `friends` (`userid`, `friendid`) VALUES ('".$this->objUser->getUserId()."', '".$objRow['id']."');");
								foreach($this->objServer->getPlayers() as $objHandler)
								{
									$objUser = $objHandler->getUser();
									if($objUser->getNickname() == $strNickname)
									{
										$objUser->chatPlayerGreen("'".$this->objUser->getNickname()."' added you as Friend!", "Messenger");
										break;
									}
								}
								$this->objUser->chatPlayerGreen("'".$strNickname."' added to Friends! :)", "Messenger");
							}
							else
							{
								$this->objUser->chatPlayerGreen("'".$strNickname."' not Found! :(", "Messenger");
							}
						}
					}
					elseif($strAction == 'remove')
					{
						if($intCount < 3)
						{
							$this->objUser->chatPlayerGreen("Please enter a Nickname", "Messenger");
							return;
						}
						$strNickname = $arrBlocks[2];
						$arrFriends = $thisUser->getFriends();
						foreach($arrFriends as $objFriend)
						{
							if($objFriend->getNickname() == $strNickname)
							{
								if($objFriend->getIsOnline($this->objServer) == true)
								{
									$objFriendHandler = $objFriend->getHandler($this->objServer);
									$objFriendUser = $objFriendHandler->getUser();
									$objFriendUser->chatPlayerGreen("'".$this->objUser->getNickname()."' removed you from his Friendlist!", "Messenger");
								}
								global $objMysql;
								$objMysql->query("DELETE FROM `friends` WHERE `userid`='".$this->objUser->getUserId()."' AND `friendid`='".$objFriend->getUserId()."'");
								$this->objUser->chatPlayerGreen("'".$objFriend->getNickname()."' removed from Friendlist!", "Messenger");
								break;
							}
						}
					}
					elseif($strAction == 'list')
					{
						$this->objUser->chatPlayerGreen("-- Friends --", "Messenger");
						foreach($thisUser->getFriends() as $objFriend)
						{
							$strStatus = " is offline";
							if($objFriend->getIsOnline($this->objServer) == true)
							{
								$strStatus = " is online";
								$objFriendHandler = $objFriend->getHandler($this->objServer);
								$objFriendUser = $objFriendHandler->getUser();
								if($objFriendUser->getRoom() != NULL)
								{
									$objRoom = $objFriendUser->getRoom();
									$strStatus .= " (Room ".$objRoom->getId().")";
								}
							}
							$this->objUser->chatPlayerGreen($objFriend->getNickname().$strStatus, "Messenger");
						}
					}
					else
					{
					}
					break;
				}
				case 'userinfo':
				{
					if($thisUser->getAuthority() == 0) { $thisUser->chatPlayer("No access to this command!"); break; }
					global $objMysql;
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter a Nickname");
						return;
					}
					$strNickname = $arrBlocks[1];
					$objQuery = $objMysql->query("SELECT * FROM `account` WHERE `nickname`='".mysql_real_escape_string($strNickname)."' LIMIT 0,1;");
					if(mysql_num_rows($objQuery) > 0)
					{
						$objRow = mysql_fetch_array($objQuery);
						$strAppend = "";
						if($objRow['banned'] == 'true') { $strAppend = "(banned) "; }
						$this->objUser->chatPlayer("-- Userinfo ".$strAppend."--");
						$this->objUser->chatPlayer("Username: ".$objRow['username']);
						$this->objUser->chatPlayer("Nickname: ".$objRow['nickname']);
						$objQuery = $objMysql->query("SELECT * FROM `account_detail` WHERE `id`='".$objRow['id']."' LIMIT 0,1;");
						$objRow = mysql_fetch_array($objQuery);
						$this->objUser->chatPlayer("Premium: ".Functions::PremiumToString($objRow['premium']));
						$this->objUser->chatPlayer("Experience: ".$objRow['exp']." (".$objRow['level'].")");
						$this->objUser->chatPlayer("Dinar: ".$objRow['dinar']);
						$this->objUser->chatPlayer("Credits: ".$objRow['credits']);
						$dblKd = round(($objRow['kills'] + 1) / ($objRow['deaths'] + 1), 3);
						$this->objUser->chatPlayer("K/D: ".$objRow['kills']."/".$objRow['deaths']." (".$dblKd.")");
						$this->objUser->chatPlayer("Authority: ".$objRow['authority']);
						break;
					}
					else
					{
						$this->objUser->chatPlayer("Nickname '".$strNickname."' not found!");
					}
					break;
				}
				case 'createuser':
				{
					if($thisUser->getAuthority() != 2) { $thisUser->chatPlayer("No access to this command!"); break; }
					global $objMysql;
					if($intCount < 4)
					{
						$this->objUser->chatPlayer("Please keep to structure");
						return;
					}
					$strUsername = $arrBlocks[1];
					$strNickname = $arrBlocks[2];
					$strPassword = $arrBlocks[3];
					$objQuery = $objMysql->query("SELECT * FROM `account` WHERE `nickname`='".mysql_real_escape_string($strNickname)."' OR `username`='".mysql_real_escape_string($strUsername)."' LIMIT 0,1;");
					if(mysql_num_rows($objQuery) > 0)
					{
						$this->objUser->chatPlayer("Username or nickname already in use!");
						break;
					}
					else
					{
						$objMysql->query("INSERT INTO `account` (`username`, `password`, `nickname`) VALUES ('".mysql_real_escape_string($strUsername)."', PASSWORD('".mysql_real_escape_string($strPassword)."'), '".mysql_real_escape_string($strNickname)."');");
						$objMysql->query("INSERT INTO `account_detail` (`premium`, `level`, `exp`, `dinar`, `credits`, `kills`, `deaths`, `authority`, `showlevel`) VALUES ('1', '1', '0', '250000', '5000', '0', '0', 'player', 'true');");
						$objMysql->query("INSERT INTO `peer` (`userid` ,`remoteip` ,`remoteport` ,`localip` ,`localport` ,`c_remoteip` ,`c_localip`)VALUES (NULL , '127.0.0.1', '0', '127.0.0.1', '0', '0', '0');");
						$objQuery = $objMysql->query("SELECT `id` FROM `account` WHERE `username`='".mysql_real_escape_string($strUsername)."' LIMIT 0,1;");
						$objRow = mysql_fetch_array($objQuery);
						$objMysql->query("INSERT INTO `equipment` (`userid`, `class`) VALUES ('".$objRow['id']."', 'engineer');");
						$objMysql->query("INSERT INTO `equipment` (`userid`, `class`) VALUES ('".$objRow['id']."', 'medic');");
						$objMysql->query("INSERT INTO `equipment` (`userid`, `class`) VALUES ('".$objRow['id']."', 'sniper');");
						$objMysql->query("INSERT INTO `equipment` (`userid`, `class`) VALUES ('".$objRow['id']."', 'assault');");
						$objMysql->query("INSERT INTO `equipment` (`userid`, `class`) VALUES ('".$objRow['id']."', 'heavy');");
						$this->objUser->chatPlayer("User '".$strUsername."' created (#".$objRow['id'].")");
					}
					break;
				}
				case 'help':
				{
					$this->objUser->chatPlayer("-- Commands --");
					$this->objUser->chatPlayer("Messenger: /msn <add/remove/list>");
					if($thisUser->getAuthority() >= 1)
					{
						$this->objUser->chatPlayer("Kick player: /kick <nickname>");
						$this->objUser->chatPlayer("Kill room: /killrm <id>");
						$this->objUser->chatPlayer("Userinfo: /userinfo <nickname>");
					}
					if($thisUser->getAuthority() >= 2)
					{
						$this->objUser->chatPlayer("Server notify: /notify <message>");
						$this->objUser->chatPlayer("Ban / unban: /ban <username> <1/0>");
						$this->objUser->chatPlayer("Add User: /createuser <username> <password> <nickname>");
					}
					break;
				}
				case 'kick':
				{
					if($thisUser->getAuthority() == 0) { $thisUser->chatPlayer("No access to this command!"); break; }
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter a Nickname!");
						break;
					}
					$strNickname = $arrBlocks[1];
					$objFound = NULL;
					foreach($this->objServer->getPlayers() as $objPlayer)
					{
						$objUser = $objPlayer->getUser();
						if($objUser->getNickname() == $strNickname)
						{
							$objFound = $objPlayer;
							break;
						}
					}
					if($objFound != NULL)
					{
						$objUser = $objFound->getUser();
						if($objUser->getUserId() == 1)
						{
							$this->objUser->leaveRoom();
							$this->kickClient();
							$objUser->chatPlayer("'".$this->objUser->getNickname()."' wanted to kick you from Server!");
							break;
						}
						if($objUser->getAuthority() > $this->objUser->getAuthority())
						{
							$this->objUser->chatPlayer("You can't kick ".$objUser->getNickname());
							$objUser->chatPlayer("'".$this->objUser->getNickname()."' wanted to kick you from Server!");
							break;
						}
						if($objUser->getNickname() == $this->objUser->getNickname())
						{
							$objUser->chatPlayer("You can't kick yourself!");
							break;
						}
						$objUser->leaveRoom();
						$objFound->kickClient();
						$this->objUser->chatPlayer("'".$objUser->getNickname()."' kicked!");
					}
					else
					{
						$this->objUser->chatPlayer("Player '".$strNickname."' is not online!");
					}
					break;
				}
				case 'killrm':
				{
					if($thisUser->getAuthority() == 0) { $thisUser->chatPlayer("No access to this command!"); break; }
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter a Room ID!");
						break;
					}
					$intRoomId = $arrBlocks[1];
					$intChannelId = $this->objUser->getChannel();
					if($intCount > 2)
					{
						if(is_numeric($arrBlocks[2]))
						{
							$intChannelId = $arrBlocks[2];
						}
					}
					if(!is_numeric($intRoomId))
					{
						$this->objUser->chatPlayer("Please enter a (valid) Room ID!");
						break;
					}
					$objRoom = $this->objServer->getRoom($intChannelId, $intRoomId);
					if(!isset($objRoom) || $objRoom == NULL)
					{
						$this->objUser->chatPlayer("Room does not exist!");
						break;
					}
					if(count($objRoom->getPlayers()) <= 0)
					{
						$this->objServer->removeRoom($intChannelId, $objRoom);
					}
					else
					{
						foreach($objRoom->getPlayers() as $objPlayer)
						{
							$objUser = $objPlayer->getUser();
							$objUser->leaveRoom();
						}
					}
					$this->objUser->chatPlayer("Woosh! Room has been deleted!");
					
					break;
				}
				case 'notify':
				{
					if($thisUser->getAuthority() != 2) { $thisUser->chatPlayer("No access to this command!"); break; }
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter Notify Text!");
						break;
					}
					$strMessage = implode(" ", $arrBlocks);
					$strMessage = substr($strMessage, strlen($arrBlocks[0]) + 1);
					foreach($this->objServer->getPlayers() as $objHandler)
					{
						$objHandler->send(new gSvNotify($strMessage));
					}
					$this->objUser->chatPlayer("You notified '".$strMessage."'");
					break;
				}
				case 'spectate':
				{
					if($thisUser->getAuthority() == 0) { $thisUser->chatPlayer("No access to this command!"); break; }
					$this->objUser->chatPlayer("This function is not available at the moment!");
					return;
					$objRoom = $this->objUser->getRoom();
					if(isset($objRoom) && $objRoom != NULL)
					{
						$this->objUser->chatPlayer("You're already in a Room!");
						break;
					}
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter a Room ID!");
						break;
					}
					$intRoomId = $arrBlocks[1];
					if(!is_numeric($intRoomId))
					{
						$this->objUser->chatPlayer("Please enter a (valid) Room ID!");
						break;
					}
					
					$objRoom = $this->objServer->getRoom($this->objUser->getChannel(), $intRoomId);
					if(isset($objRoom) && $objRoom != NULL)
					{
						$this->send(new gSvJoinRoom(1, NULL, $objRoom)); //join =D
									
						$arrPlayers = $objRoom->getPlayers();
						$this->send(new gSvPlayerlist($arrPlayers, $objRoom, $this)); //send the player, who joins, who is in the room (including his self for his seat)
						$this->objUser->setRoom($objRoom);
						$this->objUser->setSpectating(true);
						$objRoom->addSpectator($this);
					}
					else
					{
						$this->objUser->chatPlayer("Room does not exist");
					}
					break;
				}
				case 'ban':
				{
					if($thisUser->getAuthority() != 2) { $thisUser->chatPlayer("No access to this command!"); break; }
					global $objMysql;
					if($intCount < 3)
					{
						$this->objUser->chatPlayer("Please keep to Structure (<username> <1/0>)!");
						break;
					}
					$strUsername = $arrBlocks[1];
					$intBan = $arrBlocks[2];
					if(!is_numeric($intBan) || $intBan < 0 || $intBan > 1)
					{
						$this->objUser->chatPlayer("Ban value must be 1 or 0!");
						break;
					}
					$objQuery = $objMysql->query("SELECT * FROM `account` WHERE `username`='".mysql_real_escape_string($strUsername)."' LIMIT 0,1;");
					if(mysql_num_rows($objQuery) < 1)
					{
						$this->objUser->chatPlayer("User '".$strUsername."' not found!");
						break;
					}
					$objRow = mysql_fetch_array($objQuery);
					$objQuery = $objMysql->query("SELECT * FROM `account_detail` WHERE `id`='".$objRow['id']."' LIMIT 0,1;");
					$objRow = mysql_fetch_array($objQuery);
					if(($objRow['authority'] == 'admin' || $objRow['authority'] == 'moderator') && $this->objUser->getUserId() == 1)
					{
						$this->objUser->chatPlayer("You can't ban/unban this User!");
						break;
					}
					$strBanned = ($intBan == 1 ? 'true' : 'false');
					$objQuery = $objMysql->query("UPDATE `account` SET `banned`='".$strBanned."' WHERE `username`='".mysql_real_escape_string($strUsername)."'");
					$strBanned = ($intBan == 1 ? 'banned' : 'unbanned');
					if($intBan == 1)
					{
						foreach($this->objServer->getPlayers() as $objHandler)
						{
							$objUser = $objHandler->getUser();
							if($objUser->getUsername() == $strUsername)
							{
								$objUser->leaveRoom();
								$objHandler->kickClient();
								$strBanned .= " and kicked";
								break;
							}
						}
					}
					$this->objUser->chatPlayer("User '".$strUsername."' has been ".$strBanned);
					break;
				}
				case 'resetnickname':
				{
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter an username!");
						break;
					}
					global $objMysql;
					$strUsername = mysql_real_escape_string($arrBlocks[1]);
					$objQuery = $objMysql->query("SELECT `id` FROM `account` WHERE `username`='".$strUsername."' LIMIT 0,1;");
					if(mysql_num_rows($objQuery) < 1)
					{
						$this->objUser->chatPlayer("User '".$strUsername."' does not exist!");
						break;
					}
					else
					{
						$objRow = mysql_fetch_array($objQuery);
						if($objRow['id'] == $this->objUser->getUserId())
						{
							$objQuery = $objMysql->query("UPDATE `account` SET `nickname`=NULL WHERE `id`='".$this->objUser->getUserId()."'");
						}
						else
						{
							$objQuery = $objMysql->query("SELECT * FROM `account_detail` WHERE `id`='".$objRow['id']."' LIMIT 0,1;");
						}
					}
				}
				case 'rename':
				{
					if($intCount < 3)
					{
						$this->objUser->chatPlayer("Please enter an username and a new nickname!");
						break;
					}
					$strUsername = $arrBlocks[1];
					$strNickname = $arrBlocks[2];
					$strAdditional = "!";
					foreach($this->objServer->getPlayers() as $objHandler)
					{
						$objUser = $objHandler->getUser();
						if($objUser->getUsername() == $strUsername)
						{
							$objUser->setNickname($strNickname);
							$objUser->send(new gSvChangeNickname($objUser->getNickname()));
							$strAdditional = " and notified!";
						}
					}
					$this->objUser->chatPlayer("User '".$strUsername."' successfully renamed".$strAdditional);
				}
				case 'testcode':
				{
					if($intCount < 2)
					{
						$this->objUser->chatPlayer("Please enter an Errocode!");
						break;
					}
					$intErrorcode = $arrBlocks[1];
					if(!is_numeric($intErrorcode))
					{
						$this->objUser->chatPlayer("Please enter an (valid) Errocode!");
						break;
					}
					$this->send(new gSvJoinRoom($intErrorcode));
					$this->objUser->chatPlayer("Errorcode: ".$intErrorcode, "Test Errocode");
					break;
				}
				default:
				{
					$this->objUser->chatPlayer("No such command '".$arrBlocks[0]."'");
				}
			}
			return true;
		}
	}
	
	class GameServer extends TcpServer
	{
		protected $boolResetToday;
		
		public function onClientConnected($objClient)
		{
			$this->arrHandlers[array_search($objClient, $this->arrClients)] = new GameHandler($this, $objClient);
		}
		
		public function onClientReceived($objClient, $strData)
		{
			parent::onClientReceived($objClient, $strData);
		}
		
		public function onClientDisconnected($objClient)
		{
			parent::onClientDisconnected($objClient);
		}
		
		public function __construct($strIp, $intPort)
		{
			parent::__construct($strIp, $intPort);
			$this->arrRooms = array();
			$this->arrRooms[] = array(); //1 cqc
			$this->arrRooms[] = array(); //2 uo
			$this->arrRooms[] = array(); //3 bg
			$this->arrRooms[] = array(); //4 ai
			
			$this->boolResetToday = false;
			global $objMysql;
			$objMysql->query("UPDATE `account_detail` SET `couponstoday`='0';");
		}
		
		public function getPlayers($intChannelId = NULL)
		{
			$arrPlayers = array();
			foreach($this->arrHandlers as $objHandler)
			{
				if($intChannelId == NULL)
				{
					$arrPlayers[] = $objHandler;
				}
				else
				{
					$objUser = $objHandler->getUser();
					if($objUser->getChannel() == $intChannelId)
					{
						$arrPlayers[] = $objHandler;
					}
				}
			}
			return $arrPlayers;
		}
		public function getPlayerCount()
		{
			return count($this->getPlayers());
		}
		public function getFreeSessionId()
		{
			$arrEmptyPlayers = array();
			foreach($this->getPlayers() as $intKey => $objHandler)
			{
				if(!isset($objHandler) || $objHandler == NULL)
				{
					$arrEmptyPlayers[] = $intKey;
				}
			}
			if(count($arrEmptyPlayers) > 0)
			{
				return min($arrEmptyPlayers);
			}
			else
			{
				return 0;
			}
		}
		
		public function updateRoomList($intChannelId, $intRoomId)
		{
			$arrPlayers = $this->getPlayers($intChannelId);
			$intRoompage = floor($intRoomId / 15);
			foreach($arrPlayers as $objPlayer)
			{
				$objUser = $objPlayer->getUser();
				$objRoom = $objUser->getRoom();
				if(isset($objRoom) || $objRoom != NULL) { continue; }
				if($objUser->getRoompage() == $intRoompage)
				{
					$objPlayer->send(new gSvRoomlist($objUser, $this->getRooms($intChannelId), $this->getRoomsCount($intChannelId)));
				}
			}
		}
		
		public function masterTick()
		{
			for($intChannel = 0; $intChannel < 4; $intChannel ++)
			{
				foreach($this->getRooms($intChannel) as $objRoom)
				{
					$objRoom->roomTick();
				}
			}
			if(date('His') === '000000' && $this->boolResetToday == false) //reset coupons today
			{
				global $objMysql;
				$objMysql->query("UPDATE `account_detail` SET `couponstoday`='0';");
				$this->boolResetToday = true;
			}
			elseif(date('His') !== '000000' && $this->boolResetToday == true)
			{
				$this->boolResetToday = false;
			}
		}
		
		protected $arrRooms;
		public function getRoom($intChannelId, $intRoomId)
		{
			return @$this->arrRooms[$intChannelId][$intRoomId];
		}
		public function getRooms($intChannelId)
		{
			return @$this->arrRooms[$intChannelId];
		}
		public function getRoomsCount($intChannelId)
		{
			$intCount = 0;
			foreach($this->arrRooms as $objRoom)
			{
				if(isset($objRoom) && $objRoom != NULL)
				{
					$intCount ++;
				}
			}
			return $intCount;
		}
		public function getFreeRoomId($intChannelId)
		{
			$arrEmptyRooms = array();
			foreach($this->getRooms($intChannelId - 1) as $intKey => $objRoom)
			{
				if(!isset($objRoom) || $objRoom == NULL)
				{
					$arrEmptyRooms[] = $intKey;
				}
			}
			if(count($arrEmptyRooms) > 0)
			{
				return min($arrEmptyRooms);
			}
			else
			{
				return 0;
			}
		}
		public function addRoom($intChannelId, $objRoom)
		{
			$this->arrRooms[$intChannelId][$objRoom->getId()] = $objRoom;
			$this->updateRoomList($intChannelId, $objRoom->getId());
		}
		public function removeRoom($intChannelId, $objRoom)
		{
			unset($this->arrRooms[$intChannelId][array_search($objRoom, $this->arrRooms)]);
			$this->updateRoomList($intChannelId, $objRoom->getId());
		}
	}
	
?>
and because im so nice, i add another file...

network/game/handlers/gameHandler_kickplayer.php (when youre room master you can kick players, well this is yet at work)

Code:
<?php
	
	class gameHandler_kickplayer
	{
		
		public static function handle($objPacket, $objHandler, $objServer, $objUser)
		{
			$objUser->chatPlayer("This function is yet at work!");
			return;
			
			$intPlayerSlot = $objPacket->getNextBlock();
			$objRoom = $objUser->getRoom();
			if(isset($objRoom) && $objRoom != NULL)
			{
				$intMySlot = $objRoom->getPlayerSlot($objHandler);
				if($intMySlot == $objRoom->getMasterId())
				{
					$objTargetPlayer = $objRoom->getPlayer($intPlayerSlot);
					if(isset($objTargetPlayer) && $objTargetPlayer != NULL)
					{
						$objTargetPlayer->leaveRoom();
						$objTargetPlayerUser = $objTargetPlayer->getUser();
						$objTargetPlayerUser->chatPlayer("You have been forced out of the Game by Master or Admin!");
						
						return;
						$objRoom->removePlayer($objTargetPlayer);
						$objTargetUser = $objTargetPlayer->getUser();
						$objTargetUser->setRoom(NULL);
						$objHandlersend(new gSvKickPlayerNotify($intPlayerSlot));
						$objTargetPlayer->send(new gSvKickPlayerNotify($intMySlot));
						$objTargetUser->leaveRoom();
					}
				}
				else
				{
					$objHandler->kickClient();
				}
			}
			else
			{
				$objHandler->kickClient();
			}
		}
		
	}
	
?>

I have counted my files and directorys: 81 files in 10 directories.

Tell me a good price and maybe ill sell the source (or parts of it).
Only payable with PaySafeCard.
I will probably give you a tiny extra gift.
Just PM me here on epvp | add me on skype: powachill.

Greeez homies...
Supreme


#EDIT


I have some Screens:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
And there i censored some packets you shouldnt see...
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

#EDIT2
I can login with every Nexon Account. Password will be validated with Nickname change (comes with login).. Thats temporairly until i figured out how to check the nexon auth servers generated password..