2016-03-29 13:35:34 +02:00
package com.sekwah.advancedportals.listeners ;
2015-01-15 20:56:13 +01:00
2016-03-29 13:35:34 +02:00
import com.sekwah.advancedportals.AdvancedPortalsPlugin ;
import com.sekwah.advancedportals.ConfigAccessor ;
2016-08-02 05:51:16 +02:00
import com.sekwah.advancedportals.PluginMessages ;
2016-07-31 04:22:43 +02:00
import com.sekwah.advancedportals.api.events.WarpEvent ;
2015-02-08 14:08:50 +01:00
import com.sekwah.advancedportals.portals.AdvancedPortal ;
import com.sekwah.advancedportals.portals.Portal ;
2017-06-10 09:21:14 +02:00
import org.bukkit.Bukkit ;
import org.bukkit.GameMode ;
import org.bukkit.Location ;
import org.bukkit.Material ;
2017-06-11 19:32:53 +02:00
import org.bukkit.block.Block ;
2015-01-15 20:56:13 +01:00
import org.bukkit.entity.Player ;
import org.bukkit.event.EventHandler ;
import org.bukkit.event.EventPriority ;
import org.bukkit.event.Listener ;
import org.bukkit.event.block.Action ;
2017-11-30 19:56:42 +01:00
import org.bukkit.event.entity.CreatureSpawnEvent ;
2015-09-16 23:45:33 +02:00
import org.bukkit.event.entity.EntityCombustEvent ;
import org.bukkit.event.entity.EntityDamageEvent ;
2017-07-14 01:15:08 +02:00
import org.bukkit.event.player.* ;
2017-06-12 16:44:03 +02:00
import org.bukkit.inventory.ItemStack ;
2015-01-15 20:56:13 +01:00
import org.bukkit.metadata.FixedMetadataValue ;
public class Listeners implements Listener {
2016-03-29 13:38:03 +02:00
// The needed config values will be stored so they are easier to access later
// an example is in the interact event in this if statement if((!UseOnlyServerAxe || event.getItem().getItemMeta().getDisplayName().equals("\u00A7eP...
private static boolean UseOnlyServerAxe = false ;
private static Material WandMaterial ;
2016-08-04 05:26:08 +02:00
2016-03-29 13:38:03 +02:00
private final AdvancedPortalsPlugin plugin ;
@SuppressWarnings ( " deprecation " )
public Listeners ( AdvancedPortalsPlugin plugin ) {
this . plugin = plugin ;
ConfigAccessor config = new ConfigAccessor ( plugin , " config.yml " ) ;
UseOnlyServerAxe = config . getConfig ( ) . getBoolean ( " UseOnlyServerMadeAxe " ) ;
String ItemID = config . getConfig ( ) . getString ( " AxeItemId " ) ;
2017-06-12 16:44:03 +02:00
if ( ItemID = = null ) {
WandMaterial = Material . IRON_AXE ;
2016-03-29 13:38:03 +02:00
}
2017-06-12 16:44:03 +02:00
else {
try {
WandMaterial = Material . getMaterial ( Integer . parseInt ( ItemID ) ) ;
} catch ( Exception e ) {
WandMaterial = Material . getMaterial ( ItemID ) ;
}
}
2016-03-29 13:38:03 +02:00
plugin . getServer ( ) . getPluginManager ( ) . registerEvents ( this , plugin ) ;
}
@SuppressWarnings ( " deprecation " )
public static void reloadValues ( AdvancedPortalsPlugin plugin ) {
ConfigAccessor config = new ConfigAccessor ( plugin , " config.yml " ) ;
UseOnlyServerAxe = config . getConfig ( ) . getBoolean ( " UseOnlyServerMadeAxe " ) ;
String ItemID = config . getConfig ( ) . getString ( " AxeItemId " ) ;
try {
WandMaterial = Material . getMaterial ( Integer . parseInt ( ItemID ) ) ;
} catch ( Exception e ) {
WandMaterial = Material . getMaterial ( ItemID ) ;
}
}
2016-07-31 07:17:06 +02:00
@EventHandler
public void onJoinEvent ( PlayerJoinEvent event ) {
2017-07-14 01:15:08 +02:00
Portal . cooldown . put ( event . getPlayer ( ) . getName ( ) , System . currentTimeMillis ( ) ) ;
}
2017-07-17 00:42:22 +02:00
@EventHandler
public void onWorldChangeEvent ( PlayerChangedWorldEvent event ) {
Portal . cooldown . put ( event . getPlayer ( ) . getName ( ) , System . currentTimeMillis ( ) ) ;
}
@EventHandler
public void onTeleportEvent ( PlayerTeleportEvent event ) {
Portal . cooldown . put ( event . getPlayer ( ) . getName ( ) , System . currentTimeMillis ( ) ) ;
}
2017-11-30 19:56:42 +01:00
@EventHandler
public void spawnMobEvent ( CreatureSpawnEvent event ) {
if ( event . getSpawnReason ( ) = = CreatureSpawnEvent . SpawnReason . NETHER_PORTAL & & Portal . inPortalRegion ( event . getLocation ( ) , Portal . getPortalProtectionRadius ( ) ) ) {
event . setCancelled ( true ) ;
}
}
2017-07-14 01:15:08 +02:00
@EventHandler
public void onLeaveEvent ( PlayerQuitEvent event ) {
Portal . cooldown . remove ( event . getPlayer ( ) . getName ( ) ) ;
2016-07-31 07:17:06 +02:00
}
2016-03-29 13:38:03 +02:00
@EventHandler ( priority = EventPriority . HIGHEST )
public void onMoveEvent ( PlayerMoveEvent event ) {
// will check if the player is in the portal or not.
2018-01-14 21:34:48 +01:00
if ( ! Portal . portalsActive | | event . isCancelled ( ) ) {
2016-03-29 13:38:03 +02:00
return ;
}
Player player = event . getPlayer ( ) ;
2016-07-31 04:22:43 +02:00
//Location fromloc = event.getFrom();
2016-03-29 13:38:03 +02:00
Location loc = event . getTo ( ) ;
Location eyeLoc = new Location ( loc . getWorld ( ) , loc . getX ( ) , loc . getY ( ) + player . getEyeHeight ( ) , loc . getZ ( ) ) ;
2017-05-19 07:09:57 +02:00
for ( AdvancedPortal portal : Portal . portals ) {
2016-08-04 05:26:08 +02:00
if ( Portal . locationInPortalTrigger ( portal , loc ) | | Portal . locationInPortalTrigger ( portal , eyeLoc ) ) {
2017-06-13 19:06:48 +02:00
if ( portal . getTrigger ( ) . equals ( Material . PORTAL ) ) {
2016-08-01 08:45:24 +02:00
if ( player . getGameMode ( ) . equals ( GameMode . CREATIVE ) ) {
player . setMetadata ( " hasWarped " , new FixedMetadataValue ( plugin , true ) ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( plugin , new RemoveWarpData ( player ) , 10 ) ;
}
2017-06-13 19:06:48 +02:00
} else if ( portal . getTrigger ( ) . equals ( Material . LAVA ) ) {
2016-08-01 08:45:24 +02:00
player . setMetadata ( " lavaWarped " , new FixedMetadataValue ( plugin , true ) ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( plugin , new RemoveLavaData ( player ) , 10 ) ;
}
2016-08-03 00:59:15 +02:00
if ( portal . inPortal . contains ( player ) ) return ;
WarpEvent warpEvent = new WarpEvent ( player , portal ) ;
plugin . getServer ( ) . getPluginManager ( ) . callEvent ( warpEvent ) ;
2017-06-13 19:06:48 +02:00
2018-01-14 21:34:48 +01:00
if ( ! warpEvent . isCancelled ( ) ) Portal . activate ( player , portal ) ;
2017-06-13 19:06:48 +02:00
2016-08-01 08:45:24 +02:00
portal . inPortal . add ( player ) ;
} else portal . inPortal . remove ( player ) ;
2016-03-29 13:38:03 +02:00
}
}
2016-03-29 14:44:39 +02:00
// These are here because java 7 can only take finals straight into a runnable
class RemoveLavaData implements Runnable {
private Player player ;
public RemoveLavaData ( Player player ) {
this . player = player ;
}
@Override
public void run ( ) {
player . removeMetadata ( " lavaWarped " , plugin ) ;
player . setFireTicks ( 0 ) ;
}
} ;
class RemoveWarpData implements Runnable {
private Player player ;
public RemoveWarpData ( Player player ) {
this . player = player ;
}
@Override
public void run ( ) {
if ( player ! = null & & player . isOnline ( ) ) {
player . removeMetadata ( " hasWarped " , plugin ) ;
}
}
} ;
2016-03-29 13:38:03 +02:00
@EventHandler
public void onCombustEntityEvent ( EntityCombustEvent event ) {
2016-08-01 08:45:24 +02:00
if ( Portal . inPortalTriggerRegion ( event . getEntity ( ) . getLocation ( ) ) )
event . setCancelled ( true ) ;
2016-03-29 13:38:03 +02:00
}
2016-04-01 23:52:38 +02:00
2016-03-29 13:38:03 +02:00
@EventHandler
public void onDamEvent ( EntityDamageEvent event ) {
if ( event . getCause ( ) = = EntityDamageEvent . DamageCause . LAVA | | event . getCause ( ) = = EntityDamageEvent . DamageCause . FIRE | | event . getCause ( ) = = EntityDamageEvent . DamageCause . FIRE_TICK ) {
2016-08-01 08:45:24 +02:00
if ( event . getEntity ( ) . hasMetadata ( " lavaWarped " ) | Portal . inPortalTriggerRegion ( event . getEntity ( ) . getLocation ( ) ) )
2016-03-29 13:38:03 +02:00
event . setCancelled ( true ) ;
}
}
@EventHandler
public void onPortalEvent ( PlayerPortalEvent event ) {
Player player = event . getPlayer ( ) ;
2017-06-11 19:32:53 +02:00
if ( player . hasMetadata ( " hasWarped " ) | Portal . inPortalRegion ( event . getFrom ( ) , 1 ) )
2016-03-29 13:38:03 +02:00
event . setCancelled ( true ) ;
}
@EventHandler
public void onItemInteract ( PlayerInteractEvent event ) {
// will detect if the player is using an axe so the points of a portal can be set
// also any other detections such as sign interaction or basic block protection
Player player = event . getPlayer ( ) ;
if ( player . hasMetadata ( " selectingPortal " ) & & ( event . getAction ( ) = = Action . LEFT_CLICK_BLOCK | | event . getAction ( ) = = Action . RIGHT_CLICK_BLOCK ) ) {
2017-05-19 07:09:57 +02:00
for ( AdvancedPortal portal : Portal . portals ) {
2016-08-01 08:45:24 +02:00
if ( Portal . locationInPortal ( portal , event . getClickedBlock ( ) . getLocation ( ) , 0 ) ) {
2017-06-13 19:06:48 +02:00
player . sendMessage ( PluginMessages . customPrefix + " \ u00A7a You have selected: \ u00A7e " + portal . getName ( ) ) ;
player . setMetadata ( " selectedPortal " , new FixedMetadataValue ( plugin , portal . getName ( ) ) ) ; // adds the name to the metadata of the character
2016-08-01 08:45:24 +02:00
event . setCancelled ( true ) ;
player . removeMetadata ( " selectingPortal " , plugin ) ;
return ;
2016-03-29 13:38:03 +02:00
}
}
2016-08-02 05:51:16 +02:00
player . sendMessage ( PluginMessages . customPrefixFail + " \ u00A7c No portal was selected. If you would like to stop selecting please type \ u00A7e/portal select \ u00A7cagain! " ) ;
2016-03-29 13:38:03 +02:00
event . setCancelled ( true ) ;
return ;
}
2017-06-11 19:32:53 +02:00
if ( player . hasPermission ( " advancedportals.createportal " ) ) {
2016-03-29 13:38:03 +02:00
// UseOnlyServerMadeAxe being set to true makes is so only the axe generated by the server can be used so other iron axes can be used normally,
// by default its false but it is a nice feature in case the user wants to use the axe normally too, such as a admin playing survival or it being used
// as a weapon.
// Null pointer exeption detected here on some servers(try decompiling the jar file to double check)
/ * try {
2015-12-08 15:28:33 +01:00
// Use this to surround the code if needed
}
catch ( NullPointerException e ) {
} * /
2017-06-13 03:33:47 +02:00
if ( event . getItem ( ) ! = null & & event . getItem ( ) . getType ( ) = = WandMaterial // was type id
2017-06-12 16:44:03 +02:00
& & ( ! UseOnlyServerAxe | | ( checkItemForName ( event . getItem ( ) ) & & event . getItem ( ) . getItemMeta ( ) . getDisplayName ( ) . equals ( " \ u00A7ePortal Region Selector " ) ) ) ) {
2016-03-29 13:38:03 +02:00
// This checks if the action was a left or right click and if it was directly effecting a block.
if ( event . getAction ( ) = = Action . LEFT_CLICK_BLOCK ) {
Location blockloc = event . getClickedBlock ( ) . getLocation ( ) ;
// stores the selection as metadata on the character so then it isn't saved anywhere, if the player logs out it will
// have to be selected again if the player joins, also it does not affect any other players.
player . setMetadata ( " Pos1X " , new FixedMetadataValue ( plugin , blockloc . getBlockX ( ) ) ) ;
player . setMetadata ( " Pos1Y " , new FixedMetadataValue ( plugin , blockloc . getBlockY ( ) ) ) ;
player . setMetadata ( " Pos1Z " , new FixedMetadataValue ( plugin , blockloc . getBlockZ ( ) ) ) ;
player . setMetadata ( " Pos1World " , new FixedMetadataValue ( plugin , blockloc . getWorld ( ) . getName ( ) ) ) ;
2017-06-11 19:32:53 +02:00
player . sendMessage ( " \ u00A7eYou have selected pos1! X: " + blockloc . getBlockX ( ) + " Y: " + blockloc . getBlockY ( )
+ " Z: " + blockloc . getBlockZ ( ) + " World: " + blockloc . getWorld ( ) . getName ( ) ) ;
2016-03-29 13:38:03 +02:00
// Stops the event so the block is not damaged
event . setCancelled ( true ) ;
// Returns the event so no more code is executed(stops unnecessary code being executed)
} else if ( event . getAction ( ) = = Action . RIGHT_CLICK_BLOCK ) {
Location blockloc = event . getClickedBlock ( ) . getLocation ( ) ;
player . setMetadata ( " Pos2X " , new FixedMetadataValue ( plugin , blockloc . getBlockX ( ) ) ) ;
player . setMetadata ( " Pos2Y " , new FixedMetadataValue ( plugin , blockloc . getBlockY ( ) ) ) ;
player . setMetadata ( " Pos2Z " , new FixedMetadataValue ( plugin , blockloc . getBlockZ ( ) ) ) ;
player . setMetadata ( " Pos2World " , new FixedMetadataValue ( plugin , blockloc . getWorld ( ) . getName ( ) ) ) ;
2017-06-11 19:32:53 +02:00
player . sendMessage ( " \ u00A7eYou have selected pos2! X: " + blockloc . getBlockX ( ) + " Y: " + blockloc . getBlockY ( )
+ " Z: " + blockloc . getBlockZ ( ) + " World: " + blockloc . getWorld ( ) . getName ( ) ) ;
2016-03-29 13:38:03 +02:00
// Stops the event so the block is not interacted with
event . setCancelled ( true ) ;
// Returns the event so no more code is executed(stops unnecessary code being executed)
}
2017-06-12 16:44:03 +02:00
} else if ( checkItemForName ( event . getItem ( ) ) & & event . getItem ( ) . getItemMeta ( ) . getDisplayName ( ) . equals ( " \ u00A75Portal Block Placer " ) & &
2017-06-12 15:53:27 +02:00
event . getAction ( ) = = Action . LEFT_CLICK_BLOCK & & event . getClickedBlock ( ) . getType ( ) = = Material . PORTAL ) {
2017-06-11 19:32:53 +02:00
Block block = event . getClickedBlock ( ) ;
2017-06-12 15:53:27 +02:00
if ( block . getData ( ) = = 1 ) {
2017-06-11 19:32:53 +02:00
block . setData ( ( byte ) 2 ) ;
2017-06-12 15:53:27 +02:00
} else {
2017-06-11 19:32:53 +02:00
block . setData ( ( byte ) 1 ) ;
}
event . setCancelled ( true ) ;
}
2016-03-29 13:38:03 +02:00
}
}
2015-09-16 23:45:33 +02:00
2017-06-12 16:44:03 +02:00
private boolean checkItemForName ( ItemStack item ) {
return item ! = null & & item . hasItemMeta ( ) & & item . getItemMeta ( ) . hasDisplayName ( ) ;
}
2015-09-16 23:45:33 +02:00
2015-01-15 20:56:13 +01:00
}