2011-07-18 22:06:02 +02:00
package com.massivecraft.factions.listeners ;
2011-02-06 13:36:11 +01:00
2014-04-04 20:55:21 +02:00
import com.massivecraft.factions.* ;
import com.massivecraft.factions.integration.Worldguard ;
import com.massivecraft.factions.struct.Permission ;
import com.massivecraft.factions.struct.Relation ;
2018-07-18 16:48:25 +02:00
import com.massivecraft.factions.struct.Role ;
2018-10-24 17:25:05 +02:00
import com.massivecraft.factions.util.Particles.ParticleEffect ;
2018-01-04 10:36:51 +01:00
import com.massivecraft.factions.zcore.fperms.Access ;
2018-02-03 21:49:04 +01:00
import com.massivecraft.factions.zcore.fperms.PermissableAction ;
2018-03-19 04:35:07 +01:00
import com.massivecraft.factions.zcore.util.TL ;
2018-10-24 17:25:05 +02:00
import org.bukkit.Bukkit ;
2011-07-20 19:22:03 +02:00
import org.bukkit.Location ;
2011-06-10 21:16:14 +02:00
import org.bukkit.Material ;
2011-02-06 13:36:11 +01:00
import org.bukkit.block.Block ;
2018-10-24 17:25:05 +02:00
import org.bukkit.entity.ArmorStand ;
import org.bukkit.entity.Entity ;
2016-06-11 01:43:48 +02:00
import org.bukkit.entity.EntityType ;
2011-02-06 13:36:11 +01:00
import org.bukkit.entity.Player ;
2012-01-28 11:37:55 +01:00
import org.bukkit.event.EventHandler ;
import org.bukkit.event.EventPriority ;
import org.bukkit.event.Listener ;
2014-04-04 20:55:21 +02:00
import org.bukkit.event.block.* ;
2018-07-26 17:35:56 +02:00
import org.bukkit.inventory.ItemStack ;
2018-10-24 17:25:05 +02:00
import org.bukkit.inventory.meta.ItemMeta ;
import org.bukkit.potion.PotionEffect ;
import org.bukkit.potion.PotionEffectType ;
import java.util.HashMap ;
import java.util.List ;
2014-04-04 20:55:21 +02:00
public class FactionsBlockListener implements Listener {
2014-08-05 17:17:27 +02:00
2018-11-07 06:38:43 +01:00
public static HashMap < String , Location > bannerLocations = new HashMap < > ( ) ;
public SavageFactions savageFactions ;
private HashMap < String , Boolean > bannerCooldownMap = new HashMap < > ( ) ;
2014-04-04 20:55:21 +02:00
2018-11-07 06:38:43 +01:00
public FactionsBlockListener ( SavageFactions savageFactions ) {
this . savageFactions = savageFactions ;
2014-04-04 20:55:21 +02:00
}
2018-11-07 06:38:43 +01:00
public static boolean playerCanBuildDestroyBlock ( Player player , Location location , String action , boolean justCheck ) {
String name = player . getName ( ) ;
if ( Conf . playersWhoBypassAllProtection . contains ( name ) ) {
return true ;
}
FPlayer me = FPlayers . getInstance ( ) . getById ( player . getUniqueId ( ) . toString ( ) ) ;
if ( me . isAdminBypassing ( ) ) {
return true ;
}
FLocation loc = new FLocation ( location ) ;
Faction otherFaction = Board . getInstance ( ) . getFactionAt ( loc ) ;
if ( otherFaction . isWilderness ( ) ) {
if ( Conf . worldGuardBuildPriority & & Worldguard . playerCanBuild ( player , location ) ) {
return true ;
}
2018-11-07 17:14:42 +01:00
if ( ! Conf . wildernessDenyBuild | | Conf . worldsNoWildernessProtection . contains ( location . getWorld ( ) . getName ( ) ) ) {
2018-11-07 06:38:43 +01:00
return true ; // This is not faction territory. Use whatever you like here.
}
2018-11-07 17:14:42 +01:00
if ( ! justCheck ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>You can't " + action + " in the wilderness. " ) ;
}
return false ;
} else if ( otherFaction . isSafeZone ( ) ) {
if ( Conf . worldGuardBuildPriority & & Worldguard . playerCanBuild ( player , location ) ) {
return true ;
}
2018-11-07 17:14:42 +01:00
if ( ! Conf . safeZoneDenyBuild | | Permission . MANAGE_SAFE_ZONE . has ( player ) ) {
2018-11-07 06:38:43 +01:00
return true ;
}
2018-11-07 17:14:42 +01:00
if ( ! justCheck ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>You can't " + action + " in a safe zone. " ) ;
}
return false ;
} else if ( otherFaction . isWarZone ( ) ) {
if ( Conf . worldGuardBuildPriority & & Worldguard . playerCanBuild ( player , location ) ) {
return true ;
}
2018-11-07 17:14:42 +01:00
if ( ! Conf . warZoneDenyBuild | | Permission . MANAGE_WAR_ZONE . has ( player ) ) {
2018-11-07 06:38:43 +01:00
return true ;
}
2018-11-07 17:14:42 +01:00
if ( ! justCheck ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>You can't " + action + " in a war zone. " ) ;
}
return false ;
}
if ( SavageFactions . plugin . getConfig ( ) . getBoolean ( " hcf.raidable " , false ) & & otherFaction . getLandRounded ( ) > = otherFaction . getPowerRounded ( ) ) {
return true ;
}
Faction myFaction = me . getFaction ( ) ;
Relation rel = myFaction . getRelationTo ( otherFaction ) ;
boolean online = otherFaction . hasPlayersOnline ( ) ;
2018-11-07 17:14:42 +01:00
boolean pain = ! justCheck & & rel . confPainBuild ( online ) ;
2018-11-07 06:38:43 +01:00
boolean deny = rel . confDenyBuild ( online ) ;
Access access = otherFaction . getAccess ( me , PermissableAction . fromString ( action ) ) ;
if ( access = = Access . ALLOW & & ( ( rel = = Relation . ALLY ) | | ( rel = = Relation . ENEMY ) | | ( rel = = Relation . NEUTRAL ) | | ( rel = = Relation . TRUCE ) ) ) {
deny = false ;
}
// hurt the player for building/destroying in other territory?
if ( pain ) {
player . damage ( Conf . actionDeniedPainAmount ) ;
2018-11-07 17:14:42 +01:00
if ( ! deny ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>It is painful to try to " + action + " in the territory of " + otherFaction . getTag ( myFaction ) ) ;
}
}
// cancel building/destroying in other territory?
if ( deny ) {
2018-11-07 17:14:42 +01:00
if ( ! justCheck ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>You can't " + action + " in the territory of " + otherFaction . getTag ( myFaction ) ) ;
}
return false ;
}
// Also cancel and/or cause pain if player doesn't have ownership rights for this claim
2018-11-07 17:14:42 +01:00
if ( Conf . ownedAreasEnabled & & ( Conf . ownedAreaDenyBuild | | Conf . ownedAreaPainBuild ) & & ! otherFaction . playerHasOwnershipRights ( me , loc ) ) {
if ( ! pain & & Conf . ownedAreaPainBuild & & ! justCheck ) {
2018-11-07 06:38:43 +01:00
player . damage ( Conf . actionDeniedPainAmount ) ;
2018-11-07 17:14:42 +01:00
if ( ! Conf . ownedAreaDenyBuild ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>It is painful to try to " + action + " in this territory, it is owned by: " + otherFaction . getOwnerListString ( loc ) ) ;
}
}
if ( Conf . ownedAreaDenyBuild ) {
2018-11-07 17:14:42 +01:00
if ( ! justCheck ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>You can't " + action + " in this territory, it is owned by: " + otherFaction . getOwnerListString ( loc ) ) ;
return false ;
}
}
}
// Check the permission just after making sure the land isn't owned by someone else to avoid bypass.
if ( access ! = Access . ALLOW & & me . getRole ( ) ! = Role . LEADER ) {
// TODO: Update this once new access values are added other than just allow / deny.
if ( access = = Access . DENY ) {
me . msg ( TL . GENERIC_NOPERMISSION , action ) ;
return false ;
2018-11-07 17:14:42 +01:00
} else if ( myFaction . getOwnerListString ( loc ) ! = null & & ! myFaction . getOwnerListString ( loc ) . isEmpty ( ) & & ! myFaction . getOwnerListString ( loc ) . contains ( player . getName ( ) ) ) {
2018-11-07 06:38:43 +01:00
me . msg ( " <b>You can't " + action + " in this territory, it is owned by: " + myFaction . getOwnerListString ( loc ) ) ;
return false ;
}
}
return true ;
}
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
2014-04-04 20:55:21 +02:00
public void onBlockPlace ( BlockPlaceEvent event ) {
2018-11-07 17:14:42 +01:00
if ( ! event . canBuild ( ) ) {
2014-07-01 22:10:18 +02:00
return ;
}
2014-04-04 20:55:21 +02:00
// special case for flint&steel, which should only be prevented by DenyUsage list
if ( event . getBlockPlaced ( ) . getType ( ) = = Material . FIRE ) {
return ;
}
2018-11-07 17:14:42 +01:00
if ( ! playerCanBuildDestroyBlock ( event . getPlayer ( ) , event . getBlock ( ) . getLocation ( ) , " build " , false ) ) {
2014-09-25 20:44:35 +02:00
event . setCancelled ( true ) ;
2014-07-01 21:49:42 +02:00
}
2014-04-04 20:55:21 +02:00
}
2018-11-07 06:38:43 +01:00
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
2015-05-12 18:08:42 +02:00
public void onBlockFromTo ( BlockFromToEvent event ) {
2018-11-07 17:14:42 +01:00
if ( ! Conf . handleExploitLiquidFlow ) {
2015-05-12 18:08:42 +02:00
return ;
}
if ( event . getBlock ( ) . isLiquid ( ) ) {
if ( event . getToBlock ( ) . isEmpty ( ) ) {
Faction from = Board . getInstance ( ) . getFactionAt ( new FLocation ( event . getBlock ( ) ) ) ;
Faction to = Board . getInstance ( ) . getFactionAt ( new FLocation ( event . getToBlock ( ) ) ) ;
if ( from = = to ) {
// not concerned with inter-faction events
return ;
}
// from faction != to faction
if ( to . isNormal ( ) ) {
if ( from . isNormal ( ) & & from . getRelationTo ( to ) . isAlly ( ) ) {
return ;
}
event . setCancelled ( true ) ;
}
}
}
}
2018-11-07 06:38:43 +01:00
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
2014-04-04 20:55:21 +02:00
public void onBlockDamage ( BlockDamageEvent event ) {
2018-11-07 17:14:42 +01:00
if ( event . getInstaBreak ( ) & & ! playerCanBuildDestroyBlock ( event . getPlayer ( ) , event . getBlock ( ) . getLocation ( ) , " destroy " , false ) ) {
2014-04-04 20:55:21 +02:00
event . setCancelled ( true ) ;
}
}
2018-11-07 06:38:43 +01:00
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
2014-04-04 20:55:21 +02:00
public void onBlockPistonExtend ( BlockPistonExtendEvent event ) {
2018-11-07 17:14:42 +01:00
if ( ! Conf . pistonProtectionThroughDenyBuild ) {
2014-07-01 22:10:18 +02:00
return ;
}
2014-04-04 20:55:21 +02:00
2014-10-19 07:37:25 +02:00
Faction pistonFaction = Board . getInstance ( ) . getFactionAt ( new FLocation ( event . getBlock ( ) ) ) ;
2014-04-04 20:55:21 +02:00
// target end-of-the-line empty (air) block which is being pushed into, including if piston itself would extend into air
Block targetBlock = event . getBlock ( ) . getRelative ( event . getDirection ( ) , event . getLength ( ) + 1 ) ;
// if potentially pushing into air/water/lava in another territory, we need to check it out
2018-11-07 17:14:42 +01:00
if ( ( targetBlock . isEmpty ( ) | | targetBlock . isLiquid ( ) ) & & ! canPistonMoveBlock ( pistonFaction , targetBlock . getLocation ( ) ) ) {
2014-07-01 22:10:18 +02:00
event . setCancelled ( true ) ;
2014-04-04 20:55:21 +02:00
}
2011-07-20 19:22:03 +02:00
2018-01-05 02:40:27 +01:00
/ *
2014-04-04 20:55:21 +02:00
* note that I originally was testing the territory of each affected block , but since I found that pistons can only push
2018-01-05 02:40:27 +01:00
* up to 12 blocks and the width of any territory is 16 blocks , it should be safe ( and much more lightweight ) to test
* only the final target block as done above
* /
2014-04-04 20:55:21 +02:00
}
2018-07-26 17:35:56 +02:00
@EventHandler
public void onVaultPlace ( BlockPlaceEvent e ) {
if ( e . getItemInHand ( ) . getType ( ) = = Material . CHEST ) {
2018-11-07 06:38:43 +01:00
ItemStack vault = SavageFactions . plugin . createItem ( Material . CHEST , 1 , ( short ) 0 , SavageFactions . plugin . color ( SavageFactions . plugin . getConfig ( ) . getString ( " fvault.Item.Name " ) ) , SavageFactions . plugin . colorList ( SavageFactions . plugin . getConfig ( ) . getStringList ( " fvault.Item.Lore " ) ) ) ;
2018-07-26 20:22:16 +02:00
if ( e . getItemInHand ( ) . isSimilar ( vault ) ) {
2018-07-26 17:35:56 +02:00
FPlayer fme = FPlayers . getInstance ( ) . getByPlayer ( e . getPlayer ( ) ) ;
if ( fme . getFaction ( ) . getVault ( ) ! = null ) {
fme . msg ( TL . COMMAND_GETVAULT_ALREADYSET ) ;
e . setCancelled ( true ) ;
return ;
}
FLocation flocation = new FLocation ( e . getBlockPlaced ( ) . getLocation ( ) ) ;
if ( Board . getInstance ( ) . getFactionAt ( flocation ) ! = fme . getFaction ( ) ) {
fme . msg ( TL . COMMAND_GETVAULT_INVALIDLOCATION ) ;
e . setCancelled ( true ) ;
return ;
}
Block start = e . getBlockPlaced ( ) ;
int radius = 1 ;
for ( double x = start . getLocation ( ) . getX ( ) - radius ; x < = start . getLocation ( ) . getX ( ) + radius ; x + + ) {
for ( double y = start . getLocation ( ) . getY ( ) - radius ; y < = start . getLocation ( ) . getY ( ) + radius ; y + + ) {
for ( double z = start . getLocation ( ) . getZ ( ) - radius ; z < = start . getLocation ( ) . getZ ( ) + radius ; z + + ) {
Location blockLoc = new Location ( e . getPlayer ( ) . getWorld ( ) , x , y , z ) ;
if ( blockLoc . getX ( ) = = start . getLocation ( ) . getX ( ) & & blockLoc . getY ( ) = = start . getLocation ( ) . getY ( ) & & blockLoc . getZ ( ) = = start . getLocation ( ) . getZ ( ) ) {
continue ;
}
2018-07-26 19:16:28 +02:00
Material blockMaterial = blockLoc . getBlock ( ) . getType ( ) ;
2018-11-07 06:38:43 +01:00
if ( blockMaterial = = Material . CHEST | | ( SavageFactions . plugin . getConfig ( ) . getBoolean ( " fvault.No-Hoppers-near-vault " ) & & blockMaterial = = Material . HOPPER ) ) {
2018-07-26 17:35:56 +02:00
e . setCancelled ( true ) ;
fme . msg ( TL . COMMAND_GETVAULT_CHESTNEAR ) ;
return ;
}
}
}
}
fme . msg ( TL . COMMAND_GETVAULT_SUCCESS ) ;
fme . getFaction ( ) . setVault ( e . getBlockPlaced ( ) . getLocation ( ) ) ;
}
}
}
2018-07-26 19:16:28 +02:00
@EventHandler
public void onHopperPlace ( BlockPlaceEvent e ) {
2018-11-07 17:14:42 +01:00
if ( e . getItemInHand ( ) . getType ( ) ! = Material . HOPPER & & ! SavageFactions . plugin . getConfig ( ) . getBoolean ( " fvault.No-Hoppers-near-vault " ) ) {
2018-07-26 19:16:28 +02:00
return ;
}
Faction factionAt = Board . getInstance ( ) . getFactionAt ( new FLocation ( e . getBlockPlaced ( ) . getLocation ( ) ) ) ;
if ( factionAt . isWilderness ( ) | | factionAt . getVault ( ) = = null ) {
return ;
}
FPlayer fme = FPlayers . getInstance ( ) . getByPlayer ( e . getPlayer ( ) ) ;
Block start = e . getBlockPlaced ( ) ;
int radius = 1 ;
for ( double x = start . getLocation ( ) . getX ( ) - radius ; x < = start . getLocation ( ) . getX ( ) + radius ; x + + ) {
for ( double y = start . getLocation ( ) . getY ( ) - radius ; y < = start . getLocation ( ) . getY ( ) + radius ; y + + ) {
for ( double z = start . getLocation ( ) . getZ ( ) - radius ; z < = start . getLocation ( ) . getZ ( ) + radius ; z + + ) {
Location blockLoc = new Location ( e . getPlayer ( ) . getWorld ( ) , x , y , z ) ;
if ( blockLoc . getX ( ) = = start . getLocation ( ) . getX ( ) & & blockLoc . getY ( ) = = start . getLocation ( ) . getY ( ) & & blockLoc . getZ ( ) = = start . getLocation ( ) . getZ ( ) ) {
continue ;
}
if ( blockLoc . getBlock ( ) . getType ( ) = = Material . CHEST ) {
if ( factionAt . getVault ( ) . equals ( blockLoc ) ) {
e . setCancelled ( true ) ;
fme . msg ( TL . COMMAND_VAULT_NO_HOPPER ) ;
return ;
}
}
}
}
}
}
2018-11-07 06:38:43 +01:00
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
2014-04-04 20:55:21 +02:00
public void onBlockPistonRetract ( BlockPistonRetractEvent event ) {
// if not a sticky piston, retraction should be fine
2018-11-07 17:14:42 +01:00
if ( ! event . isSticky ( ) | | ! Conf . pistonProtectionThroughDenyBuild ) {
2014-04-04 20:55:21 +02:00
return ;
}
Location targetLoc = event . getRetractLocation ( ) ;
2014-11-09 02:07:42 +01:00
Faction otherFaction = Board . getInstance ( ) . getFactionAt ( new FLocation ( targetLoc ) ) ;
2014-12-07 21:26:13 +01:00
2014-11-09 02:07:42 +01:00
// Check if the piston is moving in a faction's territory. This disables pistons entirely in faction territory.
2018-11-07 06:38:43 +01:00
if ( otherFaction . isNormal ( ) & & SavageFactions . plugin . getConfig ( ) . getBoolean ( " disable-pistons-in-territory " , false ) ) {
2014-11-09 02:07:42 +01:00
event . setCancelled ( true ) ;
return ;
}
2014-04-04 20:55:21 +02:00
// if potentially retracted block is just air/water/lava, no worries
if ( targetLoc . getBlock ( ) . isEmpty ( ) | | targetLoc . getBlock ( ) . isLiquid ( ) ) {
return ;
}
2014-10-19 07:37:25 +02:00
Faction pistonFaction = Board . getInstance ( ) . getFactionAt ( new FLocation ( event . getBlock ( ) ) ) ;
2014-04-04 20:55:21 +02:00
2018-11-07 17:14:42 +01:00
if ( ! canPistonMoveBlock ( pistonFaction , targetLoc ) ) {
2014-07-01 22:10:18 +02:00
event . setCancelled ( true ) ;
2014-04-04 20:55:21 +02:00
}
}
2018-11-07 06:38:43 +01:00
@EventHandler
public void onBannerPlace ( BlockPlaceEvent e ) {
if ( SavageFactions . plugin . mc17 ) {
2018-10-24 17:25:05 +02:00
return ;
2018-11-07 06:38:43 +01:00
}
if ( e . getItemInHand ( ) . getType ( ) = = SavageFactions . plugin . BANNER ) {
ItemStack bannerInHand = e . getItemInHand ( ) ;
FPlayer fme = FPlayers . getInstance ( ) . getByPlayer ( e . getPlayer ( ) ) ;
ItemStack warBanner = fme . getFaction ( ) . getBanner ( ) ;
if ( warBanner ! = null ) {
ItemMeta warmeta = warBanner . getItemMeta ( ) ;
warmeta . setDisplayName ( SavageFactions . plugin . color ( SavageFactions . plugin . getConfig ( ) . getString ( " fbanners.Item.Name " ) ) ) ;
warmeta . setLore ( SavageFactions . plugin . colorList ( SavageFactions . plugin . getConfig ( ) . getStringList ( " fbanners.Item.Lore " ) ) ) ;
warBanner . setItemMeta ( warmeta ) ;
} else {
warBanner = SavageFactions . plugin . createItem ( SavageFactions . plugin . BANNER , 1 , ( short ) 1 , SavageFactions . plugin . getConfig ( ) . getString ( " fbanners.Item.Name " ) , SavageFactions . plugin . getConfig ( ) . getStringList ( " fbanners.Item.Lore " ) ) ;
2018-10-24 17:25:05 +02:00
}
2018-11-07 06:38:43 +01:00
if ( warBanner . isSimilar ( bannerInHand ) ) {
if ( fme . getFaction ( ) . isWilderness ( ) ) {
fme . msg ( TL . WARBANNER_NOFACTION ) ;
e . setCancelled ( true ) ;
return ;
}
int bannerTime = SavageFactions . plugin . getConfig ( ) . getInt ( " fbanners.Banner-Time " ) * 20 ;
Location placedLoc = e . getBlockPlaced ( ) . getLocation ( ) ;
FLocation fplacedLoc = new FLocation ( placedLoc ) ;
if ( ( Board . getInstance ( ) . getFactionAt ( fplacedLoc ) . isWarZone ( ) & & SavageFactions . plugin . getConfig ( ) . getBoolean ( " fbanners.Placeable.Warzone " ) )
| | ( fme . getFaction ( ) . getRelationTo ( Board . getInstance ( ) . getFactionAt ( fplacedLoc ) ) = = Relation . ENEMY ) & & SavageFactions . plugin . getConfig ( ) . getBoolean ( " fbanners.Placeable.Enemy " ) ) {
if ( bannerCooldownMap . containsKey ( fme . getTag ( ) ) ) {
fme . msg ( TL . WARBANNER_COOLDOWN ) ;
e . setCancelled ( true ) ;
return ;
2018-10-24 17:25:05 +02:00
}
2018-11-07 06:38:43 +01:00
for ( FPlayer fplayer : fme . getFaction ( ) . getFPlayers ( ) ) {
// if (fplayer == fme) { continue; } //Idk if I wanna not send the title to the player
fplayer . getPlayer ( ) . sendTitle ( SavageFactions . plugin . color ( fme . getTag ( ) + " Placed A WarBanner! " ) , SavageFactions . plugin . color ( " &7use &c/f tpbanner&7 to tp to the banner! " ) ) ;
2018-10-24 17:25:05 +02:00
}
2018-11-07 06:38:43 +01:00
bannerCooldownMap . put ( fme . getTag ( ) , true ) ;
bannerLocations . put ( fme . getTag ( ) , e . getBlockPlaced ( ) . getLocation ( ) ) ;
final int bannerCooldown = SavageFactions . plugin . getConfig ( ) . getInt ( " fbanners.Banner-Place-Cooldown " ) ;
final ArmorStand as = ( ArmorStand ) e . getBlockPlaced ( ) . getLocation ( ) . add ( 0 . 5 , 1 , 0 . 5 ) . getWorld ( ) . spawnEntity ( e . getBlockPlaced ( ) . getLocation ( ) . add ( 0 . 5 , 1 , 0 . 5 ) , EntityType . ARMOR_STAND ) ; //Spawn the ArmorStand
as . setVisible ( false ) ; //Makes the ArmorStand invisible
as . setGravity ( false ) ; //Make sure it doesn't fall
as . setCanPickupItems ( false ) ; //I'm not sure what happens if you leave this as it is, but you might as well disable it
as . setCustomName ( SavageFactions . plugin . color ( SavageFactions . plugin . getConfig ( ) . getString ( " fbanners.BannerHolo " ) . replace ( " {Faction} " , fme . getTag ( ) ) ) ) ; //Set this to the text you want
as . setCustomNameVisible ( true ) ; //This makes the text appear no matter if your looking at the entity or not
final ArmorStand armorStand = as ;
final String tag = fme . getTag ( ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SavageFactions . plugin , new Runnable ( ) {
@Override
public void run ( ) {
bannerCooldownMap . remove ( tag ) ;
}
} , Long . parseLong ( bannerCooldown + " " ) ) ;
final Block banner = e . getBlockPlaced ( ) ;
final Material bannerType = banner . getType ( ) ;
final Faction bannerFaction = fme . getFaction ( ) ;
banner . getWorld ( ) . strikeLightningEffect ( banner . getLocation ( ) ) ;
// e.getPlayer().getWorld().playSound(e.getPlayer().getLocation(), Sound.ENTITY_LIGHTNING_IMPACT,2.0F,0.5F);
final int radius = SavageFactions . plugin . getConfig ( ) . getInt ( " fbanners.Banner-Effect-Radius " ) ;
final List < String > effects = SavageFactions . plugin . getConfig ( ) . getStringList ( " fbanners.Effects " ) ;
final int affectorTask = Bukkit . getScheduler ( ) . scheduleSyncRepeatingTask ( SavageFactions . plugin , new Runnable ( ) {
@Override
public void run ( ) {
for ( Entity e : banner . getLocation ( ) . getWorld ( ) . getNearbyEntities ( banner . getLocation ( ) , radius , 255 , radius ) ) {
if ( e instanceof Player ) {
Player player = ( Player ) e ;
FPlayer fplayer = FPlayers . getInstance ( ) . getByPlayer ( player ) ;
if ( fplayer . getFaction ( ) = = bannerFaction ) {
for ( String effect : effects ) {
String [ ] components = effect . split ( " : " ) ;
player . addPotionEffect ( new PotionEffect ( PotionEffectType . getByName ( components [ 0 ] ) , 100 , Integer . parseInt ( components [ 1 ] ) ) ) ;
}
ParticleEffect . LAVA . display ( 1 , 1 , 1 , 1 , 10 , banner . getLocation ( ) , 16 ) ;
ParticleEffect . FLAME . display ( 1 , 1 , 1 , 1 , 10 , banner . getLocation ( ) , 16 ) ;
if ( banner . getType ( ) ! = bannerType ) {
banner . setType ( bannerType ) ;
}
}
}
}
}
} , 0L , 20L ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SavageFactions . plugin , new Runnable ( ) {
@Override
public void run ( ) {
banner . setType ( Material . AIR ) ;
as . remove ( ) ;
banner . getWorld ( ) . strikeLightningEffect ( banner . getLocation ( ) ) ;
Bukkit . getScheduler ( ) . cancelTask ( affectorTask ) ;
bannerLocations . remove ( bannerFaction . getTag ( ) ) ;
}
} , Long . parseLong ( bannerTime + " " ) ) ;
} else {
fme . msg ( TL . WARBANNER_INVALIDLOC ) ;
e . setCancelled ( true ) ;
2018-10-24 17:25:05 +02:00
}
}
}
}
2018-11-07 06:38:43 +01:00
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
2016-06-11 01:43:48 +02:00
public void onFrostWalker ( EntityBlockFormEvent event ) {
if ( event . getEntity ( ) = = null | | event . getEntity ( ) . getType ( ) ! = EntityType . PLAYER | | event . getBlock ( ) = = null ) {
return ;
}
Player player = ( Player ) event . getEntity ( ) ;
Location location = event . getBlock ( ) . getLocation ( ) ;
2016-06-12 01:49:33 +02:00
// only notify every 10 seconds
FPlayer fPlayer = FPlayers . getInstance ( ) . getByPlayer ( player ) ;
boolean justCheck = fPlayer . getLastFrostwalkerMessage ( ) + 10000 > System . currentTimeMillis ( ) ;
2018-11-07 17:14:42 +01:00
if ( ! justCheck ) {
2016-06-12 01:49:33 +02:00
fPlayer . setLastFrostwalkerMessage ( ) ;
}
2016-06-11 01:43:48 +02:00
// Check if they have build permissions here. If not, block this from happening.
2018-11-07 17:14:42 +01:00
if ( ! playerCanBuildDestroyBlock ( player , location , " frostwalk " , justCheck ) ) {
2016-06-11 01:43:48 +02:00
event . setCancelled ( true ) ;
}
}
2014-04-04 20:55:21 +02:00
private boolean canPistonMoveBlock ( Faction pistonFaction , Location target ) {
2014-10-19 07:37:25 +02:00
Faction otherFaction = Board . getInstance ( ) . getFactionAt ( new FLocation ( target ) ) ;
2014-04-04 20:55:21 +02:00
2014-07-01 22:10:18 +02:00
if ( pistonFaction = = otherFaction ) {
return true ;
}
2014-04-04 20:55:21 +02:00
2015-09-08 18:46:48 +02:00
if ( otherFaction . isWilderness ( ) ) {
2018-11-07 17:14:42 +01:00
return ! Conf . wildernessDenyBuild | | Conf . worldsNoWildernessProtection . contains ( target . getWorld ( ) . getName ( ) ) ;
2014-04-04 20:55:21 +02:00
2014-07-01 21:52:40 +02:00
} else if ( otherFaction . isSafeZone ( ) ) {
2018-11-07 17:14:42 +01:00
return ! Conf . safeZoneDenyBuild ;
2014-04-04 20:55:21 +02:00
2014-07-01 21:52:40 +02:00
} else if ( otherFaction . isWarZone ( ) ) {
2018-11-07 17:14:42 +01:00
return ! Conf . warZoneDenyBuild ;
2014-04-04 20:55:21 +02:00
}
Relation rel = pistonFaction . getRelationTo ( otherFaction ) ;
2018-11-07 17:14:42 +01:00
return ! rel . confDenyBuild ( otherFaction . hasPlayersOnline ( ) ) ;
2014-04-04 20:55:21 +02:00
}
2018-07-18 16:48:25 +02:00
2018-11-07 06:38:43 +01:00
@EventHandler ( priority = EventPriority . NORMAL , ignoreCancelled = true )
public void onBlockBreak ( BlockBreakEvent event ) {
2018-11-07 17:14:42 +01:00
if ( ! playerCanBuildDestroyBlock ( event . getPlayer ( ) , event . getBlock ( ) . getLocation ( ) , " destroy " , false ) ) {
2018-11-07 06:38:43 +01:00
event . setCancelled ( true ) ;
return ;
}
FPlayer fme = FPlayers . getInstance ( ) . getByPlayer ( event . getPlayer ( ) ) ;
2018-11-07 17:14:42 +01:00
if ( ! fme . hasFaction ( ) ) {
2018-11-07 06:38:43 +01:00
return ;
}
if ( event . getBlock ( ) . getType ( ) = = SavageFactions . plugin . MOB_SPANWER ) {
2018-11-07 17:14:42 +01:00
if ( ! fme . isAdminBypassing ( ) ) {
2018-11-07 06:38:43 +01:00
Access access = fme . getFaction ( ) . getAccess ( fme , PermissableAction . SPAWNER ) ;
if ( access ! = Access . ALLOW & & fme . getRole ( ) ! = Role . LEADER ) {
fme . msg ( TL . GENERIC_FPERM_NOPERMISSION , " mine spawners " ) ;
return ;
2018-07-18 16:48:25 +02:00
}
}
2018-11-07 06:38:43 +01:00
}
2018-07-18 16:48:25 +02:00
}
2011-02-06 13:36:11 +01:00
}