- Fix: Block breaking of hanging entities (Paintings/ItemFrames) in/out
   of gamemode-areas
 - German Translation (As bad as English one, even its my primary lang.)
 - Removed Permission-Configuration
   * It is now always enabled to prevent confusion.
   * ATTION for PEX-Admins:
     # You have to add a Permission "-limitedcreative.keepinventory" if
     # you like to keep separated Inventories even with an
     # '*'-Admin-Permission
 - Now blocking interaction with item-frames in creative when
   nolimit.drop is enabled (default). So people neither can drop items,
   nor put it in a frame to pass it to survival.
 - Added Command Blocker
   * ATTENTION: You have to update the configuration by hand to add
     the commands to the block-list.
This commit is contained in:
Jascha Starke 2012-11-12 23:22:18 +01:00
parent f382d56df5
commit 31f670aff3
15 changed files with 311 additions and 75 deletions

View file

@ -101,7 +101,7 @@ limit:
# UseBlackList
# Prevents using or placing of the given blocks in creative mode (and only in creative).
# You can use the technical name (see http://jd.bukkit.org/doxygen/d7/dd9/namespaceorg_1_1bukkit.html#ab7fa290bb19b9a830362aa88028ec80a)
# You can use the technical name (see http://jd.bukkit.org/doxygen/d6/d0e/enumorg_1_1bukkit_1_1Material.html)
# or the id of the block/item (better use the id, if you're not sure).
# To prevent Lava you need to add "LAVA_BUCKET", because lava-blocks aren't "placed", therefore Lava-Buckets are
# "used".
@ -117,7 +117,7 @@ limit:
# BreakBlackList
# Prevents destroying of the given blocks in creative mode (and only in creative).
# You can use the technical name (see http://jd.bukkit.org/doxygen/d7/dd9/namespaceorg_1_1bukkit.html#ab7fa290bb19b9a830362aa88028ec80a)
# You can use the technical name (see http://jd.bukkit.org/doxygen/d6/d0e/enumorg_1_1bukkit_1_1Material.html)
# or the id of the block/item (better use the id, if you're not sure).
# You may add the data separated with a colon e.g.: "WOOL:11" blocks blue wool. But be sure to put it in quotes, to
# not break yml-configuration! Named data values aren't supported yet. If you don't add a data-value, all blocks
@ -130,7 +130,7 @@ limit:
region:
# RegionsEnabled
# Enables the Feature for "creative-regions". This Feature is automatically disabled, if the required plugin
# Enables the feature for "creative-regions". This Feature is automatically disabled, if the required plugin
# "WorldGuard" (http://dev.bukkit.org/server-mods/worldguard/) isn't found.
# default: true
enabled: true
@ -148,24 +148,27 @@ region:
# default: true
remember: true
permissions:
# PermissionsEnabled
# When enabled, the Permissions will allow selected users to ignore limitations like PvP, Chest-Block, etc.
# When not enabled, all users are treated equally.
# Note: Not all Permission, are affected by this option. So you still need the defined permissions or op, to use
# commands, even if this options is disabled!
# default: false
enabled: false
# PermissionKeepInventory
# Disables the limitedcreative.keepinventory-Permission, so you can use the separated-inventories-feature, even
# if you have a permission plugin that grants ALL permission to you.
# If Enabled, only players WITHOUT the limitedcreative.keepinventory-Permission, have separated inventories;
# Players with the permission will have the inventory, like this plugin were not installed.
# When "PermissionsEnabled" is false, the KeepInventory-Option will act like disabled, even if you set it to true.
# default: false
keepinventory: false
cmdblock:
# CommandBlockerEnabled
# Enables the feature for blocking certain commands in creative mode.
# default: true
enabled: true
# CommandBlockerList
# Defines the list of commands that are blocked while in creative mode. The leading / isn't included. By default
# the list-item is treated as simple string as typed in by the user after the /. All commands starting with
# this string are blocked, even if more parameteres are entered by the user.
# If the first Char is ^ the entry is interpreted as a regular expression (including the ^ for begin of the string).
# Only use regular expressions if you know them.
# default: []
commands:
# - logout
# - home
# - home second
# - ^chest (one|two|three)
# - ^(lc|limitedcreative) s(urvival)?
# Locale (Language)
# Uncomment the "locale: en_US"-Line, to override the locale which be used for localized messages. By default the

68
lang/de_DE.yml Normal file
View file

@ -0,0 +1,68 @@
basic:
loaded:
worldguard: Erfolgreich mit WorldGuard-Integration geladen
no_worldguard: Erfolgreich geladen (ohne WorldGuard)
feature:
store: Getrennte Inventare
limit: Kreativ-Einschränkungen
region: Kreativ-Regionen
conflict: Wegen eines Konfliktes mit {0} ist die Funktion {1} deaktiviert
warning:
worldguard_not_found: WorldGuard wurd enicht gefunde, dahier ist die Funktion {0} deaktiviert
# double single-quote '' because of MessageFormater to insert {0}
command:
player: Spieler
switch:
survival: Ändert den Spiel-Modus des Charakters zu Überleben
creative: Ändert den Spiel-Modus des Charakters zu Kreativ
adventure: Ändert den Spiel-Modus des Charakters zu Abenteuer
config:
overview: "[Einstellung] - liste durch weglassen"
settings: "Verfügbare Einstellungen: "
reload: Lädt das Plugin neu (funktioniert nur teilweise)
gamemode:
changed: "{0}'s Spiel-Modus wurde geändert"
no_change: Bereits in diesem Spiel-Modus
option:
done: Option geändert.
worldguard:
alias: Alias für den //region-Befehl
unknown_flag: Unbekanntes Attribut
available_flags: Verfügbare Attribute
region_not_found: Keine Region mit dieser ID gefunden
world_not_found: Es konnte keine Welt mit diesem Namen gefunden werden
no_flag_given: Es muss ein Attribut angegeben werden, dass gesetzt werden soll
no_integration: Der worldguard-Befehl ist nicht verfügbar, da WorldGuard nicht gefunden wurde
flag_set: "Das Attribut {0} wurde gesetzt"
additional_flags: Zusätzliche Attribute
cmdblock:
blocked: Dieser Befehl ist im Kreativ-Modus blockiert.
exception:
command:
lackingpermission: Kein Zugriff auf diesen Befehl
toomuchparameter: Zuviele Argumente angegeben
missingparameter: Nicht genügen Argumente angegeben
playernotfound: Spieler nicht gefunden
invalidoption: Unbkeannte Option
config:
savefail: Die Konfiguration konnte nicht gespeichert werden
material_not_found: (Konfiguration) Material mit Name/ID "{0}" wurde nicht gefunden.
storage:
load: Fehler beim Laden des Inventars. Bitte einen Admin die Option "UnsafeStorege" in LimitedCreative zu aktivieren um ungültig verzauberte Gegenstände zu erlauben
region:
not_optional: "In dieser Region kannst du nicht im folgenden Modus sein: {0}"
blocked:
chest: Zugriff auf Truhen ist im Kreativ-Modus nicht erlaubt
sign: Im Kreativ-Modus kann nicht mit Schildern interagiert werden
button: Im Kreativ-Modus kann nicht mit Buttons interagiert werden
lever: Im Kreativ-Modus kann nicht mit Schaltern interagiert werden
survival_flying: Du solltest auf dem Boden stehen wenn du Kreativ-Regionen verlässt
outside_place: Du kannst keine Blöcke außerhalb von Spiel-Modus-Regionen setzen
outside_break: Du kannst keine Blöcke außerhalb von Spiel-Modus-Regionen zerstören
inside_place: Du kannst keine Blöcke innerhalb von Spiel-Modus-Regionen setzen
inside_break: Du kannst keine Blöcke innerhalb von Spiel-Modus-Regionen zerstören
use: Du darfst diese Art von Gegenständen im Kreativ-Modus verwenden
place: Du darfst diese Art von Blöcken im Kreativ-Modus nicht setzen
break: Du darfst diese Art von Blöcken im Kreativ-Modus nicht zerstören
piston: Verschieben von Block {0} aus einer Spiel-Modus-Region bei {1} wurde blockiert
piston_in: Verschieben von Block {0} in eine Spiel-Modus-Region bei {1} wurde blockiert

View file

@ -35,6 +35,8 @@ command:
no_integration: The worldguard-commands are not available, because worldguard wasn't found
flag_set: "The flag {0} was set"
additional_flags: Additional flags
cmdblock:
blocked: This command is blocked while in creative mode.
exception:
command:
lackingpermission: You do not have access to this command

View file

@ -1,6 +1,6 @@
name: LimitedCreative
main: de.jaschastarke.minecraft.limitedcreative.Core
version: 1.3.0c
version: 1.4.0a
softdepend: [WorldGuard, WorldEdit, MultiInv]
dev-url: http://dev.bukkit.org/server-mods/limited-creative/
commands:
@ -72,4 +72,7 @@ permissions:
default: false
limitedcreative.nolimit.break:
description: Allows bypassing the "block break"-limitation
default: false
default: false
limitedcreative.cmdblock.all:
description: Allowy bypassting the "command block"-limitation
default: op

10
pom.xml
View file

@ -3,7 +3,7 @@
<groupId>de.jaschastarke</groupId>
<artifactId>LimitedCreative</artifactId>
<name>LimitedCreative</name>
<version>1.3.0c</version>
<version>1.4.0a</version>
<url>https://github.com/possi/LimitedCreative</url>
<scm>
<connection>scm:git:git://github.com/possi/LimitedCreative.git</connection>
@ -31,6 +31,10 @@
<id>onarandombox</id>
<url>http://repo.onarandombox.com/content/groups/public</url>
</repository>
<repository>
<id>vault-repo</id>
<url>http://ci.herocraftonline.com/plugin/repository/everything</url>
</repository>
</repositories>
<build>
<sourceDirectory>${basedir}/src</sourceDirectory>
@ -68,12 +72,12 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.3.1-R1.0</version>
<version>1.4.2-R0.2</version>
</dependency>
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>worldguard</artifactId>
<version>5.5.4-SNAPSHOT</version>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>uk.org.whoami</groupId>

View file

@ -32,6 +32,9 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.material.MaterialData;
import de.jaschastarke.minecraft.limitedcreative.cmdblock.ICmdBlockEntry;
import de.jaschastarke.minecraft.limitedcreative.cmdblock.RegexpBlockEntry;
import de.jaschastarke.minecraft.limitedcreative.cmdblock.StringBlockEntry;
import de.jaschastarke.minecraft.limitedcreative.store.InvYamlStorage;
import de.jaschastarke.minecraft.limitedcreative.store.PlayerInventoryStorage;
@ -53,9 +56,8 @@ public class Configuration {
BLOCKBENCHES("limit.workbench", false),
REMOVEDROP("limit.remove_drops", true),
REMOVEPICKUP("limit.remove_pickup", false),
PERMISSIONS("permissions.enabled", false),
PERM_KEEPINVENTORY("permissions.keepinventory", false),
PERM_WEPIF("permissions.wepif", true),
CMDBLOCKER("cmdblocker.enabled", true),
DEBUG("debug", false);
private String key;
@ -93,8 +95,6 @@ public class Configuration {
throw new IllegalArgumentException("Setting this option is not allowed");*/
this.reload();
c.set(opt.getKey(), value);
if (value && opt == Option.PERM_KEEPINVENTORY && !this.getPermissionsEnabled())
c.set(Option.PERMISSIONS.getKey(), true);
this.save();
}
@ -153,12 +153,6 @@ public class Configuration {
return this.getBoolean(Option.BLOCKDAMAGEMOB);
}
public boolean getPermissionsEnabled() {
return this.getBoolean(Option.PERMISSIONS);
}
public boolean getPermissionToKeepInventory() {
return this.getPermissionsEnabled() && this.getBoolean(Option.PERM_KEEPINVENTORY);
}
public boolean getWEPIFEnabled() {
return this.getBoolean(Option.PERM_WEPIF);
}
@ -291,4 +285,23 @@ public class Configuration {
}
return null;
}
public boolean getCommandBlockerEnabled() {
return this.getBoolean(Option.CMDBLOCKER);
}
private List<ICmdBlockEntry> _blocklist = null;
public List<ICmdBlockEntry> getCommandBlockList() {
if (_blocklist == null) {
_blocklist = new ArrayList<ICmdBlockEntry>();
for (String cmd : c.getStringList("cmdblock.commands")) {
if (cmd.startsWith("^")) {
_blocklist.add(new RegexpBlockEntry(cmd));
} else {
_blocklist.add(new StringBlockEntry(cmd));
}
}
}
return _blocklist;
}
}

View file

@ -25,6 +25,7 @@ import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
import de.jaschastarke.minecraft.integration.Communicator;
import de.jaschastarke.minecraft.limitedcreative.cmdblock.CommandBlocker;
import de.jaschastarke.minecraft.limitedcreative.listeners.LimitListener;
import de.jaschastarke.minecraft.limitedcreative.listeners.MainListener;
import de.jaschastarke.minecraft.limitedcreative.regions.WorldGuardIntegration;
@ -40,6 +41,7 @@ public class Core extends JavaPlugin {
public Communicator com;
public static Core plugin;
public NoBlockItemSpawn spawnblock;
public CommandBlocker cmdblock;
@Override
public void onDisable() {
@ -55,6 +57,7 @@ public class Core extends JavaPlugin {
config = null;
spawnblock = null;
com = null;
cmdblock = null;
}
@Override
@ -86,9 +89,14 @@ public class Core extends JavaPlugin {
warn(L("basic.warning.worldguard_not_found", L("basic.feature.region")));
}
// 4th Feature: Command Blocker
if (config.getCommandBlockerEnabled())
cmdblock = new CommandBlocker(this);
debug("Store: " + config.getStoreEnabled());
debug("Limit: " + config.getLimitEnabled());
debug("Region: " + (worldguard != null));
debug("CmdBlock: " + config.getCommandBlockerEnabled());
Commands.register(this);

View file

@ -172,7 +172,7 @@ public class LCPlayer {
Core.debug(getName() + " going into " + gm);
if (isActiveRegionGameMode()) { // change to the other gamemode as the area defines
if (!isActiveRegionGameMode(gm)) { // only when we are not switching to the mode the region allows
if (!plugin.config.getRegionOptional() && (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.REGIONS_BYPASS))) {
if (!plugin.config.getRegionOptional() && !hasPermission(Perms.REGIONS_BYPASS)) {
getPlayer().sendMessage(ChatColor.RED + L("exception.region.not_optional", gm.toString().toLowerCase()));
Core.debug("... denied");
return false;
@ -192,7 +192,7 @@ public class LCPlayer {
* Feature 1: Separated Inventories / Storage
*/
if (plugin.config.getStoreEnabled()) {
if (plugin.config.getPermissionToKeepInventory() && hasPermission(Perms.KEEPINVENTORY))
if (hasPermission(Perms.KEEPINVENTORY))
return true;
getPlayer().closeInventory();
@ -252,7 +252,7 @@ public class LCPlayer {
public void onDropItem(PlayerDropItemEvent event) {
Core.debug(getName() + " ("+getPlayer().getGameMode()+") drops items " + event.getItemDrop().getItemStack().getType());
if (getPlayer().getGameMode() == GameMode.CREATIVE) {
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.DROP))
if (hasPermission(Perms.NoLimit.DROP))
return;
Core.debug("removed");
if (plugin.config.getRemoveDrop())
@ -263,7 +263,7 @@ public class LCPlayer {
}
public void onPickupItem(PlayerPickupItemEvent event) {
if (getPlayer().getGameMode() == GameMode.CREATIVE) {
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.PICKUP))
if (hasPermission(Perms.NoLimit.PICKUP))
return;
if (plugin.config.getBlockPickupInCreative()) {
event.setCancelled(true);
@ -276,7 +276,7 @@ public class LCPlayer {
public void onDie(EntityDeathEvent event) {
if (getPlayer().getGameMode() == GameMode.CREATIVE) {
if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.DROP)) {
if (!hasPermission(Perms.NoLimit.DROP)) {
event.getDrops().clear();
//getInv().storeTemp();
}
@ -297,13 +297,13 @@ public class LCPlayer {
// its PVP
Player attacker = (Player) from;
if (attacker.getGameMode() == GameMode.CREATIVE) {
if (!plugin.config.getPermissionsEnabled() || !Players.get(attacker).hasPermission(Perms.NoLimit.PVP)) {
if (!Players.get(attacker).hasPermission(Perms.NoLimit.PVP)) {
event.setCancelled(true);
return; // skip next check
}
}
if (getPlayer().getGameMode() == GameMode.CREATIVE) {
if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.PVP)) {
if (!hasPermission(Perms.NoLimit.PVP)) {
event.setCancelled(true);
}
}
@ -312,7 +312,7 @@ public class LCPlayer {
public void onDealDamage(EntityDamageByEntityEvent event) { // deals damage
if (event.getEntity() instanceof Creature) {
if (getPlayer().getGameMode() == GameMode.CREATIVE && plugin.config.getMobDamageBlock()) {
if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.MOB_DAMAGE)) {
if (!hasPermission(Perms.NoLimit.MOB_DAMAGE)) {
event.setCancelled(true);
}
}
@ -325,7 +325,7 @@ public class LCPlayer {
public void onTarget(EntityTargetEvent event) {
if (event.getEntity() instanceof Creature) {
if (((Player) event.getTarget()).getGameMode() == GameMode.CREATIVE && plugin.config.getMobDamageBlock()) {
if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.MOB_DAMAGE)) {
if (!hasPermission(Perms.NoLimit.MOB_DAMAGE)) {
event.setCancelled(true);
}
}
@ -335,7 +335,7 @@ public class LCPlayer {
public void onChestAccess(PlayerInteractEvent event) {
if (event.getPlayer().getGameMode() != GameMode.CREATIVE)
return;
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.CHEST))
if (hasPermission(Perms.NoLimit.CHEST))
return;
event.getPlayer().sendMessage(L("blocked.chest"));
event.setCancelled(true);
@ -343,7 +343,7 @@ public class LCPlayer {
public void onChestAccess(PlayerInteractEntityEvent event) { // chest-minecarts are different events
if (getPlayer().getGameMode() != GameMode.CREATIVE)
return;
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.CHEST))
if (hasPermission(Perms.NoLimit.CHEST))
return;
event.getPlayer().sendMessage(L("blocked.chest"));
event.setCancelled(true);
@ -351,7 +351,7 @@ public class LCPlayer {
public void onBenchAccess(PlayerInteractEvent event) {
if (!plugin.config.getBenchBlock() || event.getPlayer().getGameMode() != GameMode.CREATIVE)
return;
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.CHEST))
if (hasPermission(Perms.NoLimit.CHEST))
return;
event.getPlayer().sendMessage(L("blocked.chest"));
event.setCancelled(true);
@ -359,7 +359,7 @@ public class LCPlayer {
public void onSignAccess(PlayerInteractEvent event) {
if (!plugin.config.getSignBlock() || event.getPlayer().getGameMode() != GameMode.CREATIVE)
return;
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.SIGN))
if (hasPermission(Perms.NoLimit.SIGN))
return;
event.getPlayer().sendMessage(L("blocked.sign"));
event.setCancelled(true);
@ -368,12 +368,12 @@ public class LCPlayer {
if (!plugin.config.getButtonBlock() || event.getPlayer().getGameMode() != GameMode.CREATIVE)
return;
if (event.getClickedBlock().getState() instanceof Lever) {
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.LEVER))
if (hasPermission(Perms.NoLimit.LEVER))
return;
event.getPlayer().sendMessage(L("blocked.lever"));
event.setCancelled(true);
} else {
if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.BUTTON))
if (hasPermission(Perms.NoLimit.BUTTON))
return;
event.getPlayer().sendMessage(L("blocked.button"));
event.setCancelled(true);

View file

@ -65,4 +65,14 @@ public enum Perms implements IPermission {
return Perms.NS + SEP + NoLimit.NS + SEP + perm;
}
}
public static final class CmdBlock { // not the best way, but this matches to everything in this plugin ;)
public static final String NS = "cmdblock";
public static IPermission ALL = new IPermission() {
public String toString() {
return Perms.NS + SEP + CmdBlock.NS + SEP + "all";
}
};
}
}

View file

@ -0,0 +1,42 @@
package de.jaschastarke.minecraft.limitedcreative.cmdblock;
import static de.jaschastarke.minecraft.utils.Locale.L;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import de.jaschastarke.minecraft.limitedcreative.Core;
import de.jaschastarke.minecraft.limitedcreative.LCPlayer;
import de.jaschastarke.minecraft.limitedcreative.Perms;
import de.jaschastarke.minecraft.limitedcreative.Players;
public class CommandBlocker {
private Core plugin;
public CommandBlocker(Core plugin) {
this.plugin = plugin;
plugin.getServer().getPluginManager().registerEvents(new Listener(), plugin);
}
class Listener implements org.bukkit.event.Listener {
@EventHandler
public void onPreCommand(PlayerCommandPreprocessEvent event) {
String cmd = event.getMessage();
if (cmd.startsWith("/")) { // just to be sure ;)
cmd = cmd.substring(1);
for (ICmdBlockEntry blockentry : plugin.config.getCommandBlockList()) {
if (blockentry.test(cmd)) {
LCPlayer player = Players.get(event.getPlayer());
if (!player.hasPermission(Perms.CmdBlock.ALL)) {
Core.debug("CmdBlock: "+event.getPlayer().getName()+": '/"+cmd+"' blocked by rule '"+blockentry.toString()+"'");
event.setCancelled(true);
event.getPlayer().sendMessage(L("cmdblock.blocked"));
return;
}
}
}
}
}
}
}

View file

@ -0,0 +1,5 @@
package de.jaschastarke.minecraft.limitedcreative.cmdblock;
public interface ICmdBlockEntry {
public boolean test(String cmd);
}

View file

@ -0,0 +1,19 @@
package de.jaschastarke.minecraft.limitedcreative.cmdblock;
import java.util.regex.Pattern;
public class RegexpBlockEntry implements ICmdBlockEntry {
private Pattern rx;
public RegexpBlockEntry(String regex) {
rx = Pattern.compile(regex);
}
@Override
public boolean test(String cmd) {
return rx.matcher(cmd).matches();
}
public String toString() {
return rx.pattern();
}
}

View file

@ -0,0 +1,17 @@
package de.jaschastarke.minecraft.limitedcreative.cmdblock;
public class StringBlockEntry implements ICmdBlockEntry {
private String str;
public StringBlockEntry(String cmd) {
str = cmd;
}
@Override
public boolean test(String cmd) {
return cmd.startsWith(this.str);
}
public String toString() {
return str;
}
}

View file

@ -25,9 +25,11 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.StorageMinecart;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -39,6 +41,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
@ -76,7 +79,7 @@ public class LimitListener implements Listener {
return;
LCPlayer player = Players.get(event.getPlayer());
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.USE)) {
if (!player.hasPermission(Perms.NoLimit.USE)) {
if (event.getItem() != null && BlackList.isBlackListed(plugin.config.getBlockedUse(), event.getItem())) {
event.setCancelled(true);
event.setUseItemInHand(Event.Result.DENY);
@ -107,16 +110,25 @@ public class LimitListener implements Listener {
return;
LCPlayer player = Players.get(event.getPlayer());
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.USE)) {
if (!player.hasPermission(Perms.NoLimit.USE)) {
if (event.getPlayer().getItemInHand() != null && BlackList.isBlackListed(plugin.config.getBlockedUse(), event.getPlayer().getItemInHand())) {
event.setCancelled(true);
event.getPlayer().sendMessage(L("blocked.use"));
return;
}
}
Entity entity = event.getRightClicked();
// Temporary Solution: While dropping of Items is prevented we don't allow Interaction with ItemFrames, so no
// Items can be "placed" anywhere.
if (!player.hasPermission(Perms.NoLimit.DROP)) {
if (entity instanceof ItemFrame && plugin.config.getRemoveDrop()) {
event.setCancelled(true);
event.getPlayer().sendMessage(L("blocked.use"));
return;
}
}
if (entity instanceof StorageMinecart) {
player.onChestAccess(event);
}
@ -168,25 +180,24 @@ public class LimitListener implements Listener {
Players.get(event.getPlayer()).onRespawn(event);
}*/
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
if (event.isCancelled())
return;
if (event.getPlayer().getGameMode() == GameMode.CREATIVE) {
LCPlayer player = Players.get(event.getPlayer());
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.BREAK)) {
if (BlackList.isBlackListed(plugin.config.getBlockedBreaks(), event.getBlock())) {
private void whenBlockBreak(Cancellable event, Block block, Player eventPlayer) {
if (eventPlayer.getGameMode() == GameMode.CREATIVE) {
LCPlayer player = Players.get(eventPlayer);
if (!player.hasPermission(Perms.NoLimit.BREAK)) {
if (BlackList.isBlackListed(plugin.config.getBlockedBreaks(), block)) {
event.setCancelled(true);
event.getPlayer().sendMessage(L("blocked.break"));
eventPlayer.sendMessage(L("blocked.break"));
}
}
if (plugin.config.getPermissionsEnabled() && player.hasPermission(Perms.NoLimit.DROP))
if (player.hasPermission(Perms.NoLimit.DROP))
return;
// Prevent dropping of doors and beds when destroying the wrong part
Block block = event.getBlock();
// TODO: Fix, Remove, or make it god like, but this little thing is crap ;)
Material mat = block.getType();
switch (event.getBlock().getType()) {
switch (block.getType()) {
case WOODEN_DOOR:
mat = Material.WOOD_DOOR;
plugin.spawnblock.block(block.getRelative(BlockFace.DOWN).getLocation(), mat);
@ -203,17 +214,34 @@ public class LimitListener implements Listener {
plugin.spawnblock.block(block.getRelative(BlockFace.WEST).getLocation(), mat);
break;
default:
plugin.spawnblock.block(event.getBlock().getLocation(), mat);
plugin.spawnblock.block(block.getLocation(), mat);
}
}
}
/* Doesn't make sense yet, as the block always will be Air. whenBlockBreak should be changed to use Material
* instead. Maybe in the Feature.
@EventHandler
public void onHangingBreak(HangingBreakByEntityEvent event) {
if (event.getRemover() instanceof Player) {
Player eventPlayer = (Player) event.getRemover();
whenBlockBreak(event, event.getEntity().getLocation().getBlock(), eventPlayer);
}
}*/
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
if (event.isCancelled())
return;
whenBlockBreak(event, event.getBlock(), event.getPlayer());
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
if (event.isCancelled())
return;
if (event.getPlayer().getGameMode() == GameMode.CREATIVE) {
LCPlayer player = Players.get(event.getPlayer());
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.USE)) {
if (!player.hasPermission(Perms.NoLimit.USE)) {
if (BlackList.isBlackListed(plugin.config.getBlockedUse(), event.getBlock())) {
event.setCancelled(true);
event.getPlayer().sendMessage(L("blocked.place"));

View file

@ -7,6 +7,8 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
@ -14,6 +16,7 @@ import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import de.jaschastarke.minecraft.limitedcreative.Core;
import de.jaschastarke.minecraft.limitedcreative.LCPlayer;
@ -43,27 +46,38 @@ public class RegionListener implements Listener {
public void onBlockBreak(BlockBreakEvent event) {
if (event.isCancelled())
return;
whenBlockBreak(event, event.getBlock(), event.getPlayer());
}
@EventHandler
public void onHangingBreak(HangingBreakByEntityEvent event) {
if (event.getRemover() instanceof Player) {
Player eventPlayer = (Player) event.getRemover();
whenBlockBreak(event, event.getEntity().getLocation().getBlock(), eventPlayer);
}
}
LCPlayer player = Players.get(event.getPlayer());
boolean diffrent_region = rm.isDiffrentRegion(event.getPlayer(), event.getBlock().getLocation());
private void whenBlockBreak(Cancellable event, Block block, Player eventPlayer) {
LCPlayer player = Players.get(eventPlayer);
boolean diffrent_region = rm.isDiffrentRegion(eventPlayer, block.getLocation());
if (player.isActiveRegionGameMode() && diffrent_region) {
// do not break outside of "gamemod-change-region" when in the region
if (rm.getRegionSet(event.getBlock()).getFlag(Flags.GAMEMODE, event.getPlayer()) != player.getActiveRegionGameMode()) {
event.getPlayer().sendMessage(L("blocked.outside_break"));
if (rm.getRegionSet(block).getFlag(Flags.GAMEMODE, eventPlayer) != player.getActiveRegionGameMode()) {
eventPlayer.sendMessage(L("blocked.outside_break"));
event.setCancelled(true);
}
} else if (diffrent_region) {
// do not break inside of "survial-region in creative world" when outside
if (rm.getRegionSet(event.getBlock()).getFlag(Flags.GAMEMODE) != null) {
event.getPlayer().sendMessage(L("blocked.inside_break"));
if (rm.getRegionSet(block).getFlag(Flags.GAMEMODE) != null) {
eventPlayer.sendMessage(L("blocked.inside_break"));
event.setCancelled(true);
}
}
if (!event.isCancelled()) {
// prevent any drops for survival players in creative regions
if (event.getPlayer().getGameMode() != GameMode.CREATIVE && rm.getRegionSet(event.getBlock()).getFlag(Flags.GAMEMODE) == GameMode.CREATIVE) {
plugin.spawnblock.block(event.getBlock(), player);
if (eventPlayer.getGameMode() != GameMode.CREATIVE && rm.getRegionSet(block).getFlag(Flags.GAMEMODE) == GameMode.CREATIVE) {
plugin.spawnblock.block(block, player);
}
}
}