api = $api; $this->server = ServerAPI::request(); } public function init(){ } public function __destruct(){ } public function packetHandler(Packet $packet){ $data =& $packet; $CID = PocketMinecraftServer::clientID($packet->ip, $packet->port); if(isset($this->clients[$CID])){ $this->clients[$CID]->handlePacket($packet); }else{ if($this->handle("server.noauthpacket.".$packet->pid(), $packet) === false){ return; } switch($packet->pid()){ case RakNetInfo::UNCONNECTED_PING: case RakNetInfo::UNCONNECTED_PING_OPEN_CONNECTIONS: if($this->invisible === true){ $pk = new RakNetPacket(RakNetInfo::UNCONNECTED_PONG); $pk->pingID = $packet->pingID; $pk->serverID = $this->serverID; $pk->serverType = $this->serverType; $pk->ip = $packet->ip; $pk->port = $packet->port; $this->send($pk); break; } if(!isset($this->custom["times_".$CID])){ $this->custom["times_".$CID] = 0; } $ln = 15; if($this->description == "" or substr($this->description, -1) != " "){ $this->description .= " "; } $txt = substr($this->description, $this->custom["times_".$CID], $ln); $txt .= substr($this->description, 0, $ln - strlen($txt)); $pk = new RakNetPacket(RakNetInfo::UNCONNECTED_PONG); $pk->pingID = $packet->pingID; $pk->serverID = $this->serverID; $pk->serverType = $this->serverType . $this->name . " [".count($this->clients)."/".$this->maxClients."] ".$txt; $pk->ip = $packet->ip; $pk->port = $packet->port; $this->send($pk); $this->custom["times_".$CID] = ($this->custom["times_".$CID] + 1) % strlen($this->description); break; case RakNetInfo::OPEN_CONNECTION_REQUEST_1: if($packet->structure !== RakNetInfo::STRUCTURE){ console("[DEBUG] Incorrect structure #".$packet->structure." from ".$packet->ip.":".$packet->port, true, true, 2); $pk = new RakNetPacket(RakNetInfo::INCOMPATIBLE_PROTOCOL_VERSION); $pk->serverID = $this->serverID; $pk->ip = $packet->ip; $pk->port = $packet->port; $this->send($pk); }else{ $pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_1); $pk->serverID = $this->serverID; $pk->mtuSize = strlen($packet->buffer); $pk->ip = $packet->ip; $pk->port = $packet->port; $this->send($pk); } break; case RakNetInfo::OPEN_CONNECTION_REQUEST_2: if($this->invisible === true){ break; } if(!isset($this->blacklist[$packet->ip])){ $this->blacklist[$packet->ip] = array( 'last' => 0, 'count' => 0, ); } $bl = &$this->blacklist[$packet->ip]; if(time() - $bl['last'] < 3){ $bl['count']++; if($bl['count'] % 500==0){ console("[AntiFakeRQ] Block fake request attack from {$packet->ip}, total {$bl['count']}."); } } $bl['last'] = time(); if($bl['count']<3) $this->clients[$CID] = new Player($packet->clientID, $packet->ip, $packet->port, $packet->mtuSize); $pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_2); $pk->serverID = $this->serverID; $pk->port = $this->port; $pk->mtuSize = $packet->mtuSize; $pk->ip = $packet->ip; $pk->port = $packet->port; $this->send($pk); break; } } } } ?>