Compare commits

..
11 Commits
14 changed files with 419 additions and 35 deletions

No files matched your search

+15
View File
@@ -1,3 +1,18 @@
1.4.1
- Fixed issue with the block lag fix dropping item stacks of 0 quantity.
1.4
- New on-acquire hook. This does both a total inventory check on inventory
change and item pick up denial. The item pick up denial is largely
thanks to Dinnerbone for fulfilling my request to add a particular hook.
- Item durability can now be toggled with item-durability. Thanks to
Dinnerbone for figuring this out while filfilling my request. The
default setting is to fix item durability.
- New no-physics-gravel and no-physics-sand options allow you to
prevent gravel and sand from falling.
- New allow-portal-anywhere option allows you to create portal blocks
anywhere.
1.3
- UPGRADE WARNING: If you are using database logging, you must add a
NULL 'comment' VARCHAR field to the table. The line of SQL that you
+29 -1
View File
@@ -24,6 +24,9 @@ use or not:
- Temporarily stop fire globally with some commands.
- Fix the block lag.
- Destroy tools on drop to alleviate the durability cheat.
- OR just fix the durability bug.
- Prevent gravel and sand from falling.
- Allow portal blocks to be placed anywhere.
hMod is required as WorldGuard is a plugin for hMod.
@@ -34,6 +37,9 @@ A "worldguard.properties" will be created the first the time that you load
WorldGuard on your server. You can either restart your server or use
/reloadplugin WorldGuard to reload the configuraton file after editing it.
- item-durability (def. true)
Enables item durability.
- classic-water (def. false)
Toggle use of classic water. Be foreward that your world may be
flooded if you are not careful. If you have WorldEdit, you can use
@@ -51,6 +57,15 @@ WorldGuard on your server. You can either restart your server or use
creating a 5x5x5 cuboid free of water. Increasing the number will
increase server load exponentially, although 3-5 has fairly low impact.
- no-physics-gravel (def. false)
Prevents gravel from falling due to gravity.
- no-physics-sand (def. false)
Prevents sand from falling due to gravity.
- allow-portal-anywhere (def. false)
Allows you to place portal blocks anywhere.
- enforce-single-session (def. true)
Enforce single sessions. If the player is already found to be on
the server when s/he logs in, the other player will be kicked with
@@ -67,7 +82,8 @@ WorldGuard on your server. You can either restart your server or use
command; it is only used for permissions.
- block-creepers (def. false)
Block creeper explosions. They will not explode client-side.
Block creeper explosions from destroying terrain (and possibly from
causing damage).
- disable-lava-fire (def. false)
Prevent lava from starting fires.
@@ -179,3 +195,15 @@ certain rules apply to only some groups.
Edit the included worldguard-blacklist.txt file and follow the
instructions inside. The file comes with the download for WorldGuard.
Thanks
------
While I would like to thank everyone for their support, I would like to
say thanks to the following individuals for their direct
contributions to WorldGuard:
- Sturmeh, for contributing the original durability workaround
- Meaglin, for changing the on flow hook at my request
- Dinnerbone, for implementing the on item pick up hook at my request,
and also for figuring out the durability bug in the process
+1 -1
View File
@@ -1,2 +1,2 @@
Manifest-Version: 1.0
WorldGuard-Version: 1.3
WorldGuard-Version: 1.4.1
+61
View File
@@ -45,6 +45,11 @@ public class Blacklist {
*/
private BlacklistLogger blacklistLogger = new BlacklistLogger();
/**
* Blacklist contains on-acquire events.
*/
private boolean hasOnAcquire;
/**
* Returns whether the list is empty.
*
@@ -219,6 +224,48 @@ public class Blacklist {
return ret;
}
/**
* Called on acquire. Returns true to let the action pass through.
*
* @param item
* @param player
* @return
*/
public boolean onAcquire(int item, Player player) {
List<BlacklistEntry> entries = getEntries(item);
if (entries == null) {
return true;
}
boolean ret = true;
for (BlacklistEntry entry : entries) {
if (!entry.onAcquire(item, player)) {
ret = false;
}
}
return ret;
}
/**
* Called on acquire. Returns true to let the action pass through.
*
* @param item
* @param player
* @return
*/
public boolean onSilentAcquire(int item, Player player) {
List<BlacklistEntry> entries = getEntries(item);
if (entries == null) {
return true;
}
boolean ret = true;
for (BlacklistEntry entry : entries) {
if (!entry.onSilentAcquire(item, player)) {
ret = false;
}
}
return ret;
}
/**
* Load the blacklist.
*
@@ -235,6 +282,8 @@ public class Blacklist {
input = new FileReader(file);
BufferedReader buff = new BufferedReader(input);
hasOnAcquire = false;
String line;
List<BlacklistEntry> currentEntries = null;
while ((line = buff.readLine()) != null) {
@@ -304,6 +353,9 @@ public class Blacklist {
entry.setUseActions(parts[1].split(","));
} else if (parts[0].equalsIgnoreCase("on-drop")) {
entry.setDropActions(parts[1].split(","));
} else if (parts[0].equalsIgnoreCase("on-acquire")) {
hasOnAcquire = true;
entry.setAcquireActions(parts[1].split(","));
} else if (parts[0].equalsIgnoreCase("message")) {
entry.setMessage(parts[1].trim());
} else if (parts[0].equalsIgnoreCase("comment")) {
@@ -333,4 +385,13 @@ public class Blacklist {
}
}
}
/**
* Blacklist contains on-acquire events.
*
* @return
*/
public boolean hasOnAcquire() {
return hasOnAcquire;
}
}
+96 -22
View File
@@ -67,11 +67,29 @@ public class BlacklistEntry {
*/
private String[] dropActions;
/**
* Comment for the log.
* List of actions to perform on drop.
*/
private String[] acquireActions;
/**
* Message for users.
*/
private String message;
/**
* Comment for administrators.
*/
private String comment;
/**
* Used to ignore messages.
*/
private static ActionHandler silentHandler = new ActionHandler() {
public void log(String itemName) {}
public void kick(String itemName) {}
public void ban(String itemName) {}
public void notifyAdmins(String itemName) {}
public void tell(String itemName) {}
};
/**
* Construct the object.
*
@@ -183,6 +201,20 @@ public class BlacklistEntry {
this.dropActions = actions;
}
/**
* @return
*/
public String[] getAcquireActions() {
return acquireActions;
}
/**
* @param actions
*/
public void setAcquireActions(String[] actions) {
this.acquireActions = actions;
}
/**
* @return the message
*/
@@ -292,7 +324,7 @@ public class BlacklistEntry {
}
};
return process(block.getType(), player, destroyActions, handler, false);
return process(block.getType(), player, destroyActions, handler, false, false);
}
/**
@@ -329,7 +361,7 @@ public class BlacklistEntry {
}
};
return process(block.getType(), player, breakActions, handler, true);
return process(block.getType(), player, breakActions, handler, true, false);
}
/**
@@ -365,7 +397,7 @@ public class BlacklistEntry {
}
};
return process(item, player, destroyWithActions, handler, false);
return process(item, player, destroyWithActions, handler, false, false);
}
/**
@@ -401,7 +433,7 @@ public class BlacklistEntry {
}
};
return process(item, player, createActions, handler, true);
return process(item, player, createActions, handler, true, false);
}
/**
@@ -437,7 +469,7 @@ public class BlacklistEntry {
}
};
return process(block.getType(), player, useActions, handler, false);
return process(block.getType(), player, useActions, handler, false, false);
}
/**
@@ -452,20 +484,7 @@ public class BlacklistEntry {
return true;
}
ActionHandler handler = new ActionHandler() {
public void log(String itemName) {
}
public void kick(String itemName) {
}
public void ban(String itemName) {
}
public void notifyAdmins(String itemName) {
}
public void tell(String itemName) {
}
};
return process(block.getType(), player, useActions, handler, false);
return process(block.getType(), player, useActions, silentHandler, false, true);
}
/**
@@ -501,7 +520,58 @@ public class BlacklistEntry {
}
};
return process(item, player, dropActions, handler, true);
return process(item, player, dropActions, handler, true, false);
}
/**
* Called on item acquire. Returns true to let the action pass through.
*
* @param item
* @param player
* @return
*/
public boolean onAcquire(final int item, final Player player) {
if (acquireActions == null) {
return true;
}
final BlacklistEntry entry = this;
ActionHandler handler = new ActionHandler() {
public void log(String itemName) {
blacklist.getLogger().logAcquireAttempt(player, item, comment);
}
public void kick(String itemName) {
player.kick("You can't acquire " + itemName);
}
public void ban(String itemName) {
entry.banPlayer(player, "Banned: You can't acquire " + itemName);
}
public void notifyAdmins(String itemName) {
entry.notifyAdmins(player.getName() + " (acquire) " + itemName
+ (comment != null ? " (" + comment + ")" : "") + ".");
}
public void tell(String itemName) {
player.sendMessage(Colors.Yellow + "You're not allowed to acquire " + itemName + ".");
}
};
return process(item, player, acquireActions, handler, true, false);
}
/**
* Called on item acquire. Returns true to let the action pass through.
*
* @param item
* @param player
* @return
*/
public boolean onSilentAcquire(final int item, final Player player) {
if (acquireActions == null) {
return true;
}
return process(item, player, acquireActions, silentHandler, false, true);
}
/**
@@ -512,10 +582,11 @@ public class BlacklistEntry {
* @param actions
* @param handler
* @param allowRepeat
* @param silent
* @return
*/
private boolean process(int id, Player player, String[] actions,
ActionHandler handler, boolean allowRepeat) {
ActionHandler handler, boolean allowRepeat, boolean silent) {
if (shouldIgnore(player)) {
return true;
@@ -543,6 +614,9 @@ public class BlacklistEntry {
for (String action : actions) {
// Deny
if (action.equalsIgnoreCase("deny")) {
if (silent) {
return false;
}
ret = false;
// Kick
+13 -1
View File
@@ -119,7 +119,7 @@ public class BlacklistLogger implements BlacklistLoggerHandler {
}
/**
* Log a right click attempt.
* Log a drop attempt.
*
* @param player
* @param item
@@ -130,6 +130,18 @@ public class BlacklistLogger implements BlacklistLoggerHandler {
}
}
/**
* Log an acquire attempt.
*
* @param player
* @param item
*/
public void logAcquireAttempt(Player player, int item, String comment) {
for (BlacklistLoggerHandler handler : handlers) {
handler.logAcquireAttempt(player, item, comment);
}
}
/**
* Close the connection.
*/
+7
View File
@@ -65,6 +65,13 @@ public interface BlacklistLoggerHandler {
* @param item
*/
public void logDropAttempt(Player player, int item, String comment);
/**
* Log an acquire attempt.
*
* @param player
* @param item
*/
public void logAcquireAttempt(Player player, int item, String comment);
/**
* Close the logger.
*/
+12
View File
@@ -102,6 +102,18 @@ public class ConsoleLoggerHandler implements BlacklistLoggerHandler {
+ (comment != null ? " (" + comment + ")" : ""));
}
/**
* Log an acquire attempt.
*
* @param player
* @param item
*/
public void logAcquireAttempt(Player player, int item, String comment) {
logger.log(Level.INFO, "WorldGuard: " + player.getName()
+ " tried to acquire " + getFriendlyItemName(item)
+ (comment != null ? " (" + comment + ")" : ""));
}
/**
* Get an item's friendly name with its ID.
*
+12
View File
@@ -188,6 +188,18 @@ public class DatabaseLoggerHandler implements BlacklistLoggerHandler {
(int)Math.floor(player.getZ()), item, comment);
}
/**
* Log an aquire attempt.
*
* @param player
* @param item
*/
public void logAcquireAttempt(Player player, int item, String comment) {
logEvent("AQUIRE", player.getName(),
(int)Math.floor(player.getX()), (int)Math.floor(player.getY()),
(int)Math.floor(player.getZ()), item, comment);
}
/**
* Close the connection.
*/
+10
View File
@@ -269,6 +269,16 @@ public class FileLoggerHandler implements BlacklistLoggerHandler {
log(player, "Tried to drop " + getFriendlyItemName(item), comment);
}
/**
* Log an acquire attempt.
*
* @param player
* @param item
*/
public void logAcquireAttempt(Player player, int item, String comment) {
log(player, "Tried to acquire " + getFriendlyItemName(item), comment);
}
/**
* Get an item's friendly name with its ID.
*
+7 -1
View File
@@ -75,12 +75,18 @@ public class WorldGuard extends Plugin {
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.DISCONNECT, listener, this,
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.ITEM_DROP , listener, this,
loader.addListener(PluginLoader.Hook.ITEM_DROP, listener, this,
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.ITEM_PICK_UP, listener, this,
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.COMPLEX_BLOCK_CHANGE, listener, this,
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.COMPLEX_BLOCK_SEND, listener, this,
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.INVENTORY_CHANGE, listener, this,
PluginListener.Priority.HIGH);
loader.addListener(PluginLoader.Hook.BLOCK_PHYSICS, listener, this,
PluginListener.Priority.MEDIUM);
}
/**
+89 -5
View File
@@ -58,10 +58,6 @@ public class WorldGuardListener extends PluginListener {
* Properties file for WorldGuard.
*/
private PropertiesFile properties = new PropertiesFile("worldguard.properties");
/**
* List of blocks to remove when possible.
*/
private LinkedList<int[]> blockRemoveQueue = new LinkedList<int[]>();
/**
* Stop fire spread mode.
@@ -77,10 +73,14 @@ public class WorldGuardListener extends PluginListener {
private boolean simulateSponge;
private int spongeRadius;
private boolean blockLagFix;
private boolean itemDurability;
private Set<Integer> fireNoSpreadBlocks;
private Set<Integer> allowedLavaSpreadOver;
private Set<Integer> itemDropBlacklist;
private boolean classicWater;
private boolean noPhysicsGravel;
private boolean noPhysicsSand;
private boolean allowPortalAnywhere;
private Blacklist blacklist;
/**
@@ -143,6 +143,10 @@ public class WorldGuardListener extends PluginListener {
simulateSponge = properties.getBoolean("simulate-sponge", false);
spongeRadius = Math.max(1, properties.getInt("sponge-radius", 3)) - 1;
blockLagFix = properties.getBoolean("block-lag-fix", false);
itemDurability = properties.getBoolean("item-durability", true);
noPhysicsGravel = properties.getBoolean("no-physics-gravel", false);
noPhysicsSand = properties.getBoolean("no-physics-sand", false);
allowPortalAnywhere = properties.getBoolean("allow-portal-anywhere", false);
// Console log configuration
boolean logConsole = properties.getBoolean("log-console", true);
@@ -346,6 +350,58 @@ public class WorldGuardListener extends PluginListener {
}
}
if (!itemDurability) {
item.setDamage(0);
}
return false;
}
/**
* Called when a player picks up an item.
*
* @param player
* player who picked up the item
* @param item
* item that was picked up
* @return true if you want to leave the item where it was
*/
public boolean onItemPickUp(Player player, Item item) {
if (blacklist != null && blacklist.hasOnAcquire()) {
if (!blacklist.onSilentAcquire(item.getItemId(), player)) {
return true;
}
}
return false;
}
/**
* Called when a player's inventory is modified.
*
* @param player
* player who's inventory was modified
* @return true if you want any changes to be reverted
*/
public boolean onInventoryChange(Player player) {
if (blacklist != null && blacklist.hasOnAcquire()) {
hj[] items = player.getInventory().getArray();
boolean needUpdate = false;
for (int i = 0; i < items.length; i++) {
if (items[i] != null) {
if (!blacklist.onAcquire(items[i].c, player)) {
items[i] = null;
needUpdate = true;
}
}
}
if (needUpdate) {
player.getInventory().updateInventory();
}
}
return false;
}
@@ -488,7 +544,7 @@ public class WorldGuardListener extends PluginListener {
if (dropItem > 0) {
for (int i = 0; i < count; i++) {
etc.getServer().dropItem(block.getX(), block.getY(), block.getZ(),
dropItem, i);
dropItem, 1);
}
// Drop flint with gravel
@@ -733,6 +789,34 @@ public class WorldGuardListener extends PluginListener {
return false;
}
/**
* Called when the game is checking the physics for a certain block.
* This method is called frequently whenever a nearby block is changed,
* or if the block has just been placed.
* Currently the only supported blocks are sand, gravel and portals.
*
* @param block Block which requires special physics
* @param boolean true if this block has just been placed
* @return true if you do want to stop the default physics for this block
*/
public boolean onBlockPhysics(Block block, boolean placed) {
int id = block.getType();
if (id == 13 && noPhysicsGravel) {
return true;
}
if (id == 12 && noPhysicsSand) {
return true;
}
if (id == 90 && allowPortalAnywhere) {
return true;
}
return false;
}
/**
* Called on player disconnect
*
+14 -4
View File
@@ -25,6 +25,7 @@
# - on-create (the item/block in the user's inventory is being created)
# - on-use (the block is right clicked)
# - on-drop (the item is being dropped from the player's inventory)
# - on-acquire (the item enters a player's inventory via some method)
#
# Actions (for events):
# - deny (deny completely)
@@ -34,6 +35,13 @@
# - kick (kick player)
# - ban (ban player)
#
# With the on-acquire event, it will completely block item pick ups
# (the item will still be on the ground) if you use 'deny' but the other
# actions (notify, log, etc.) won't do anything. However, if the player
# receives the item via a different method (i.e. from a chest), all actions
# will work although the item is removed after a short delay rather than
# blocked from the beginning (as it is part client-side).
#
# Users with the /worldguardnotify permission will be receive notifications.
#
# -------------
@@ -75,7 +83,9 @@
#[lever]
#on-break=deny
#[diamondpickaxe,woodpickaxe]
#on-drop=deny
#comment=durability cheat
#message=Your item was destroyed
# This is an example of the 'durability cheat' workaround that destroys your
# tool when you drop it
#[256,257,258,259,267,268,269,270,271,272,273,274,275,276,277,278,279,283,284,285,286,290,291,292,293,294,346]
#on-drop=deny,tell
#comment=Durability Hacks
#message=Your tool was destroyed
+53
View File
@@ -0,0 +1,53 @@
# This is a starter copy of WorldGuard's configuration so you can configure
# WorldGuard right from the beginning. Copy it into your server folder
# (into where server.properties resides) and edit the file as your desire.
# These comments will be lost whenever WorldGuard updates this file.
# More detailed descriptions of the options can be found in README.txt!
summary-on-start=true
# Toggle the item durabiltiy fix
item-durability=true
# Simulate sponge
simulate-sponge=false
sponge-radius=3
# Simulate classic water
classic-water=false
# Fix block lag
block-lag-fix=false
# Adjust physics
allow-portal-anywhere=false
no-physics-gravel=false
no-physics-sand=false
# Protection
enforce-single-session=true
item-drop-blacklist=
# Simple prevention
block-creepers=false
block-lighter=false
block-tnt=false
# Control fire
disable-all-fire-spread=false
disallowed-fire-spread-blocks=
# Disable lava fire and spread
disable-lava-fire=false
allowed-lava-spread-blocks=
# Log/blacklist
log-console=true
log-database-dsn=jdbc\:mysql\://localhost\:3306/minecraft
log-database-pass=
log-database-table=blacklist_events
log-database-user=root
log-database=false
log-file-open-files=10
log-file-path=worldguard/logs/%Y-%m-%d.log
log-file=false