mirror of
https://github.com/EngineHub/WorldGuard.git
synced 2024-11-30 22:44:07 +01:00
Added region invincibility flag.
This commit is contained in:
parent
5b300bc5d1
commit
671b4fe2db
@ -164,6 +164,13 @@ public static class PlayerFlagState {
|
|||||||
public int lastBlockX;
|
public int lastBlockX;
|
||||||
public int lastBlockY;
|
public int lastBlockY;
|
||||||
public int lastBlockZ;
|
public int lastBlockZ;
|
||||||
|
|
||||||
|
/* Used to cache invincibility status */
|
||||||
|
public World lastInvincibleWorld;
|
||||||
|
public int lastInvincibleX;
|
||||||
|
public int lastInvincibleY;
|
||||||
|
public int lastInvincibleZ;
|
||||||
|
public boolean wasInvincible;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
// $Id$
|
||||||
|
/*
|
||||||
|
* WorldGuard
|
||||||
|
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldguard.bukkit;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldguard.LocalPlayer;
|
||||||
|
import com.sk89q.worldguard.protection.ApplicableRegionSet;
|
||||||
|
import com.sk89q.worldguard.protection.flags.DefaultFlag;
|
||||||
|
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class RegionQueryUtil {
|
||||||
|
|
||||||
|
public static boolean isInvincible(WorldGuardPlugin plugin, Player player) {
|
||||||
|
return isInvincible(plugin, player, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isInvincible(WorldGuardPlugin plugin, Player player,
|
||||||
|
ApplicableRegionSet set) {
|
||||||
|
Location loc = player.getLocation();
|
||||||
|
World world = player.getWorld();
|
||||||
|
|
||||||
|
FlagStateManager.PlayerFlagState state = plugin.getFlagStateManager().getState(player);
|
||||||
|
|
||||||
|
if (state.lastInvincibleWorld == null ||
|
||||||
|
!state.lastInvincibleWorld.equals(world) ||
|
||||||
|
state.lastInvincibleX != loc.getBlockX() ||
|
||||||
|
state.lastInvincibleY != loc.getBlockY() ||
|
||||||
|
state.lastInvincibleZ != loc.getBlockZ()) {
|
||||||
|
state.lastInvincibleX = loc.getBlockX();
|
||||||
|
state.lastInvincibleY = loc.getBlockY();
|
||||||
|
state.lastInvincibleZ = loc.getBlockZ();
|
||||||
|
state.lastInvincibleWorld = world;
|
||||||
|
|
||||||
|
if (set == null) {
|
||||||
|
Vector vec = new Vector(state.lastInvincibleX,
|
||||||
|
state.lastInvincibleY, state.lastInvincibleZ);
|
||||||
|
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
|
||||||
|
set = mgr.getApplicableRegions(vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
state.wasInvincible = set.allows(DefaultFlag.INVINCIBILITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return state.wasInvincible;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -140,7 +140,8 @@ private void onEntityDamageByBlock(EntityDamageByBlockEvent event) {
|
|||||||
} else if (defender instanceof Player) {
|
} else if (defender instanceof Player) {
|
||||||
Player player = (Player) defender;
|
Player player = (Player) defender;
|
||||||
|
|
||||||
if (cfg.hasGodMode(player)) {
|
if (cfg.hasGodMode(player)
|
||||||
|
|| (wcfg.useRegions && RegionQueryUtil.isInvincible(plugin, player))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -209,7 +210,8 @@ private void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
|
|||||||
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
||||||
WorldConfiguration wcfg = cfg.get(player.getWorld());
|
WorldConfiguration wcfg = cfg.get(player.getWorld());
|
||||||
|
|
||||||
if (cfg.hasGodMode(player)) {
|
if (cfg.hasGodMode(player)
|
||||||
|
|| (wcfg.useRegions && RegionQueryUtil.isInvincible(plugin, player))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -291,7 +293,7 @@ private void onEntityDamageByProjectile(EntityDamageByProjectileEvent event) {
|
|||||||
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
||||||
WorldConfiguration wcfg = cfg.get(player.getWorld());
|
WorldConfiguration wcfg = cfg.get(player.getWorld());
|
||||||
|
|
||||||
if (cfg.hasGodMode(player)) {
|
if (cfg.hasGodMode(player) || (wcfg.useRegions && RegionQueryUtil.isInvincible(plugin, player))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -361,7 +363,8 @@ public void onEntityDamage(EntityDamageEvent event) {
|
|||||||
} else if (defender instanceof Player) {
|
} else if (defender instanceof Player) {
|
||||||
Player player = (Player) defender;
|
Player player = (Player) defender;
|
||||||
|
|
||||||
if (cfg.hasGodMode(player)) {
|
if (cfg.hasGodMode(player)
|
||||||
|
|| (wcfg.useRegions && RegionQueryUtil.isInvincible(plugin, player))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
player.setFireTicks(0);
|
player.setFireTicks(0);
|
||||||
return;
|
return;
|
||||||
@ -423,11 +426,12 @@ public void onEntityCombust(EntityCombustEvent event) {
|
|||||||
Entity entity = event.getEntity();
|
Entity entity = event.getEntity();
|
||||||
|
|
||||||
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
ConfigurationManager cfg = plugin.getGlobalStateManager();
|
||||||
|
WorldConfiguration wcfg = cfg.get(entity.getWorld());
|
||||||
|
|
||||||
if (entity instanceof Player) {
|
if (entity instanceof Player) {
|
||||||
Player player = (Player) entity;
|
Player player = (Player) entity;
|
||||||
|
|
||||||
if (cfg.hasGodMode(player)) {
|
if (cfg.hasGodMode(player) || (wcfg.useRegions && RegionQueryUtil.isInvincible(plugin, player))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ public final class DefaultFlag {
|
|||||||
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 SNOW_FALL = new StateFlag("snow-fall", true);
|
public static final StateFlag SNOW_FALL = new StateFlag("snow-fall", true);
|
||||||
public static final StateFlag LEAF_DECAY = new StateFlag("leaf-decay", true);
|
public static final StateFlag LEAF_DECAY = new StateFlag("leaf-decay", true);
|
||||||
|
public static final StateFlag INVINCIBILITY = new StateFlag("invincible", false);
|
||||||
public static final StateFlag ENTRY = new StateFlag("entry", true);
|
public static final StateFlag ENTRY = new StateFlag("entry", true);
|
||||||
public static final RegionGroupFlag ENTRY_PERM = new RegionGroupFlag("entry-group", RegionGroupFlag.RegionGroup.NON_MEMBERS);
|
public static final RegionGroupFlag ENTRY_PERM = new RegionGroupFlag("entry-group", RegionGroupFlag.RegionGroup.NON_MEMBERS);
|
||||||
public static final StateFlag EXIT = new StateFlag("exit", true);
|
public static final StateFlag EXIT = new StateFlag("exit", true);
|
||||||
@ -73,7 +74,8 @@ public final class DefaultFlag {
|
|||||||
USE, PLACE_VEHICLE, GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_ENTER,
|
USE, PLACE_VEHICLE, GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_ENTER,
|
||||||
NOTIFY_LEAVE, DENY_SPAWN, HEAL_DELAY, HEAL_AMOUNT, TELE_LOC,
|
NOTIFY_LEAVE, DENY_SPAWN, HEAL_DELAY, HEAL_AMOUNT, TELE_LOC,
|
||||||
TELE_PERM, SPAWN_LOC, SPAWN_PERM, BUYABLE, PRICE, SNOW_FALL, LEAF_DECAY,
|
TELE_PERM, SPAWN_LOC, SPAWN_PERM, BUYABLE, PRICE, SNOW_FALL, LEAF_DECAY,
|
||||||
GHAST_FIREBALL, BLOCKED_CMDS, ALLOWED_CMDS, ENTRY, ENTRY_PERM, EXIT, EXIT_PERM
|
GHAST_FIREBALL, BLOCKED_CMDS, ALLOWED_CMDS, ENTRY, ENTRY_PERM, EXIT, EXIT_PERM,
|
||||||
|
INVINCIBILITY
|
||||||
};
|
};
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
Loading…
Reference in New Issue
Block a user