2013-08-27 17:14:08 +02:00
package mineplex.hub.server ;
import java.io.BufferedReader ;
import java.io.BufferedWriter ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileWriter ;
import java.io.IOException ;
import java.io.InputStreamReader ;
2013-09-11 22:53:24 +02:00
import java.util.Collection ;
import java.util.HashSet ;
2013-09-18 00:50:23 +02:00
import java.util.List ;
2013-08-27 17:14:08 +02:00
import java.util.Set ;
import org.bukkit.ChatColor ;
2013-09-14 00:25:01 +02:00
import org.bukkit.Material ;
2013-08-27 17:14:08 +02:00
import org.bukkit.entity.Player ;
import org.bukkit.event.EventHandler ;
2013-09-14 00:25:01 +02:00
import org.bukkit.event.EventPriority ;
import org.bukkit.event.player.PlayerInteractEvent ;
import org.bukkit.event.player.PlayerJoinEvent ;
2013-08-27 17:14:08 +02:00
import org.bukkit.plugin.java.JavaPlugin ;
import mineplex.core.MiniPlugin ;
import mineplex.core.account.CoreClientManager ;
import mineplex.core.common.Rank ;
import mineplex.core.common.util.C ;
2013-09-18 00:50:23 +02:00
import mineplex.core.common.util.Callback ;
2013-08-27 17:14:08 +02:00
import mineplex.core.common.util.F ;
import mineplex.core.common.util.NautHashMap ;
import mineplex.core.common.util.UtilPlayer ;
import mineplex.core.common.util.UtilTime ;
import mineplex.core.common.util.UtilTime.TimeUnit ;
import mineplex.core.donation.DonationManager ;
2013-09-14 00:25:01 +02:00
import mineplex.core.itemstack.ItemStackFactory ;
2013-08-27 17:14:08 +02:00
import mineplex.core.portal.Portal ;
2013-09-18 00:50:23 +02:00
import mineplex.core.status.ServerStatusData ;
import mineplex.core.status.ServerStatusManager ;
2013-08-27 17:14:08 +02:00
import mineplex.core.updater.UpdateType ;
import mineplex.core.updater.event.UpdateEvent ;
2013-09-09 10:28:35 +02:00
import mineplex.hub.party.Party ;
import mineplex.hub.party.PartyManager ;
2013-08-27 17:14:08 +02:00
import mineplex.hub.server.command.ServerNpcCommand ;
2013-09-14 00:25:01 +02:00
import mineplex.hub.server.ui.ServerGameMenu ;
2013-08-27 17:14:08 +02:00
import mineplex.hub.server.ui.ServerNpcShop ;
2013-09-19 07:11:49 +02:00
public class ServerManager extends MiniPlugin
2013-08-27 17:14:08 +02:00
{
private CoreClientManager _clientManager ;
private DonationManager _donationManager ;
private Portal _portal ;
2013-09-09 10:28:35 +02:00
private PartyManager _partyManager ;
2013-09-18 00:50:23 +02:00
private ServerStatusManager _statusManager ;
2013-08-27 17:14:08 +02:00
2013-09-11 22:53:24 +02:00
private NautHashMap < String , HashSet < ServerInfo > > _serverNpcMap = new NautHashMap < String , HashSet < ServerInfo > > ( ) ;
2013-08-27 17:14:08 +02:00
private NautHashMap < String , ServerNpcShop > _serverNpcShopMap = new NautHashMap < String , ServerNpcShop > ( ) ;
private NautHashMap < String , ServerInfo > _serverInfoMap = new NautHashMap < String , ServerInfo > ( ) ;
private NautHashMap < String , Long > _serverUpdate = new NautHashMap < String , Long > ( ) ;
2013-09-14 00:25:01 +02:00
private ServerNpcShop _quickShop ;
2013-08-27 17:14:08 +02:00
private boolean _loading = false ;
2013-09-18 00:50:23 +02:00
private boolean _alternateUpdateFire = false ;
private boolean _retrieving = false ;
2013-08-27 17:14:08 +02:00
2013-09-18 00:50:23 +02:00
public ServerManager ( JavaPlugin plugin , CoreClientManager clientManager , DonationManager donationManager , Portal portal , PartyManager partyManager , ServerStatusManager statusManager )
2013-08-27 17:14:08 +02:00
{
super ( " Server Manager " , plugin ) ;
_clientManager = clientManager ;
_donationManager = donationManager ;
_portal = portal ;
2013-09-09 10:28:35 +02:00
_partyManager = partyManager ;
2013-09-18 00:50:23 +02:00
_statusManager = statusManager ;
2013-08-27 17:14:08 +02:00
plugin . getServer ( ) . getMessenger ( ) . registerOutgoingPluginChannel ( plugin , " BungeeCord " ) ;
LoadServers ( ) ;
2013-09-11 22:53:24 +02:00
new ServerManagerUpdater ( this ) ;
2013-09-19 07:11:49 +02:00
_quickShop = new ServerNpcShop ( this , clientManager , donationManager , " Quick Menu " ) ;
2013-08-27 17:14:08 +02:00
}
public void AddCommands ( )
{
AddCommand ( new ServerNpcCommand ( this ) ) ;
}
2013-09-14 00:25:01 +02:00
@EventHandler ( priority = EventPriority . LOW )
public void playerJoin ( PlayerJoinEvent event )
{
2013-09-19 07:11:49 +02:00
event . getPlayer ( ) . getInventory ( ) . addItem ( ItemStackFactory . Instance . CreateStack ( Material . COMPASS . getId ( ) , ( byte ) 0 , 1 , ChatColor . GREEN + " Game Menu " ) ) ;
2013-09-14 00:25:01 +02:00
}
@EventHandler ( priority = EventPriority . LOWEST )
public void playerInteract ( PlayerInteractEvent event )
{
if ( event . getItem ( ) ! = null & & event . getItem ( ) . getType ( ) = = Material . COMPASS )
{
2013-09-19 07:11:49 +02:00
_quickShop . OpenPageForPlayer ( event . getPlayer ( ) , new ServerGameMenu ( this , _quickShop , _clientManager , _donationManager , " " + ChatColor . UNDERLINE + " Quick Game Menu " , event . getPlayer ( ) ) ) ;
2013-09-14 00:25:01 +02:00
}
}
2013-08-27 17:14:08 +02:00
public void AddServer ( String serverNpcName , String serverName )
{
ServerInfo serverInfo = new ServerInfo ( ) ;
serverInfo . Name = serverName ;
2013-09-11 22:53:24 +02:00
if ( _serverInfoMap . containsKey ( serverName ) )
2013-08-27 17:14:08 +02:00
{
2013-09-11 22:53:24 +02:00
_serverInfoMap . remove ( serverName ) ;
_serverUpdate . remove ( serverName ) ;
2013-08-27 17:14:08 +02:00
}
2013-09-11 22:53:24 +02:00
_serverNpcMap . get ( serverNpcName ) . add ( serverInfo ) ;
_serverInfoMap . put ( serverName , serverInfo ) ;
_serverUpdate . put ( serverName , System . currentTimeMillis ( ) ) ;
2013-08-27 17:14:08 +02:00
SaveServers ( ) ;
}
public void RemoveServer ( String serverName )
{
for ( String key : _serverNpcMap . keySet ( ) )
{
_serverNpcMap . get ( key ) . remove ( serverName ) ;
}
_serverInfoMap . remove ( serverName ) ;
}
public void AddServerNpc ( String serverNpcName )
{
2013-09-11 22:53:24 +02:00
_serverNpcMap . put ( serverNpcName , new HashSet < ServerInfo > ( ) ) ;
2013-08-27 17:14:08 +02:00
_serverNpcShopMap . put ( serverNpcName , new ServerNpcShop ( this , _clientManager , _donationManager , serverNpcName ) ) ;
}
public void RemoveServerNpc ( String serverNpcName )
{
2013-09-11 22:53:24 +02:00
Set < ServerInfo > mappedServers = _serverNpcMap . remove ( serverNpcName ) ;
2013-08-27 17:14:08 +02:00
_serverNpcShopMap . remove ( serverNpcName ) ;
if ( mappedServers ! = null )
{
for ( ServerInfo mappedServer : mappedServers )
{
boolean isMappedElseWhere = false ;
for ( String key : _serverNpcMap . keySet ( ) )
{
for ( ServerInfo value : _serverNpcMap . get ( key ) )
{
if ( value . Name . equalsIgnoreCase ( mappedServer . Name ) )
{
isMappedElseWhere = true ;
break ;
}
}
if ( isMappedElseWhere )
break ;
}
if ( ! isMappedElseWhere )
_serverInfoMap . remove ( mappedServer . Name ) ;
}
}
}
2013-09-11 22:53:24 +02:00
public Collection < ServerInfo > GetServerList ( String serverNpcName )
2013-08-27 17:14:08 +02:00
{
return _serverNpcMap . get ( serverNpcName ) ;
}
public Set < String > GetAllServers ( )
{
return _serverInfoMap . keySet ( ) ;
}
public ServerInfo GetServerInfo ( String serverName )
{
return _serverInfoMap . get ( serverName ) ;
}
public boolean HasServerNpc ( String serverNpcName )
{
return _serverNpcMap . containsKey ( serverNpcName ) ;
}
@EventHandler
2013-09-14 00:25:01 +02:00
public void updatePages ( UpdateEvent event )
2013-08-27 17:14:08 +02:00
{
2013-09-14 00:25:01 +02:00
if ( event . getType ( ) ! = UpdateType . FAST )
2013-08-27 17:14:08 +02:00
return ;
2013-09-19 07:11:49 +02:00
_quickShop . UpdatePages ( ) ;
2013-08-27 17:14:08 +02:00
2013-09-14 00:25:01 +02:00
for ( ServerNpcShop shop : _serverNpcShopMap . values ( ) )
2013-08-27 17:14:08 +02:00
{
2013-09-14 00:25:01 +02:00
shop . UpdatePages ( ) ;
2013-08-27 17:14:08 +02:00
}
2013-09-14 00:25:01 +02:00
}
@EventHandler
public void updateServers ( UpdateEvent event )
{
2013-09-18 00:50:23 +02:00
if ( event . getType ( ) ! = UpdateType . SEC | | _retrieving )
2013-09-14 00:25:01 +02:00
return ;
2013-08-27 17:14:08 +02:00
2013-09-18 00:50:23 +02:00
_alternateUpdateFire = ! _alternateUpdateFire ;
if ( ! _alternateUpdateFire )
return ;
_retrieving = true ;
_statusManager . retrieveServerStatuses ( new Callback < List < ServerStatusData > > ( )
2013-08-27 17:14:08 +02:00
{
2013-09-18 00:50:23 +02:00
public void run ( List < ServerStatusData > serverStatusList )
{
for ( ServerStatusData serverStatus : serverStatusList )
2013-08-27 17:14:08 +02:00
{
2013-09-18 00:50:23 +02:00
if ( _serverInfoMap . containsKey ( serverStatus . Name ) )
{
String [ ] args = serverStatus . Motd . split ( " \\ | " ) ;
ServerInfo serverInfo = _serverInfoMap . get ( serverStatus . Name ) ;
serverInfo . MOTD = args . length > 0 ? args [ 0 ] : serverStatus . Motd ;
serverInfo . CurrentPlayers = serverStatus . Players ;
serverInfo . MaxPlayers = serverStatus . MaxPlayers ;
if ( args . length > 1 )
serverInfo . ServerType = args [ 1 ] ;
if ( args . length > 2 )
serverInfo . Game = args [ 2 ] ;
if ( args . length > 3 )
serverInfo . Map = args [ 3 ] ;
_serverUpdate . put ( serverStatus . Name , System . currentTimeMillis ( ) ) ;
}
2013-08-27 17:14:08 +02:00
2013-09-18 00:50:23 +02:00
for ( String name : _serverUpdate . keySet ( ) )
{
if ( _serverUpdate . get ( name ) ! = - 1L & & System . currentTimeMillis ( ) - _serverUpdate . get ( name ) > 5000 )
{
ServerInfo serverInfo = _serverInfoMap . get ( name ) ;
serverInfo . MOTD = ChatColor . DARK_RED + " OFFLINE " ;
serverInfo . CurrentPlayers = 0 ;
serverInfo . MaxPlayers = 0 ;
_serverUpdate . put ( name , - 1L ) ;
}
}
2013-08-27 17:14:08 +02:00
}
2013-09-18 00:50:23 +02:00
// Reset
_retrieving = false ;
2013-08-27 17:14:08 +02:00
}
2013-09-18 00:50:23 +02:00
} ) ;
2013-08-27 17:14:08 +02:00
}
public void Help ( Player caller , String message )
{
UtilPlayer . message ( caller , F . main ( _moduleName , " Commands List: " ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc create <name> " , " <name> is name of npc. " , Rank . OWNER ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc delete <name> " , " <name> is name of npc. " , Rank . OWNER ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc addserver <servernpc> | <name> " , " Adds server. " , Rank . OWNER ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc removeserver <name> " , " Removes server. " , Rank . OWNER ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc listnpcs " , " Lists all server npcs. " , Rank . OWNER ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc listservers <servernpc> " , " Lists all servers. " , Rank . OWNER ) ) ;
UtilPlayer . message ( caller , F . help ( " /servernpc listoffline " , " Shows all servers offline. " , Rank . OWNER ) ) ;
if ( message ! = null )
UtilPlayer . message ( caller , F . main ( _moduleName , ChatColor . RED + message ) ) ;
}
public void Help ( Player caller )
{
Help ( caller , null ) ;
}
2013-09-09 10:28:35 +02:00
public PartyManager getPartyManager ( )
2013-08-27 17:14:08 +02:00
{
2013-09-09 10:28:35 +02:00
return _partyManager ;
}
public void SelectServer ( org . bukkit . entity . Player player , ServerInfo serverInfo )
{
Party party = _partyManager . GetParty ( player ) ;
2013-08-27 17:14:08 +02:00
2013-09-09 10:28:35 +02:00
if ( party ! = null )
{
if ( player . getName ( ) . equals ( party . GetLeader ( ) ) )
{
for ( String name : party . GetPlayers ( ) )
{
Player partyPlayer = UtilPlayer . searchExact ( name ) ;
if ( partyPlayer = = null )
continue ;
if ( _clientManager . Get ( partyPlayer ) . GetRank ( ) . Has ( Rank . ULTRA ) | | _donationManager . Get ( partyPlayer . getName ( ) ) . OwnsUnknownPackage ( serverInfo . ServerType + " ULTRA " ) )
continue ;
partyPlayer . leaveVehicle ( ) ;
partyPlayer . eject ( ) ;
_portal . SendPlayerToServer ( partyPlayer , serverInfo . Name ) ;
}
for ( String name : party . GetPlayers ( ) )
{
Player partyPlayer = UtilPlayer . searchExact ( name ) ;
if ( partyPlayer = = null )
continue ;
if ( _clientManager . Get ( partyPlayer ) . GetRank ( ) . Has ( Rank . ULTRA ) | | _donationManager . Get ( partyPlayer . getName ( ) ) . OwnsUnknownPackage ( serverInfo . ServerType + " ULTRA " ) )
{
partyPlayer . leaveVehicle ( ) ;
partyPlayer . eject ( ) ;
_portal . SendPlayerToServer ( partyPlayer , serverInfo . Name ) ;
}
}
}
}
else
{
player . leaveVehicle ( ) ;
player . eject ( ) ;
_portal . SendPlayerToServer ( player , serverInfo . Name ) ;
}
2013-08-27 17:14:08 +02:00
}
public void ListServerNpcs ( Player caller )
{
UtilPlayer . message ( caller , F . main ( GetName ( ) , " Listing Server Npcs: " ) ) ;
for ( String serverNpc : _serverNpcMap . keySet ( ) )
{
UtilPlayer . message ( caller , F . main ( GetName ( ) , C . cYellow + serverNpc ) ) ;
}
}
public void ListServers ( Player caller , String serverNpcName )
{
UtilPlayer . message ( caller , F . main ( GetName ( ) , " Listing Servers for ' " + serverNpcName + " ': " ) ) ;
for ( ServerInfo serverNpc : _serverNpcMap . get ( serverNpcName ) )
{
UtilPlayer . message ( caller , F . main ( GetName ( ) , C . cYellow + serverNpc . Name + C . cWhite + " - " + serverNpc . MOTD + " " + serverNpc . CurrentPlayers + " / " + serverNpc . MaxPlayers ) ) ;
}
}
public void ListOfflineServers ( Player caller )
{
UtilPlayer . message ( caller , F . main ( GetName ( ) , " Listing Offline Servers: " ) ) ;
for ( ServerInfo serverNpc : _serverInfoMap . values ( ) )
{
if ( serverNpc . MOTD . equalsIgnoreCase ( ChatColor . DARK_RED + " OFFLINE " ) )
{
UtilPlayer . message ( caller , F . main ( GetName ( ) , C . cYellow + serverNpc . Name + C . cWhite + " - " + F . time ( UtilTime . convertString ( System . currentTimeMillis ( ) - _serverUpdate . get ( serverNpc . Name ) , 0 , TimeUnit . FIT ) ) ) ) ;
}
}
}
public void SaveServers ( )
{
if ( _loading )
return ;
FileWriter fstream = null ;
BufferedWriter out = null ;
try
{
fstream = new FileWriter ( " ServerManager.dat " ) ;
out = new BufferedWriter ( fstream ) ;
for ( String key : _serverNpcMap . keySet ( ) )
{
System . out . println ( " Saving serverinfos for " + key ) ;
for ( ServerInfo serverInfo : _serverNpcMap . get ( key ) )
{
out . write ( key + " | " + serverInfo . Name ) ;
out . newLine ( ) ;
}
}
out . close ( ) ;
}
catch ( Exception e )
{
System . err . println ( " ServerManager Save Error: " + e . getMessage ( ) ) ;
}
finally
{
if ( out ! = null )
{
try
{
out . close ( ) ;
}
catch ( IOException e )
{
e . printStackTrace ( ) ;
}
}
if ( fstream ! = null )
{
try
{
fstream . close ( ) ;
}
catch ( IOException e )
{
e . printStackTrace ( ) ;
}
}
}
}
public void LoadServers ( )
{
2013-09-11 22:53:24 +02:00
_serverInfoMap . clear ( ) ;
_serverUpdate . clear ( ) ;
for ( String npcName : _serverNpcMap . keySet ( ) )
{
_serverNpcMap . get ( npcName ) . clear ( ) ;
}
2013-08-27 17:14:08 +02:00
_loading = true ;
FileInputStream fstream = null ;
BufferedReader br = null ;
2013-09-11 22:53:24 +02:00
HashSet < String > npcNames = new HashSet < String > ( ) ;
2013-08-27 17:14:08 +02:00
try
{
File npcFile = new File ( " ServerManager.dat " ) ;
if ( npcFile . exists ( ) )
{
fstream = new FileInputStream ( npcFile ) ;
br = new BufferedReader ( new InputStreamReader ( fstream ) ) ;
String line = br . readLine ( ) ;
while ( line ! = null )
{
String serverNpcName = line . substring ( 0 , line . indexOf ( '|' ) ) . trim ( ) ;
String server = line . substring ( line . indexOf ( '|' ) + 1 ) . trim ( ) ;
if ( ! HasServerNpc ( serverNpcName ) )
{
AddServerNpc ( serverNpcName ) ;
}
AddServer ( serverNpcName , server ) ;
2013-09-11 22:53:24 +02:00
npcNames . add ( serverNpcName ) ;
2013-08-27 17:14:08 +02:00
line = br . readLine ( ) ;
}
}
}
catch ( Exception e )
{
System . out . println ( " ServerManager - Error parsing servers file : " + e . getMessage ( ) ) ;
}
finally
{
if ( br ! = null )
{
try
{
br . close ( ) ;
}
catch ( IOException e )
{
e . printStackTrace ( ) ;
}
}
if ( fstream ! = null )
{
try
{
fstream . close ( ) ;
}
catch ( IOException e )
{
e . printStackTrace ( ) ;
}
}
_loading = false ;
}
2013-09-11 22:53:24 +02:00
for ( String npcName : npcNames )
{
if ( ! _serverNpcShopMap . containsKey ( npcName ) )
_serverNpcShopMap . remove ( npcName ) ;
if ( ! _serverNpcMap . containsKey ( npcName ) )
_serverNpcMap . remove ( npcName ) ;
}
2013-08-27 17:14:08 +02:00
}
2013-09-09 10:28:35 +02:00
public int GetRequiredSlots ( Player player , String serverType )
{
int slots = 0 ;
Party party = _partyManager . GetParty ( player ) ;
if ( party ! = null )
{
if ( player . getName ( ) . equals ( party . GetLeader ( ) ) )
{
for ( String name : party . GetPlayers ( ) )
{
Player partyPlayer = UtilPlayer . searchExact ( name ) ;
if ( partyPlayer = = null )
continue ;
if ( _clientManager . Get ( partyPlayer ) . GetRank ( ) . Has ( Rank . ULTRA ) | | _donationManager . Get ( partyPlayer . getName ( ) ) . OwnsUnknownPackage ( serverType + " ULTRA " ) )
continue ;
slots + + ;
}
}
}
else
{
if ( ! _clientManager . Get ( player ) . GetRank ( ) . Has ( Rank . ULTRA ) & & ! _donationManager . Get ( player . getName ( ) ) . OwnsUnknownPackage ( serverType + " ULTRA " ) )
slots + + ;
}
return slots ;
}
2013-09-19 07:11:49 +02:00
public ServerNpcShop getMixedArcadeShop ( )
{
return _serverNpcShopMap . get ( " Mixed Arcade Games " ) ;
}
public ServerNpcShop getSuperSmashMobsShop ( )
{
return _serverNpcShopMap . get ( " Super Smash Mobs " ) ;
}
public ServerNpcShop getDominateShop ( )
{
return _serverNpcShopMap . get ( " Dominate Beta " ) ;
}
public ServerNpcShop getBridgesShop ( )
{
return _serverNpcShopMap . get ( " The Bridges " ) ;
}
public ServerNpcShop getMinekartShop ( )
{
return _serverNpcShopMap . get ( " play minekart plz " ) ;
}
2013-08-27 17:14:08 +02:00
}