2013-08-27 17:14:08 +02:00
package nautilus.game.arcade.managers ;
import java.util.ArrayList ;
import mineplex.core.account.CoreClient ;
import mineplex.core.common.CurrencyType ;
import mineplex.core.common.Rank ;
import mineplex.core.common.util.C ;
import mineplex.core.common.util.F ;
import mineplex.core.common.util.UtilPlayer ;
import mineplex.core.donation.Donor ;
import mineplex.core.shop.page.ConfirmationPage ;
import mineplex.minecraft.game.core.combat.event.CombatDeathEvent ;
import mineplex.minecraft.game.core.damage.CustomDamageEvent ;
import nautilus.game.arcade.ArcadeManager ;
2013-09-14 12:03:24 +02:00
import nautilus.game.arcade.GameType ;
2013-08-27 17:14:08 +02:00
import nautilus.game.arcade.game.Game ;
import nautilus.game.arcade.game.GameTeam ;
import nautilus.game.arcade.game.Game.GameState ;
import nautilus.game.arcade.kit.Kit ;
import nautilus.game.arcade.kit.KitAvailability ;
import nautilus.game.arcade.shop.ArcadeShop ;
import nautilus.game.arcade.shop.KitPackage ;
2014-04-25 09:44:14 +02:00
import net.minecraft.server.v1_7_R3.PacketPlayOutEntityMetadata ;
2013-08-27 17:14:08 +02:00
2013-09-14 12:03:24 +02:00
import org.bukkit.ChatColor ;
2014-04-21 02:48:04 +02:00
import org.bukkit.GameMode ;
2013-09-09 10:06:44 +02:00
import org.bukkit.Location ;
2013-08-27 17:14:08 +02:00
import org.bukkit.Sound ;
2014-04-25 09:44:14 +02:00
import org.bukkit.craftbukkit.v1_7_R3.entity.CraftEntity ;
import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer ;
2013-08-27 17:14:08 +02:00
import org.bukkit.entity.Entity ;
import org.bukkit.entity.LivingEntity ;
import org.bukkit.entity.Player ;
import org.bukkit.event.EventHandler ;
import org.bukkit.event.EventPriority ;
import org.bukkit.event.Listener ;
2014-04-08 02:53:41 +02:00
import org.bukkit.event.entity.EntityDamageEvent.DamageCause ;
2014-07-02 22:09:47 +02:00
import org.bukkit.event.player.PlayerCommandPreprocessEvent ;
2013-08-27 17:14:08 +02:00
import org.bukkit.event.player.PlayerInteractEntityEvent ;
import org.bukkit.event.player.PlayerJoinEvent ;
import org.bukkit.event.player.PlayerRespawnEvent ;
public class GamePlayerManager implements Listener
{
ArcadeManager Manager ;
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
public GamePlayerManager ( ArcadeManager manager )
{
Manager = manager ;
2014-05-03 03:23:10 +02:00
2014-01-18 16:02:56 +01:00
Manager . GetPluginManager ( ) . registerEvents ( this , Manager . GetPlugin ( ) ) ;
2013-08-27 17:14:08 +02:00
}
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
@EventHandler ( priority = EventPriority . HIGH )
public void PlayerDeath ( CombatDeathEvent event )
{
//Don't actually die
event . GetEvent ( ) . getEntity ( ) . setHealth ( 20 ) ;
//Dont display message
2013-09-09 10:06:44 +02:00
if ( Manager . GetGame ( ) ! = null )
event . SetBroadcastType ( Manager . GetGame ( ) . GetDeathMessageType ( ) ) ;
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
//Colors
if ( event . GetLog ( ) . GetKiller ( ) ! = null )
{
Player player = UtilPlayer . searchExact ( event . GetLog ( ) . GetKiller ( ) . GetName ( ) ) ;
if ( player ! = null )
event . GetLog ( ) . SetKillerColor ( Manager . GetColor ( player ) + " " ) ;
}
if ( event . GetEvent ( ) . getEntity ( ) instanceof Player )
{
Player player = ( Player ) event . GetEvent ( ) . getEntity ( ) ;
if ( player ! = null )
event . GetLog ( ) . SetKilledColor ( Manager . GetColor ( player ) + " " ) ;
}
}
@EventHandler
public void PlayerJoin ( PlayerJoinEvent event )
{
final Player player = event . getPlayer ( ) ;
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
//Lobby Name
Manager . GetLobby ( ) . AddPlayerToScoreboards ( player , null ) ;
//Lobby Spawn
if ( Manager . GetGame ( ) = = null | | ! Manager . GetGame ( ) . InProgress ( ) )
{
2013-09-09 10:06:44 +02:00
Manager . Clear ( player ) ;
2013-08-27 17:14:08 +02:00
player . teleport ( Manager . GetLobby ( ) . GetSpawn ( ) ) ;
return ;
}
//Game Spawn
if ( Manager . GetGame ( ) . IsAlive ( player ) )
{
2013-09-09 10:06:44 +02:00
Location loc = Manager . GetGame ( ) . GetLocationStore ( ) . remove ( player . getName ( ) ) ;
if ( loc ! = null & & ! loc . getWorld ( ) . getName ( ) . equalsIgnoreCase ( " world " ) )
{
player . teleport ( loc ) ;
}
else
{
Manager . Clear ( player ) ;
player . teleport ( Manager . GetGame ( ) . GetTeam ( player ) . GetSpawn ( ) ) ;
}
2013-08-27 17:14:08 +02:00
}
else
{
2013-09-09 10:06:44 +02:00
Manager . Clear ( player ) ;
2013-08-27 17:14:08 +02:00
Manager . GetGame ( ) . SetSpectator ( player ) ;
UtilPlayer . message ( player , F . main ( " Game " , Manager . GetGame ( ) . GetName ( ) + " is in progress, please wait for next game! " ) ) ;
}
2014-06-10 04:51:47 +02:00
player . setScoreboard ( Manager . GetGame ( ) . GetScoreboard ( ) . GetScoreboard ( ) ) ;
2013-08-27 17:14:08 +02:00
}
@EventHandler
public void PlayerRespawn ( PlayerRespawnEvent event )
{
if ( Manager . GetGame ( ) = = null | | ! Manager . GetGame ( ) . InProgress ( ) )
{
event . setRespawnLocation ( Manager . GetLobby ( ) . GetSpawn ( ) ) ;
return ;
}
Player player = event . getPlayer ( ) ;
if ( Manager . GetGame ( ) . IsAlive ( player ) )
{
event . setRespawnLocation ( Manager . GetGame ( ) . GetTeam ( player ) . GetSpawn ( ) ) ;
}
else
{
Manager . GetGame ( ) . SetSpectator ( player ) ;
event . setRespawnLocation ( Manager . GetGame ( ) . GetSpectatorLocation ( ) ) ;
}
}
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
@EventHandler ( priority = EventPriority . HIGH )
public void TeamInteract ( PlayerInteractEntityEvent event )
{
if ( event . getRightClicked ( ) = = null )
return ;
Player player = event . getPlayer ( ) ;
2014-05-03 03:23:10 +02:00
//Observer
if ( Manager . IsObserver ( player ) )
{
UtilPlayer . message ( player , F . main ( " Game " , " Spectators cannot partake in games. " ) ) ;
return ;
}
2013-08-27 17:14:08 +02:00
GameTeam team = Manager . GetLobby ( ) . GetClickedTeam ( event . getRightClicked ( ) ) ;
if ( team = = null )
return ;
TeamClick ( player , team ) ;
}
@EventHandler
public void TeamDamage ( CustomDamageEvent event )
{
Player player = event . GetDamagerPlayer ( false ) ;
if ( player = = null ) return ;
2014-05-03 03:23:10 +02:00
//Observer
if ( Manager . IsObserver ( player ) )
{
UtilPlayer . message ( player , F . main ( " Game " , " Spectators cannot partake in games. " ) ) ;
return ;
}
2013-08-27 17:14:08 +02:00
LivingEntity target = event . GetDamageeEntity ( ) ;
GameTeam team = Manager . GetLobby ( ) . GetClickedTeam ( target ) ;
if ( team = = null )
return ;
TeamClick ( player , team ) ;
}
public void TeamClick ( final Player player , final GameTeam team )
{
if ( Manager . GetGame ( ) = = null )
return ;
if ( Manager . GetGame ( ) . GetState ( ) ! = GameState . Recruit )
return ;
if ( ! Manager . GetGame ( ) . HasTeam ( team ) )
return ;
AddTeamPreference ( Manager . GetGame ( ) , player , team ) ;
}
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
public void AddTeamPreference ( Game game , Player player , GameTeam team )
{
GameTeam past = game . GetTeamPreference ( player ) ;
GameTeam current = game . GetTeam ( player ) ;
if ( current ! = null & & current . equals ( team ) )
{
game . RemoveTeamPreference ( player ) ;
UtilPlayer . message ( player , F . main ( " Team " , " You are already on " + F . elem ( team . GetFormattedName ( ) ) + " . " ) ) ;
return ;
}
if ( past = = null | | ! past . equals ( team ) )
{
if ( past ! = null )
2013-09-14 12:03:24 +02:00
{
2013-08-27 17:14:08 +02:00
game . RemoveTeamPreference ( player ) ;
2013-09-14 12:03:24 +02:00
}
2013-08-27 17:14:08 +02:00
if ( ! game . GetTeamPreferences ( ) . containsKey ( team ) )
game . GetTeamPreferences ( ) . put ( team , new ArrayList < Player > ( ) ) ;
game . GetTeamPreferences ( ) . get ( team ) . add ( player ) ;
}
2014-06-27 03:38:11 +02:00
UtilPlayer . message ( player , F . main ( " Team " , " You are " + F . elem ( game . GetTeamQueuePosition ( player ) ) + " in queue for " + F . elem ( team . GetFormattedName ( ) + " Team " ) + " . " ) ) ;
2013-08-27 17:14:08 +02:00
}
2014-04-21 02:48:04 +02:00
@EventHandler ( priority = EventPriority . LOWEST )
2013-08-27 17:14:08 +02:00
public void KitInteract ( PlayerInteractEntityEvent event )
{
if ( event . getRightClicked ( ) = = null )
return ;
Player player = event . getPlayer ( ) ;
2014-05-03 03:23:10 +02:00
//Observer
if ( Manager . IsObserver ( player ) )
{
UtilPlayer . message ( player , F . main ( " Game " , " Spectators cannot partake in games. " ) ) ;
return ;
}
2014-04-21 02:48:04 +02:00
if ( player . getGameMode ( ) ! = GameMode . SURVIVAL )
return ;
2013-08-27 17:14:08 +02:00
Kit kit = Manager . GetLobby ( ) . GetClickedKit ( event . getRightClicked ( ) ) ;
if ( kit = = null )
return ;
KitClick ( player , kit , event . getRightClicked ( ) ) ;
2014-05-03 03:23:10 +02:00
2014-04-21 02:48:04 +02:00
event . setCancelled ( true ) ;
2013-08-27 17:14:08 +02:00
}
@EventHandler
public void KitDamage ( CustomDamageEvent event )
{
2014-04-19 06:50:14 +02:00
if ( Manager . GetGame ( ) ! = null & & Manager . GetGame ( ) . InProgress ( ) )
return ;
2014-05-03 03:23:10 +02:00
2014-04-08 02:53:41 +02:00
if ( event . GetCause ( ) ! = DamageCause . ENTITY_ATTACK )
return ;
2014-05-03 03:23:10 +02:00
2013-08-27 17:14:08 +02:00
Player player = event . GetDamagerPlayer ( false ) ;
if ( player = = null ) return ;
2014-05-03 03:23:10 +02:00
//Observer
if ( Manager . IsObserver ( player ) )
{
UtilPlayer . message ( player , F . main ( " Game " , " Spectators cannot partake in games. " ) ) ;
return ;
}
2014-04-21 02:48:04 +02:00
if ( player . getGameMode ( ) ! = GameMode . SURVIVAL )
return ;
2013-08-27 17:14:08 +02:00
LivingEntity target = event . GetDamageeEntity ( ) ;
Kit kit = Manager . GetLobby ( ) . GetClickedKit ( target ) ;
if ( kit = = null )
return ;
KitClick ( player , kit , target ) ;
}
public void KitClick ( final Player player , final Kit kit , final Entity entity )
{
kit . DisplayDesc ( player ) ;
if ( Manager . GetGame ( ) = = null )
return ;
if ( ! Manager . GetGame ( ) . HasKit ( kit ) )
return ;
CoreClient client = Manager . GetClients ( ) . Get ( player ) ;
Donor donor = Manager . GetDonation ( ) . Get ( player . getName ( ) ) ;
if ( kit . GetAvailability ( ) = = KitAvailability . Free | | client . GetRank ( ) . Has ( Rank . ULTRA ) | | donor . OwnsUnknownPackage ( Manager . GetServerConfig ( ) . ServerType + " ULTRA " ) | | donor . OwnsUnknownPackage ( Manager . GetGame ( ) . GetName ( ) + " " + kit . GetName ( ) ) )
{
Manager . GetGame ( ) . SetKit ( player , kit , true ) ;
}
else if ( kit . GetAvailability ( ) = = KitAvailability . Green & & donor . GetBalance ( CurrencyType . Gems ) > kit . GetCost ( ) )
{
Manager . GetShop ( ) . OpenPageForPlayer ( player , new ConfirmationPage < ArcadeManager , ArcadeShop > (
Manager , Manager . GetShop ( ) , Manager . GetClients ( ) , Manager . GetDonation ( ) , new Runnable ( )
{
2014-05-03 03:23:10 +02:00
public void run ( )
{
if ( player . isOnline ( ) )
{
Manager . GetGame ( ) . SetKit ( player , kit , true ) ;
( ( CraftPlayer ) player ) . getHandle ( ) . playerConnection . sendPacket ( new PacketPlayOutEntityMetadata ( entity . getEntityId ( ) , ( ( CraftEntity ) entity ) . getHandle ( ) . getDataWatcher ( ) , true ) ) ;
}
}
} , null , new KitPackage ( Manager . GetGame ( ) . GetName ( ) , kit ) , CurrencyType . Gems , player ) ) ;
2013-08-27 17:14:08 +02:00
}
else
{
player . playSound ( player . getLocation ( ) , Sound . NOTE_BASS , 2f , 0 . 5f ) ;
if ( kit . GetAvailability ( ) = = KitAvailability . Blue )
2013-09-22 00:01:40 +02:00
{
UtilPlayer . message ( player , F . main ( " Kit " , " This kit requires " + F . elem ( C . cAqua + " Ultra " ) + " . " ) ) ;
UtilPlayer . message ( player , F . main ( " Kit " , " Purchase at " + F . elem ( C . cYellow + " www.mineplex.com/shop " ) ) ) ;
}
2013-08-27 17:14:08 +02:00
else
2013-09-22 00:01:40 +02:00
{
UtilPlayer . message ( player , F . main ( " Kit " , " You do not have enough " + F . elem ( C . cGreen + " Gems " ) + " . " ) ) ;
UtilPlayer . message ( player , F . main ( " Kit " , " Purchase more at " + F . elem ( C . cYellow + " www.mineplex.com/shop " ) ) ) ;
}
2013-08-27 17:14:08 +02:00
}
}
2014-07-02 22:09:47 +02:00
@EventHandler ( priority = EventPriority . LOWEST )
public void TeleportCommand ( PlayerCommandPreprocessEvent event )
{
if ( ! event . getMessage ( ) . toLowerCase ( ) . startsWith ( " /tp " ) )
return ;
Game game = Manager . GetGame ( ) ;
if ( game = = null )
return ;
Player player = event . getPlayer ( ) ;
2014-07-05 08:04:46 +02:00
if ( Manager . GetClients ( ) . Get ( player ) . GetRank ( ) . Has ( Rank . MODERATOR ) )
return ;
2014-07-02 22:09:47 +02:00
if ( game . IsAlive ( player ) | | player . getGameMode ( ) ! = GameMode . CREATIVE )
{
UtilPlayer . message ( player , F . main ( " Game " , " Only Spectators can use teleport. " ) ) ;
event . setCancelled ( true ) ;
return ;
}
String [ ] tokens = event . getMessage ( ) . split ( " " ) ;
if ( tokens . length ! = 2 )
{
UtilPlayer . message ( player , F . main ( " Game " , " Invalid Input. " + F . elem ( " /tp <Name> " ) + " . " ) ) ;
event . setCancelled ( true ) ;
return ;
}
Player target = UtilPlayer . searchOnline ( player , tokens [ 1 ] , true ) ;
if ( target ! = null )
{
UtilPlayer . message ( player , F . main ( " Game " , " You teleported to " + F . name ( target . getName ( ) ) + " . " ) ) ;
player . teleport ( target ) ;
event . setCancelled ( true ) ;
}
}
2013-08-27 17:14:08 +02:00
}