mirror of
https://github.com/EngineHub/WorldGuard.git
synced 2024-12-18 07:07:43 +01:00
Added vehicle destroy flag and made players in vehicles subject to movement flags.
This commit is contained in:
parent
38c30f5ecd
commit
b4f2188f72
@ -53,6 +53,7 @@
|
|||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldedit.blocks.BlockType;
|
||||||
import com.sk89q.worldguard.LocalPlayer;
|
import com.sk89q.worldguard.LocalPlayer;
|
||||||
import com.sk89q.worldguard.blacklist.events.BlockBreakBlacklistEvent;
|
import com.sk89q.worldguard.blacklist.events.BlockBreakBlacklistEvent;
|
||||||
import com.sk89q.worldguard.blacklist.events.BlockInteractBlacklistEvent;
|
import com.sk89q.worldguard.blacklist.events.BlockInteractBlacklistEvent;
|
||||||
@ -296,6 +297,7 @@ public void onPlayerMove(PlayerMoveEvent event) {
|
|||||||
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
||||||
WorldConfiguration wcfg = cfg.get(world);
|
WorldConfiguration wcfg = cfg.get(world);
|
||||||
|
|
||||||
|
if (player.getVehicle() != null) return; // handled in vehicle listener
|
||||||
if (wcfg.useRegions) {
|
if (wcfg.useRegions) {
|
||||||
// Did we move a block?
|
// Did we move a block?
|
||||||
if (event.getFrom().getBlockX() != event.getTo().getBlockX()
|
if (event.getFrom().getBlockX() != event.getTo().getBlockX()
|
||||||
@ -627,8 +629,7 @@ private void handleBlockRightClick(PlayerInteractEvent event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL)
|
if (BlockType.isRailBlock(type.getId()) && item.getType() == Material.MINECART) {
|
||||||
&& item.getType() == Material.MINECART) {
|
|
||||||
if (!plugin.getGlobalRegionManager().hasBypass(player, world)
|
if (!plugin.getGlobalRegionManager().hasBypass(player, world)
|
||||||
&& !set.canBuild(localPlayer)
|
&& !set.canBuild(localPlayer)
|
||||||
&& !set.allows(DefaultFlag.PLACE_VEHICLE)) {
|
&& !set.allows(DefaultFlag.PLACE_VEHICLE)) {
|
||||||
|
@ -166,6 +166,7 @@ public void onEnable() {
|
|||||||
(new WorldGuardBlockListener(this)).registerEvents();
|
(new WorldGuardBlockListener(this)).registerEvents();
|
||||||
(new WorldGuardEntityListener(this)).registerEvents();
|
(new WorldGuardEntityListener(this)).registerEvents();
|
||||||
(new WorldGuardWeatherListener(this)).registerEvents();
|
(new WorldGuardWeatherListener(this)).registerEvents();
|
||||||
|
(new WorldGuardVehicleListener(this)).registerEvents();
|
||||||
|
|
||||||
// handle worlds separately to initialize already loaded worlds
|
// handle worlds separately to initialize already loaded worlds
|
||||||
WorldGuardWorldListener worldListener = (new WorldGuardWorldListener(this));
|
WorldGuardWorldListener worldListener = (new WorldGuardWorldListener(this));
|
||||||
|
@ -0,0 +1,211 @@
|
|||||||
|
// $Id$
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*/
|
||||||
|
package com.sk89q.worldguard.bukkit;
|
||||||
|
|
||||||
|
import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Vehicle;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.vehicle.VehicleDestroyEvent;
|
||||||
|
import org.bukkit.event.vehicle.VehicleListener;
|
||||||
|
import org.bukkit.event.vehicle.VehicleMoveEvent;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldguard.LocalPlayer;
|
||||||
|
import com.sk89q.worldguard.bukkit.FlagStateManager.PlayerFlagState;
|
||||||
|
import com.sk89q.worldguard.protection.ApplicableRegionSet;
|
||||||
|
import com.sk89q.worldguard.protection.flags.DefaultFlag;
|
||||||
|
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||||
|
|
||||||
|
public class WorldGuardVehicleListener extends VehicleListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logger for messages.
|
||||||
|
*/
|
||||||
|
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
|
||||||
|
|
||||||
|
private WorldGuardPlugin plugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the object;
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
*/
|
||||||
|
public WorldGuardVehicleListener(WorldGuardPlugin plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register events.
|
||||||
|
*/
|
||||||
|
public void registerEvents() {
|
||||||
|
registerEvent("VEHICLE_MOVE", Event.Priority.Normal);
|
||||||
|
registerEvent("VEHICLE_DESTROY", Event.Priority.Normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register an event, but not failing if the event is not implemented.
|
||||||
|
*
|
||||||
|
* @param typeName
|
||||||
|
* @param priority
|
||||||
|
*/
|
||||||
|
private void registerEvent(String typeName, Event.Priority priority) {
|
||||||
|
try {
|
||||||
|
Event.Type type = Event.Type.valueOf(typeName);
|
||||||
|
PluginManager pm = plugin.getServer().getPluginManager();
|
||||||
|
pm.registerEvent(type, this, priority, plugin);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
logger.info("WorldGuard: Unable to register missing event type " + typeName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a vehicle is destroyed.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onVehicleDestroy(VehicleDestroyEvent event) {
|
||||||
|
Vehicle vehicle = event.getVehicle();
|
||||||
|
Entity destroyer = event.getAttacker();
|
||||||
|
|
||||||
|
if (!(destroyer instanceof Player)) return; // don't care
|
||||||
|
Player player = (Player) destroyer;
|
||||||
|
World world = vehicle.getWorld();
|
||||||
|
|
||||||
|
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
||||||
|
WorldConfiguration wcfg = cfg.get(world);
|
||||||
|
|
||||||
|
if (wcfg.useRegions) {
|
||||||
|
Vector pt = toVector(vehicle.getLocation());
|
||||||
|
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
|
||||||
|
ApplicableRegionSet set = mgr.getApplicableRegions(pt);
|
||||||
|
LocalPlayer localPlayer = plugin.wrapPlayer(player);
|
||||||
|
|
||||||
|
if (!plugin.getGlobalRegionManager().hasBypass(player, world)
|
||||||
|
&& !set.canBuild(localPlayer)
|
||||||
|
&& !set.allows(DefaultFlag.DESTROY_VEHICLE)) {
|
||||||
|
player.sendMessage(ChatColor.DARK_RED + "You don't have permission to destroy vehicles here.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a vehicle moves.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onVehicleMove(VehicleMoveEvent event) {
|
||||||
|
Vehicle vehicle = event.getVehicle();
|
||||||
|
if (vehicle.getPassenger() == null
|
||||||
|
|| !(vehicle.getPassenger() instanceof Player)) return;
|
||||||
|
Player player = (Player) vehicle.getPassenger();
|
||||||
|
World world = vehicle.getWorld();
|
||||||
|
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
||||||
|
WorldConfiguration wcfg = cfg.get(world);
|
||||||
|
|
||||||
|
// unfortunate code duplication
|
||||||
|
if (wcfg.useRegions) {
|
||||||
|
// Did we move a block?
|
||||||
|
if (event.getFrom().getBlockX() != event.getTo().getBlockX()
|
||||||
|
|| event.getFrom().getBlockY() != event.getTo().getBlockY()
|
||||||
|
|| event.getFrom().getBlockZ() != event.getTo().getBlockZ()) {
|
||||||
|
PlayerFlagState state = plugin.getFlagStateManager().getState(player);
|
||||||
|
LocalPlayer localPlayer = plugin.wrapPlayer(player);
|
||||||
|
boolean hasBypass = plugin.getGlobalRegionManager().hasBypass(player, world);
|
||||||
|
|
||||||
|
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
|
||||||
|
Vector pt = new Vector(event.getTo().getBlockX(), event.getTo().getBlockY(), event.getTo().getBlockZ());
|
||||||
|
ApplicableRegionSet set = mgr.getApplicableRegions(pt);
|
||||||
|
|
||||||
|
boolean entryAllowed = set.allows(DefaultFlag.ENTRY, localPlayer);
|
||||||
|
if (!hasBypass && !entryAllowed) {
|
||||||
|
|
||||||
|
vehicle.setVelocity(new org.bukkit.util.Vector(0,0,0));
|
||||||
|
vehicle.teleport(event.getFrom());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Have to set this state
|
||||||
|
if (state.lastExitAllowed == null) {
|
||||||
|
state.lastExitAllowed = mgr.getApplicableRegions(toVector(event.getFrom()))
|
||||||
|
.allows(DefaultFlag.EXIT, localPlayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean exitAllowed = set.allows(DefaultFlag.EXIT, localPlayer);
|
||||||
|
if (!hasBypass && exitAllowed && !state.lastExitAllowed) {
|
||||||
|
player.sendMessage(ChatColor.DARK_RED + "You are not permitted to leave this area.");
|
||||||
|
|
||||||
|
vehicle.setVelocity(new org.bukkit.util.Vector(0,0,0));
|
||||||
|
vehicle.teleport(event.getFrom());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String greeting = set.getFlag(DefaultFlag.GREET_MESSAGE);
|
||||||
|
String farewell = set.getFlag(DefaultFlag.FAREWELL_MESSAGE);
|
||||||
|
Boolean notifyEnter = set.getFlag(DefaultFlag.NOTIFY_ENTER);
|
||||||
|
Boolean notifyLeave = set.getFlag(DefaultFlag.NOTIFY_LEAVE);
|
||||||
|
|
||||||
|
if (state.lastFarewell != null && (farewell == null
|
||||||
|
|| !state.lastFarewell.equals(farewell))) {
|
||||||
|
String replacedFarewell = plugin.replaceMacros(
|
||||||
|
player, BukkitUtil.replaceColorMacros(state.lastFarewell));
|
||||||
|
player.sendMessage(ChatColor.AQUA + " ** " + replacedFarewell);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (greeting != null && (state.lastGreeting == null
|
||||||
|
|| !state.lastGreeting.equals(greeting))) {
|
||||||
|
String replacedGreeting = plugin.replaceMacros(
|
||||||
|
player, BukkitUtil.replaceColorMacros(greeting));
|
||||||
|
player.sendMessage(ChatColor.AQUA + " ** " + replacedGreeting);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((notifyLeave == null || !notifyLeave)
|
||||||
|
&& state.notifiedForLeave != null && state.notifiedForLeave) {
|
||||||
|
plugin.broadcastNotification(ChatColor.GRAY + "WG: "
|
||||||
|
+ ChatColor.LIGHT_PURPLE + player.getName()
|
||||||
|
+ ChatColor.GOLD + " left NOTIFY region");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notifyEnter != null && notifyEnter && (state.notifiedForEnter == null
|
||||||
|
|| !state.notifiedForEnter)) {
|
||||||
|
StringBuilder regionList = new StringBuilder();
|
||||||
|
|
||||||
|
for (ProtectedRegion region : set) {
|
||||||
|
if (regionList.length() != 0) {
|
||||||
|
regionList.append(", ");
|
||||||
|
}
|
||||||
|
regionList.append(region.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.broadcastNotification(ChatColor.GRAY + "WG: "
|
||||||
|
+ ChatColor.LIGHT_PURPLE + player.getName()
|
||||||
|
+ ChatColor.GOLD + " entered NOTIFY region: "
|
||||||
|
+ ChatColor.WHITE
|
||||||
|
+ regionList);
|
||||||
|
}
|
||||||
|
|
||||||
|
state.lastGreeting = greeting;
|
||||||
|
state.lastFarewell = farewell;
|
||||||
|
state.notifiedForEnter = notifyEnter;
|
||||||
|
state.notifiedForLeave = notifyLeave;
|
||||||
|
state.lastExitAllowed = exitAllowed;
|
||||||
|
state.lastWorld = event.getTo().getWorld();
|
||||||
|
state.lastBlockX = event.getTo().getBlockX();
|
||||||
|
state.lastBlockY = event.getTo().getBlockY();
|
||||||
|
state.lastBlockZ = event.getTo().getBlockZ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -45,6 +45,7 @@ public final class DefaultFlag {
|
|||||||
public static final StateFlag LAVA_FLOW = new StateFlag("lava-flow", true);
|
public static final StateFlag LAVA_FLOW = new StateFlag("lava-flow", true);
|
||||||
public static final StateFlag USE = new StateFlag("use", true);
|
public static final StateFlag USE = new StateFlag("use", true);
|
||||||
public static final StateFlag PLACE_VEHICLE = new StateFlag("vehicle-place", false);
|
public static final StateFlag PLACE_VEHICLE = new StateFlag("vehicle-place", false);
|
||||||
|
public static final StateFlag DESTROY_VEHICLE = new StateFlag("vehicle-destroy", false);
|
||||||
public static final StateFlag PISTONS = new StateFlag("pistons", true);
|
public static final StateFlag PISTONS = new StateFlag("pistons", true);
|
||||||
public static final StateFlag SNOW_FALL = new StateFlag("snow-fall", true);
|
public static final StateFlag SNOW_FALL = new StateFlag("snow-fall", true);
|
||||||
public static final StateFlag SNOW_MELT = new StateFlag("snow-melt", true);
|
public static final StateFlag SNOW_MELT = new StateFlag("snow-melt", true);
|
||||||
@ -83,7 +84,7 @@ public final class DefaultFlag {
|
|||||||
|
|
||||||
public static final Flag<?>[] flagsList = new Flag<?>[] {
|
public static final Flag<?>[] flagsList = new Flag<?>[] {
|
||||||
PASSTHROUGH, BUILD, PVP, CHEST_ACCESS, PISTONS,
|
PASSTHROUGH, BUILD, PVP, CHEST_ACCESS, PISTONS,
|
||||||
TNT, LIGHTER, USE, PLACE_VEHICLE, SLEEP,
|
TNT, LIGHTER, USE, PLACE_VEHICLE, DESTROY_VEHICLE, SLEEP,
|
||||||
MOB_DAMAGE, MOB_SPAWNING, DENY_SPAWN, INVINCIBILITY,
|
MOB_DAMAGE, MOB_SPAWNING, DENY_SPAWN, INVINCIBILITY,
|
||||||
CREEPER_EXPLOSION, GHAST_FIREBALL, ENDER_BUILD,
|
CREEPER_EXPLOSION, GHAST_FIREBALL, ENDER_BUILD,
|
||||||
GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_ENTER, NOTIFY_LEAVE,
|
GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_ENTER, NOTIFY_LEAVE,
|
||||||
|
Loading…
Reference in New Issue
Block a user