2011-07-18 22:06:02 +02:00
package com.massivecraft.factions.listeners ;
2011-02-06 13:36:11 +01:00
2012-03-19 13:59:44 +01:00
import java.util.HashMap ;
2011-08-04 07:07:38 +02:00
import java.util.Iterator ;
2012-03-19 13:59:44 +01:00
import java.util.Map ;
2011-02-06 13:36:11 +01:00
2011-03-23 17:39:56 +01:00
import org.bukkit.Location ;
2011-03-23 12:00:38 +01:00
import org.bukkit.Material ;
2011-03-08 13:06:52 +01:00
import org.bukkit.block.Block ;
2011-03-22 18:48:09 +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 ;
2011-03-30 06:37:32 +02:00
import org.bukkit.event.block.Action ;
2011-03-30 11:23:20 +02:00
import org.bukkit.event.player.PlayerBucketEmptyEvent ;
import org.bukkit.event.player.PlayerBucketFillEvent ;
2011-03-30 06:37:32 +02:00
import org.bukkit.event.player.PlayerInteractEvent ;
import org.bukkit.event.player.PlayerJoinEvent ;
2011-10-05 07:33:15 +02:00
import org.bukkit.event.player.PlayerKickEvent ;
2011-02-06 13:36:11 +01:00
import org.bukkit.event.player.PlayerMoveEvent ;
2011-05-29 23:28:29 +02:00
import org.bukkit.event.player.PlayerQuitEvent ;
2011-03-23 17:39:56 +01:00
import org.bukkit.event.player.PlayerRespawnEvent ;
2012-03-19 13:59:44 +01:00
import org.bukkit.util.NumberConversions ;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.Board ;
import com.massivecraft.factions.Conf ;
import com.massivecraft.factions.FLocation ;
import com.massivecraft.factions.FPlayer ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.FPlayers ;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.Faction ;
import com.massivecraft.factions.Factions ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.P ;
2011-10-05 12:13:54 +02:00
import com.massivecraft.factions.integration.SpoutFeatures ;
2011-10-08 23:22:02 +02:00
import com.massivecraft.factions.struct.Permission ;
2011-08-04 07:07:38 +02:00
import com.massivecraft.factions.struct.Relation ;
2011-12-18 14:47:15 +01:00
import com.massivecraft.factions.struct.Role ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.zcore.util.TextUtil ;
2011-02-06 13:36:11 +01:00
2011-03-08 13:06:52 +01:00
2012-01-28 11:37:55 +01:00
public class FactionsPlayerListener implements Listener
2011-10-08 22:03:44 +02:00
{
public P p ;
public FactionsPlayerListener ( P p )
{
this . p = p ;
}
2011-04-26 03:29:47 +02:00
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . NORMAL )
2011-10-08 22:03:44 +02:00
public void onPlayerJoin ( PlayerJoinEvent event )
{
2011-03-22 18:48:09 +01:00
// Make sure that all online players do have a fplayer.
2011-10-08 22:03:44 +02:00
final FPlayer me = FPlayers . i . get ( event . getPlayer ( ) ) ;
2011-03-22 20:36:33 +01:00
// Update the lastLoginTime for this fplayer
me . setLastLoginTime ( System . currentTimeMillis ( ) ) ;
2012-02-26 23:55:57 +01:00
2012-11-06 16:43:30 +01:00
// Store player's current FLocation and notify them where they are
me . setLastStoodAt ( new FLocation ( event . getPlayer ( ) . getLocation ( ) ) ) ;
if ( ! SpoutFeatures . updateTerritoryDisplay ( me ) )
me . sendFactionHereMessage ( ) ;
2011-10-23 16:03:28 +02:00
SpoutFeatures . updateAppearancesShortly ( event . getPlayer ( ) ) ;
2011-02-06 13:36:11 +01:00
}
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . NORMAL )
2012-03-13 14:26:54 +01:00
public void onPlayerQuit ( PlayerQuitEvent event )
{
2011-10-08 22:03:44 +02:00
FPlayer me = FPlayers . i . get ( event . getPlayer ( ) ) ;
2012-02-26 23:55:57 +01:00
// Make sure player's power is up to date when they log off.
2011-05-29 23:28:29 +02:00
me . getPower ( ) ;
2012-02-26 23:55:57 +01:00
// and update their last login time to point to when the logged off, for auto-remove routine
me . setLastLoginTime ( System . currentTimeMillis ( ) ) ;
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
Faction myFaction = me . getFaction ( ) ;
2011-10-08 22:03:44 +02:00
if ( myFaction ! = null )
{
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
myFaction . memberLoggedOff ( ) ;
}
2011-10-05 12:13:54 +02:00
SpoutFeatures . playerDisconnect ( me ) ;
2011-05-29 23:28:29 +02:00
}
2012-11-06 16:43:30 +01:00
@EventHandler ( priority = EventPriority . MONITOR )
2011-10-08 22:03:44 +02:00
public void onPlayerMove ( PlayerMoveEvent event )
{
2012-11-06 16:43:30 +01:00
if ( event . isCancelled ( ) ) return ;
// quick check to make sure player is moving between chunks; good performance boost
if
(
event . getFrom ( ) . getBlockX ( ) > > 4 = = event . getTo ( ) . getBlockX ( ) > > 4
& &
event . getFrom ( ) . getBlockZ ( ) > > 4 = = event . getTo ( ) . getBlockZ ( ) > > 4
& &
event . getFrom ( ) . getWorld ( ) = = event . getTo ( ) . getWorld ( )
)
return ;
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
Player player = event . getPlayer ( ) ;
2011-10-08 22:03:44 +02:00
FPlayer me = FPlayers . i . get ( player ) ;
2011-02-13 17:04:06 +01:00
2011-02-06 13:36:11 +01:00
// Did we change coord?
2011-03-22 18:48:09 +01:00
FLocation from = me . getLastStoodAt ( ) ;
2012-11-06 16:43:30 +01:00
FLocation to = new FLocation ( event . getTo ( ) ) ;
2011-03-22 18:48:09 +01:00
2011-10-08 22:03:44 +02:00
if ( from . equals ( to ) )
{
2011-02-06 13:36:11 +01:00
return ;
}
// Yes we did change coord (:
2011-03-22 18:48:09 +01:00
me . setLastStoodAt ( to ) ;
2011-12-16 07:31:23 +01:00
// Did we change "host"(faction)?
boolean spoutClient = SpoutFeatures . availableFor ( player ) ;
Faction factionFrom = Board . getFactionAt ( from ) ;
Faction factionTo = Board . getFactionAt ( to ) ;
boolean changedFaction = ( factionFrom ! = factionTo ) ;
if ( changedFaction & & SpoutFeatures . updateTerritoryDisplay ( me ) )
changedFaction = false ;
2011-10-08 22:03:44 +02:00
if ( me . isMapAutoUpdating ( ) )
{
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
me . sendMessage ( Board . getMap ( me . getFaction ( ) , to , player . getLocation ( ) . getYaw ( ) ) ) ;
2011-12-16 07:31:23 +01:00
if ( spoutClient & & Conf . spoutTerritoryOwnersShow )
SpoutFeatures . updateOwnerList ( me ) ;
2011-10-08 22:03:44 +02:00
}
else
{
2011-08-23 06:31:37 +02:00
Faction myFaction = me . getFaction ( ) ;
String ownersTo = myFaction . getOwnerListString ( to ) ;
2011-10-13 21:30:47 +02:00
2011-12-16 07:31:23 +01:00
if ( changedFaction )
2011-10-08 22:03:44 +02:00
{
2011-02-06 13:36:11 +01:00
me . sendFactionHereMessage ( ) ;
2011-10-13 21:09:47 +02:00
if
(
Conf . ownedAreasEnabled
& &
Conf . ownedMessageOnBorder
& &
(
2011-10-13 21:30:47 +02:00
! spoutClient
2011-10-13 21:09:47 +02:00
| |
! Conf . spoutTerritoryOwnersShow
)
& &
myFaction = = factionTo
& &
! ownersTo . isEmpty ( )
)
2011-10-08 22:03:44 +02:00
{
2011-08-23 06:31:37 +02:00
me . sendMessage ( Conf . ownedLandMessage + ownersTo ) ;
}
}
2011-10-13 21:30:47 +02:00
else if ( spoutClient & & Conf . spoutTerritoryOwnersShow )
2011-10-13 21:09:47 +02:00
{
SpoutFeatures . updateOwnerList ( me ) ;
}
else if
(
Conf . ownedAreasEnabled
& &
Conf . ownedMessageInsideTerritory
& &
factionFrom = = factionTo
& &
myFaction = = factionTo
)
2011-10-08 22:03:44 +02:00
{
2011-08-23 06:31:37 +02:00
String ownersFrom = myFaction . getOwnerListString ( from ) ;
2011-10-08 22:03:44 +02:00
if ( Conf . ownedMessageByChunk | | ! ownersFrom . equals ( ownersTo ) )
{
if ( ! ownersTo . isEmpty ( ) )
2011-08-23 06:31:37 +02:00
me . sendMessage ( Conf . ownedLandMessage + ownersTo ) ;
2011-10-08 22:03:44 +02:00
else if ( ! Conf . publicLandMessage . isEmpty ( ) )
2011-08-23 06:31:37 +02:00
me . sendMessage ( Conf . publicLandMessage ) ;
}
2011-02-06 13:36:11 +01:00
}
}
2011-06-10 21:26:12 +02:00
2011-10-22 17:03:49 +02:00
if ( me . getAutoClaimFor ( ) ! = null )
2011-10-08 22:03:44 +02:00
{
2012-11-06 16:43:30 +01:00
me . attemptClaim ( me . getAutoClaimFor ( ) , event . getTo ( ) , true ) ;
2011-06-10 21:26:12 +02:00
}
2011-10-09 14:53:38 +02:00
else if ( me . isAutoSafeClaimEnabled ( ) )
2011-10-08 22:03:44 +02:00
{
2011-10-08 23:22:02 +02:00
if ( ! Permission . MANAGE_SAFE_ZONE . has ( player ) )
2011-10-08 22:03:44 +02:00
{
2011-10-09 14:53:38 +02:00
me . setIsAutoSafeClaimEnabled ( false ) ;
2011-10-08 22:03:44 +02:00
}
else
{
2012-11-06 16:43:30 +01:00
if ( ! Board . getFactionAt ( to ) . isSafeZone ( ) )
2011-10-08 22:03:44 +02:00
{
2012-11-06 16:43:30 +01:00
Board . setFactionAt ( Factions . i . getSafeZone ( ) , to ) ;
2011-10-21 18:14:04 +02:00
me . msg ( " <i>This land is now a safe zone. " ) ;
2011-06-10 21:26:12 +02:00
}
}
}
2011-10-09 14:53:38 +02:00
else if ( me . isAutoWarClaimEnabled ( ) )
2011-10-08 22:03:44 +02:00
{
2011-10-08 23:22:02 +02:00
if ( ! Permission . MANAGE_WAR_ZONE . has ( player ) )
2011-10-08 22:03:44 +02:00
{
2011-10-09 14:53:38 +02:00
me . setIsAutoWarClaimEnabled ( false ) ;
2011-10-08 22:03:44 +02:00
}
else
{
2012-11-06 16:43:30 +01:00
if ( ! Board . getFactionAt ( to ) . isWarZone ( ) )
2011-10-08 22:03:44 +02:00
{
2012-11-06 16:43:30 +01:00
Board . setFactionAt ( Factions . i . getWarZone ( ) , to ) ;
2011-10-21 18:14:04 +02:00
me . msg ( " <i>This land is now a war zone. " ) ;
2011-06-10 21:26:12 +02:00
}
}
}
2011-02-06 13:36:11 +01:00
}
2011-03-08 13:06:52 +01:00
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . NORMAL )
2012-03-13 14:26:54 +01:00
public void onPlayerInteract ( PlayerInteractEvent event )
{
2011-10-08 22:03:44 +02:00
if ( event . isCancelled ( ) ) return ;
2012-11-06 22:01:34 +01:00
// only need to check right-clicks and physical as of MC 1.4+; good performance boost
if ( event . getAction ( ) ! = Action . RIGHT_CLICK_BLOCK & & event . getAction ( ) ! = Action . PHYSICAL ) return ;
2011-03-10 01:21:17 +01:00
2011-03-30 06:37:32 +02:00
Block block = event . getClickedBlock ( ) ;
Player player = event . getPlayer ( ) ;
2012-11-06 16:43:30 +01:00
if ( block = = null ) return ; // clicked in air, apparently
2011-04-04 15:34:32 +02:00
2011-10-08 22:03:44 +02:00
if ( ! canPlayerUseBlock ( player , block , false ) )
{
2011-03-30 06:37:32 +02:00
event . setCancelled ( true ) ;
2012-03-19 13:59:44 +01:00
if ( Conf . handleExploitInteractionSpam )
{
String name = player . getName ( ) ;
InteractAttemptSpam attempt = interactSpammers . get ( name ) ;
if ( attempt = = null )
{
attempt = new InteractAttemptSpam ( ) ;
interactSpammers . put ( name , attempt ) ;
}
int count = attempt . increment ( ) ;
if ( count > = 10 )
{
FPlayer me = FPlayers . i . get ( name ) ;
me . msg ( " <b>Ouch, that is starting to hurt. You should give it a rest. " ) ;
player . damage ( NumberConversions . floor ( ( double ) count / 10 ) ) ;
}
}
2011-03-30 06:37:32 +02:00
return ;
}
2011-04-04 15:34:32 +02:00
2012-11-06 22:01:34 +01:00
if ( event . getAction ( ) ! = Action . RIGHT_CLICK_BLOCK ) return ; // only interested on right-clicks for below
2012-03-19 13:59:44 +01:00
if ( ! playerCanUseItemHere ( player , block . getLocation ( ) , event . getMaterial ( ) , false ) )
2012-01-28 10:16:28 +01:00
{
event . setCancelled ( true ) ;
return ;
}
2012-03-19 13:59:44 +01:00
}
2012-01-28 10:16:28 +01:00
2012-03-19 13:59:44 +01:00
// for handling people who repeatedly spam attempts to open a door (or similar) in another faction's territory
private Map < String , InteractAttemptSpam > interactSpammers = new HashMap < String , InteractAttemptSpam > ( ) ;
private static class InteractAttemptSpam
{
private int attempts = 0 ;
private long lastAttempt = System . currentTimeMillis ( ) ;
// returns the current attempt count
public int increment ( )
2011-10-08 22:03:44 +02:00
{
2012-03-19 13:59:44 +01:00
long Now = System . currentTimeMillis ( ) ;
if ( Now > lastAttempt + 2000 )
attempts = 1 ;
else
attempts + + ;
lastAttempt = Now ;
return attempts ;
2011-03-08 13:06:52 +01:00
}
}
2011-03-30 06:37:32 +02:00
2012-03-19 13:59:44 +01:00
2011-10-08 22:03:44 +02:00
public static boolean playerCanUseItemHere ( Player player , Location location , Material material , boolean justCheck )
{
2012-03-11 19:36:07 +01:00
String name = player . getName ( ) ;
if ( Conf . playersWhoBypassAllProtection . contains ( name ) ) return true ;
FPlayer me = FPlayers . i . get ( name ) ;
if ( me . isAdminBypassing ( ) ) return true ;
2011-04-04 14:16:53 +02:00
2011-10-05 05:46:11 +02:00
FLocation loc = new FLocation ( location ) ;
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
Faction otherFaction = Board . getFactionAt ( loc ) ;
2011-03-08 13:06:52 +01:00
2011-10-13 05:31:18 +02:00
if ( otherFaction . hasPlayersOnline ( ) )
{
2011-10-08 22:03:44 +02:00
if ( ! Conf . territoryDenyUseageMaterials . contains ( material ) )
2011-06-04 11:36:28 +02:00
return true ; // Item isn't one we're preventing for online factions.
2011-10-08 22:03:44 +02:00
}
else
{
if ( ! Conf . territoryDenyUseageMaterialsWhenOffline . contains ( material ) )
2011-06-04 11:36:28 +02:00
return true ; // Item isn't one we're preventing for offline factions.
}
2011-03-08 13:06:52 +01:00
2011-10-08 22:03:44 +02:00
if ( otherFaction . isNone ( ) )
{
2011-10-09 18:35:39 +02:00
if ( ! Conf . wildernessDenyUseage | | Conf . worldsNoWildernessProtection . contains ( location . getWorld ( ) . getName ( ) ) )
2011-06-02 01:32:09 +02:00
return true ; // This is not faction territory. Use whatever you like here.
2011-10-08 22:03:44 +02:00
if ( ! justCheck )
2011-10-21 18:14:04 +02:00
me . msg ( " <b>You can't use <h>%s<b> in the wilderness. " , TextUtil . getMaterialName ( material ) ) ;
2011-10-13 05:31:18 +02:00
2011-06-02 01:32:09 +02:00
return false ;
2011-03-08 13:06:52 +01:00
}
2011-10-08 22:03:44 +02:00
else if ( otherFaction . isSafeZone ( ) )
{
2011-10-08 23:22:02 +02:00
if ( ! Conf . safeZoneDenyUseage | | Permission . MANAGE_SAFE_ZONE . has ( player ) )
2011-03-24 15:49:33 +01:00
return true ;
2011-10-13 05:31:18 +02:00
2011-10-08 22:03:44 +02:00
if ( ! justCheck )
2011-10-21 18:14:04 +02:00
me . msg ( " <b>You can't use <h>%s<b> in a safe zone. " , TextUtil . getMaterialName ( material ) ) ;
2011-10-13 05:31:18 +02:00
2011-03-24 15:49:33 +01:00
return false ;
}
2011-10-08 22:03:44 +02:00
else if ( otherFaction . isWarZone ( ) )
{
2011-10-08 23:22:02 +02:00
if ( ! Conf . warZoneDenyUseage | | Permission . MANAGE_WAR_ZONE . has ( player ) )
2011-05-29 23:28:29 +02:00
return true ;
2011-10-13 05:31:18 +02:00
2011-10-08 22:03:44 +02:00
if ( ! justCheck )
2011-10-21 18:14:04 +02:00
me . msg ( " <b>You can't use <h>%s<b> in a war zone. " , TextUtil . getMaterialName ( material ) ) ;
2011-10-13 05:31:18 +02:00
2011-05-29 23:28:29 +02:00
return false ;
}
2011-10-13 05:31:18 +02:00
2011-03-08 13:06:52 +01:00
Faction myFaction = me . getFaction ( ) ;
2011-10-12 17:25:01 +02:00
Relation rel = myFaction . getRelationTo ( otherFaction ) ;
2011-10-13 05:31:18 +02:00
2011-03-08 13:06:52 +01:00
// Cancel if we are not in our own territory
2011-10-13 05:31:18 +02:00
if ( rel . confDenyUseage ( ) )
2011-10-08 22:03:44 +02:00
{
if ( ! justCheck )
2011-10-21 18:14:04 +02:00
me . msg ( " <b>You can't use <h>%s<b> in the territory of <h>%s<b>. " , TextUtil . getMaterialName ( material ) , otherFaction . getTag ( myFaction ) ) ;
2011-10-13 05:31:18 +02:00
2011-09-06 23:35:43 +02:00
return false ;
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
}
2011-10-13 05:31:18 +02:00
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
// Also cancel if player doesn't have ownership rights for this claim
2011-10-13 05:31:18 +02:00
if ( Conf . ownedAreasEnabled & & Conf . ownedAreaDenyUseage & & ! otherFaction . playerHasOwnershipRights ( me , loc ) )
2011-10-08 22:03:44 +02:00
{
if ( ! justCheck )
2011-10-21 18:14:04 +02:00
me . msg ( " <b>You can't use <h>%s<b> in this territory, it is owned by: %s<b>. " , TextUtil . getMaterialName ( material ) , otherFaction . getOwnerListString ( loc ) ) ;
2011-10-13 05:31:18 +02:00
2011-03-08 13:06:52 +01:00
return false ;
}
2011-10-13 05:31:18 +02:00
2011-03-08 13:06:52 +01:00
return true ;
}
2011-03-30 06:37:32 +02:00
2011-10-08 22:03:44 +02:00
public static boolean canPlayerUseBlock ( Player player , Block block , boolean justCheck )
{
2012-03-11 19:36:07 +01:00
String name = player . getName ( ) ;
if ( Conf . playersWhoBypassAllProtection . contains ( name ) ) return true ;
FPlayer me = FPlayers . i . get ( name ) ;
if ( me . isAdminBypassing ( ) ) return true ;
2011-04-04 14:16:53 +02:00
2011-03-30 06:37:32 +02:00
Material material = block . getType ( ) ;
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
FLocation loc = new FLocation ( block ) ;
Faction otherFaction = Board . getFactionAt ( loc ) ;
2011-09-15 16:12:24 +02:00
// no door/chest/whatever protection in wilderness, war zones, or safe zones
2011-10-08 22:03:44 +02:00
if ( ! otherFaction . isNormal ( ) )
2011-09-15 16:12:24 +02:00
return true ;
2011-03-30 06:37:32 +02:00
// We only care about some material types.
2011-10-08 22:03:44 +02:00
if ( otherFaction . hasPlayersOnline ( ) )
{
if ( ! Conf . territoryProtectedMaterials . contains ( material ) )
2011-06-04 11:59:35 +02:00
return true ;
2011-10-08 22:03:44 +02:00
}
else
{
if ( ! Conf . territoryProtectedMaterialsWhenOffline . contains ( material ) )
2011-06-04 11:59:35 +02:00
return true ;
2011-03-30 06:37:32 +02:00
}
2011-10-13 05:31:18 +02:00
2011-03-30 06:37:32 +02:00
Faction myFaction = me . getFaction ( ) ;
2011-10-12 17:25:01 +02:00
Relation rel = myFaction . getRelationTo ( otherFaction ) ;
2011-10-13 05:31:18 +02:00
2011-06-10 21:14:02 +02:00
// You may use any block unless it is another faction's territory...
2011-10-08 22:03:44 +02:00
if ( rel . isNeutral ( ) | | ( rel . isEnemy ( ) & & Conf . territoryEnemyProtectMaterials ) | | ( rel . isAlly ( ) & & Conf . territoryAllyProtectMaterials ) )
{
if ( ! justCheck )
2011-12-18 15:39:52 +01:00
me . msg ( " <b>You can't %s <h>%s<b> in the territory of <h>%s<b>. " , ( material = = Material . SOIL ? " trample " : " use " ) , TextUtil . getMaterialName ( material ) , otherFaction . getTag ( myFaction ) ) ;
2011-10-13 05:31:18 +02:00
2011-03-30 06:37:32 +02:00
return false ;
}
2011-10-13 05:31:18 +02:00
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
// Also cancel if player doesn't have ownership rights for this claim
2011-10-13 05:31:18 +02:00
if ( Conf . ownedAreasEnabled & & Conf . ownedAreaProtectMaterials & & ! otherFaction . playerHasOwnershipRights ( me , loc ) )
2011-10-08 22:03:44 +02:00
{
if ( ! justCheck )
2011-10-21 18:14:04 +02:00
me . msg ( " <b>You can't use <h>%s<b> in this territory, it is owned by: %s<b>. " , TextUtil . getMaterialName ( material ) , otherFaction . getOwnerListString ( loc ) ) ;
Faction admins can now mark already claimed areas as owned by specific faction members. Ownership can include multiple members. New command /f owner *[player name], to set/remove ownership. This command is only available to the faction admin and optionally the faction moderators. If no player name is specified, it will either set ownership to the player running the command (if no owner is currently set) or completely clear ownership of the territory. New command /f ownerlist, to view a list of owners for the current area. Only works inside your own faction's territory. New conf.json options "ownedAreasEnabled", "ownedAreasModeratorsCanSet", "ownedAreaModeratorsBypass", "ownedAreaDenyBuild", "ownedAreaProtectMaterials", and "ownedAreaDenyUseage" (all defaulting to true) to determine whether faction moderators can set or bypass ownership (faction admin always can), and what sort of protection these owned areas have against normal members of the faction (members other than the owner(s), faction admin, and probably faction moderators). New conf.json option "ownedAreasLimitPerFaction" to limit how many owned areas can be set. New permission node "factions.ownershipBypass" which allows a player to bypass ownership protection, but only within the person's own faction.
various little tweaks and improvements to other code
moderate speed boost to FLocation code
made commandDisable permissions work for any command alias of a command, instead of just the first one
2011-07-31 03:17:00 +02:00
return false ;
}
2011-03-30 06:37:32 +02:00
return true ;
}
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . HIGH )
2011-10-08 22:03:44 +02:00
public void onPlayerRespawn ( PlayerRespawnEvent event )
{
FPlayer me = FPlayers . i . get ( event . getPlayer ( ) ) ;
2012-01-28 12:59:10 +01:00
me . getPower ( ) ; // update power, so they won't have gained any while dead
2011-03-23 17:39:56 +01:00
Location home = me . getFaction ( ) . getHome ( ) ;
2011-10-08 22:03:44 +02:00
if
(
Conf . homesEnabled
& &
Conf . homesTeleportToOnDeath
& &
home ! = null
& &
(
Conf . homesRespawnFromNoPowerLossWorlds
| |
! Conf . worldsNoPowerLoss . contains ( event . getPlayer ( ) . getWorld ( ) . getName ( ) )
)
)
{
2011-03-23 17:39:56 +01:00
event . setRespawnLocation ( home ) ;
}
}
2011-03-30 11:23:20 +02:00
// For some reason onPlayerInteract() sometimes misses bucket events depending on distance (something like 2-3 blocks away isn't detected),
// but these separate bucket events below always fire without fail
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . NORMAL )
2011-10-08 22:03:44 +02:00
public void onPlayerBucketEmpty ( PlayerBucketEmptyEvent event )
{
if ( event . isCancelled ( ) ) return ;
2011-03-30 11:23:20 +02:00
Block block = event . getBlockClicked ( ) ;
Player player = event . getPlayer ( ) ;
2011-10-08 22:03:44 +02:00
if ( ! playerCanUseItemHere ( player , block . getLocation ( ) , event . getBucket ( ) , false ) )
{
2011-03-30 11:23:20 +02:00
event . setCancelled ( true ) ;
return ;
}
}
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . NORMAL )
2011-10-08 22:03:44 +02:00
public void onPlayerBucketFill ( PlayerBucketFillEvent event )
{
if ( event . isCancelled ( ) ) return ;
2011-03-30 11:23:20 +02:00
Block block = event . getBlockClicked ( ) ;
Player player = event . getPlayer ( ) ;
2011-10-08 22:03:44 +02:00
if ( ! playerCanUseItemHere ( player , block . getLocation ( ) , event . getBucket ( ) , false ) )
{
2011-03-30 11:23:20 +02:00
event . setCancelled ( true ) ;
return ;
}
}
2011-08-04 07:07:38 +02:00
2011-10-08 22:03:44 +02:00
public static boolean preventCommand ( String fullCmd , Player player )
{
2012-01-19 06:31:37 +01:00
if ( ( Conf . territoryNeutralDenyCommands . isEmpty ( ) & & Conf . territoryEnemyDenyCommands . isEmpty ( ) & & Conf . permanentFactionMemberDenyCommands . isEmpty ( ) ) )
2011-08-04 07:34:52 +02:00
return false ;
2012-02-19 15:21:03 +01:00
fullCmd = fullCmd . toLowerCase ( ) ;
2011-10-08 22:03:44 +02:00
FPlayer me = FPlayers . i . get ( player ) ;
2011-08-04 07:07:38 +02:00
2012-01-19 06:31:37 +01:00
String shortCmd ; // command without the slash at the beginning
if ( fullCmd . startsWith ( " / " ) )
shortCmd = fullCmd . substring ( 1 ) ;
else
{
shortCmd = fullCmd ;
fullCmd = " / " + fullCmd ;
}
if
(
me . hasFaction ( )
& &
! me . isAdminBypassing ( )
& &
! Conf . permanentFactionMemberDenyCommands . isEmpty ( )
& &
me . getFaction ( ) . isPermanent ( )
& &
isCommandInList ( fullCmd , shortCmd , Conf . permanentFactionMemberDenyCommands . iterator ( ) )
)
{
me . msg ( " <b>You can't use the command \" " + fullCmd + " \" because you are in a permanent faction. " ) ;
return true ;
}
2011-10-08 22:03:44 +02:00
if ( ! me . isInOthersTerritory ( ) )
{
2011-08-04 07:34:52 +02:00
return false ;
2011-08-04 07:07:38 +02:00
}
Relation rel = me . getRelationToLocation ( ) ;
2011-10-08 22:03:44 +02:00
if ( rel . isAtLeast ( Relation . ALLY ) )
{
2011-08-04 07:34:52 +02:00
return false ;
2011-08-04 07:07:38 +02:00
}
2011-10-08 22:03:44 +02:00
if
(
rel . isNeutral ( )
& &
! Conf . territoryNeutralDenyCommands . isEmpty ( )
& &
2011-10-09 18:35:39 +02:00
! me . isAdminBypassing ( )
2012-01-19 06:31:37 +01:00
& &
isCommandInList ( fullCmd , shortCmd , Conf . territoryNeutralDenyCommands . iterator ( ) )
2011-10-08 22:03:44 +02:00
)
{
2012-01-19 06:31:37 +01:00
me . msg ( " <b>You can't use the command \" " + fullCmd + " \" in neutral territory. " ) ;
return true ;
2011-08-04 07:07:38 +02:00
}
2012-01-19 06:31:37 +01:00
if
2011-10-08 22:03:44 +02:00
(
rel . isEnemy ( )
& &
! Conf . territoryEnemyDenyCommands . isEmpty ( )
& &
2011-10-09 18:35:39 +02:00
! me . isAdminBypassing ( )
2012-01-19 06:31:37 +01:00
& &
isCommandInList ( fullCmd , shortCmd , Conf . territoryEnemyDenyCommands . iterator ( ) )
2011-10-08 22:03:44 +02:00
)
{
2012-01-19 06:31:37 +01:00
me . msg ( " <b>You can't use the command \" " + fullCmd + " \" in enemy territory. " ) ;
return true ;
}
2011-08-05 21:06:35 +02:00
2012-01-19 06:31:37 +01:00
return false ;
}
private static boolean isCommandInList ( String fullCmd , String shortCmd , Iterator < String > iter )
{
String cmdCheck ;
while ( iter . hasNext ( ) )
{
cmdCheck = iter . next ( ) ;
if ( cmdCheck = = null )
{
iter . remove ( ) ;
continue ;
2011-08-04 07:07:38 +02:00
}
2012-01-19 06:31:37 +01:00
cmdCheck = cmdCheck . toLowerCase ( ) ;
if ( fullCmd . startsWith ( cmdCheck ) | | shortCmd . startsWith ( cmdCheck ) )
return true ;
2011-08-04 07:07:38 +02:00
}
2011-08-04 07:34:52 +02:00
return false ;
2011-08-04 07:07:38 +02:00
}
2011-08-04 07:34:52 +02:00
2012-01-28 11:37:55 +01:00
@EventHandler ( priority = EventPriority . NORMAL )
2011-10-08 22:03:44 +02:00
public void onPlayerKick ( PlayerKickEvent event )
{
if ( event . isCancelled ( ) ) return ;
2011-10-05 07:33:15 +02:00
2011-10-08 22:03:44 +02:00
FPlayer badGuy = FPlayers . i . get ( event . getPlayer ( ) ) ;
if ( badGuy = = null )
{
2011-10-05 12:13:54 +02:00
return ;
}
SpoutFeatures . playerDisconnect ( badGuy ) ;
2011-10-05 07:33:15 +02:00
// if player was banned (not just kicked), get rid of their stored info
2011-12-18 09:47:56 +01:00
if ( Conf . removePlayerDataWhenBanned & & event . getReason ( ) . equals ( " Banned by admin. " ) )
2011-10-08 22:03:44 +02:00
{
2011-12-18 14:47:15 +01:00
if ( badGuy . getRole ( ) = = Role . ADMIN )
badGuy . getFaction ( ) . promoteNewLeader ( ) ;
2011-10-05 07:33:15 +02:00
badGuy . leave ( false ) ;
2012-01-10 04:38:00 +01:00
badGuy . detach ( ) ;
2011-10-05 07:33:15 +02:00
}
}
2011-02-06 13:36:11 +01:00
}