Added RuleLists, which are a more flexible version of blacklists, with a cleanup of code.

RuleLists abstract events, and provide a way to unify WorldGuard's various code paths eventually.

There's also a general cleanup of everything and added support for changing the per-world configurations and blacklists (fixes WORLDGUARD-2232). WORLDGUARD-2203 is implicitly fixed by this, although not entirely fully as this does not yet replace blacklists.

Most configuration settings have been rewritten as RuleList rules and can be found in src/main/resources/builtin_rules.yml. Some configuration changes were made: anti-wolf-dumbness was deprecated in favor of wolves-practically-invincible, and ocelots-practically-invincible was added.

Sponges can now re-place water when they are removed, fixing WORLDGUARD-2202.
This commit is contained in:
sk89q 2012-11-03 23:15:06 -07:00
parent a035bcc671
commit 4f5a751519
92 changed files with 6970 additions and 1791 deletions

11
pom.xml
View File

@ -43,6 +43,12 @@
<version>5.4.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>rebar</artifactId>
<version>4.1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
@ -122,9 +128,9 @@
<filtering>true</filtering>
<directory>${basedir}/src/main/resources/</directory>
<includes>
<include>config.yml</include>
<include>config_world.yml</include>
<include>blacklist.txt</include>
<include>builtin_rules.yml</include>
<include>rulelist.yml</include>
</includes>
</resource>
</resources>
@ -173,6 +179,7 @@
<includes>
<include>net.sf.opencsv:opencsv</include>
<include>org.khelekore:prtree</include>
<include>com.sk89q:rebar</include>
</includes>
</artifactSet>
</configuration>

View File

@ -3,6 +3,7 @@
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>default</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>tar.gz</format>

View File

@ -0,0 +1,35 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* An action that will be performed if the conditions are matched of the rule.
*
* @param <T> implementation-specific context object
*/
public interface Action<T extends Context> {
/**
* Apply the action.
*
* @param context implementation-specific context object
*/
void apply(T context);
}

View File

@ -0,0 +1,40 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* An object that can learn rules and possibly implement them. Attachments can be
* analogous to events that occur in the game. An attachment, for example, would be
* a block break event.
*/
public interface Attachment {
/**
* Learn a rule.
*
* @param rule rule
*/
public void learn(Rule<?> rule);
/**
* Forget all previously learned rules.
*/
public void forgetRules();
}

View File

@ -0,0 +1,62 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.HashMap;
import java.util.Map;
/**
* Manages known attachment points.
*
* @see Attachment
*/
public class AttachmentManager {
private final Map<String, Attachment> attachments = new HashMap<String, Attachment>();
/**
* Register an {@link Attachment}.
*
* @param name name of the attachment (used in a rule's 'when' clause) (case insensitive)
* @param attachment attachment
*/
public void register(String name, Attachment attachment) {
attachments.put(name.toLowerCase(), attachment);
}
/**
* Get an attachment.
*
* @param name name of the attachment (case insensitive)
* @return attachment
*/
public Attachment get(String name) {
return attachments.get(name.toLowerCase());
}
/**
* Forget all the rules in the registered attachments.
*/
public void forgetRules() {
for (Attachment attachment : attachments.values()) {
attachment.forgetRules();
}
}
}

View File

@ -0,0 +1,88 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* A context has some shared variables that may be used by a number of different
* events. Because the context contains common information, criteria and
* actions do not have to be custom tailored to specific implementation-specific
* events, and can refer to the the properties set on the context. The place
* where the information is known as to what is considered the proper valid
* value of a common property is during the initial handling of
* the event in the implementation.
* </p>
* Implementations need to have custom contexts that can carry more
* information than offered in this abstract implementation. Criteria and
* actions can be implement-specific by tailoring themselves to one of these
* implementation-specific contexts.
*
* @author sk89q
*/
public abstract class Context {
private boolean matches = false;
private boolean cancelled = false;
/**
* Gets whether the event associated with this context has been set to
* be cancelled.
*
* @return true if the event is set to be cancelled
*/
public boolean isCancelled() {
return cancelled;
}
/**
* Set the event associated with this context to be cancelled, if possible.
*/
public void cancel() {
setCancelled(true);
}
/**
* Set the event associated with this context to be cancelled, if possible.
*
* @param cancelled true to cancel
*/
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
/**
* Set as to whether all the conditions associated with this context have
* evaluated to being true.
*
* @param matches match state
*/
void setMatches(boolean matches) {
this.matches = matches;
}
/**
* Returns whether all the conditions associated with this context
* have been evaluated to true.
*
* @return true if all the conditions have been true
*/
public boolean matches() {
return matches;
}
}

View File

@ -0,0 +1,37 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* A criteria that is evaluated to decide whether the rule should undergo
* further processing.
*
* @param <T> an implementation-specific context
*/
public interface Criteria<T extends Context> {
/**
* Returns whether the current event / context matches this criteria.
*
* @param context context to verify
* @return true if it matches
*/
boolean matches(T context);
}

View File

@ -0,0 +1,99 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A {@link Rule} implementation with a list of {@link Criteria} and
* {@link Action}s.
*
* @param <T> underlying implementation-specific context
*/
public class DefinedRule<T extends Context> implements Rule<T> {
private static Logger logger = Logger.getLogger(Rule.class.getCanonicalName());
private final List<Criteria<T>> criterion = new LinkedList<Criteria<T>>();
private final List<Action<T>> actions = new LinkedList<Action<T>>();
/**
* Add a criteria to this rule.
*
* @param criteria the criteria
*/
public void add(Criteria<T> criteria) {
criterion.add(criteria);
}
/**
* Add an action to this rule.
*
* @param action the action
*/
public void add(Action<T> action) {
actions.add(action);
}
/**
* Returns whether criteria are defined.
*
* @return true if there are criteria
*/
public boolean hasCriterion() {
return criterion.size() > 0;
}
/**
* Returns whether actions are defined.
*
* @return true if there are actions
*/
public boolean hasActions() {
return actions.size() > 0;
}
@Override
public boolean matches(T context) {
for (Criteria<T> criteria : criterion) {
if (!criteria.matches(context)) {
context.setMatches(false);
return false;
}
}
context.setMatches(true);
return true;
}
@Override
public void apply(T context) {
for (Action<T> action : actions) {
try {
action.apply(context);
} catch (Throwable t) {
logger.log(Level.WARNING, "Failed to apply action of rule", t);
}
}
}
}

View File

@ -0,0 +1,42 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import com.sk89q.rebar.config.LoaderBuilderException;
public class DefinitionException extends LoaderBuilderException {
private static final long serialVersionUID = -5429457695711163632L;
public DefinitionException() {
}
public DefinitionException(String message) {
super(message);
}
public DefinitionException(Throwable cause) {
super(cause);
}
public DefinitionException(String message, Throwable cause) {
super(message, cause);
}
}

View File

@ -0,0 +1,47 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class DefinitionInitializeEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private final RuleListsManager ruleListsManager;
public DefinitionInitializeEvent(RuleListsManager ruleListsManager) {
this.ruleListsManager = ruleListsManager;
}
public RuleListsManager getManager() {
return ruleListsManager;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}

View File

@ -0,0 +1,76 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.HashMap;
import java.util.Map;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.ConfigurationValue;
import com.sk89q.rebar.config.Loader;
/**
* Manages loaders for definitions of the given generic type.
*
* @author sk89q
* @param <V> type to create
*/
public class DefinitionManager<V> {
/**
* Map of factories.
*/
private Map<String, Loader<? extends V>> factories = new HashMap<String, Loader<? extends V>>();
/**
* Register a loader.
*
* @param id ID, case does not matter
* @param factory factory
*/
public void register(String id, Loader<? extends V> factory) {
factories.put(id.toLowerCase(), factory);
}
/**
* Create a new instance.
*
* @param id type
* @param node configuration node
* @param value short-hand value, possibly null
* @return an object
* @throws DefinitionException thrown on error when parsing or instantiating
*/
V newInstance(String id, ConfigurationNode node, ConfigurationValue value) throws DefinitionException {
Loader<? extends V> factory;
if (value != null) {
node = node.clone();
node.set("_", value.get());
}
if ((factory = factories.get(id)) != null) {
return factory.read(node);
}
throw new DefinitionException("Don't know what '" + id
+ "' is (typo? criteria/action doesn't exist?)");
}
}

View File

@ -0,0 +1,35 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExpressionParser {
private static final char COLOR_CHAR = '\u00A7';
private static final Pattern classicColors = Pattern.compile("&[A-Fa-z0-9klmnor]");
public String format(Context context, String string) {
Matcher m = classicColors.matcher(string);
string = m.replaceAll(COLOR_CHAR + "$1");
return string;
}
}

View File

@ -0,0 +1,40 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* A criteria wrapper that inverts the condition.
*
* @author sk89q
* @param <T> underlying criteria
*/
public class InvertedCriteria<T extends Context> implements Criteria<T> {
private final Criteria<T> criteria;
public InvertedCriteria(Criteria<T> criteria) {
this.criteria = criteria;
}
@Override
public boolean matches(T context) {
return !criteria.matches(context);
}
}

View File

@ -0,0 +1,90 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
/**
* Contains names of standard attachments.
*/
public enum KnownAttachment {
BLOCK_BREAK("block-break"),
BLOCK_PLACE("block-place"),
BLOCK_SPREAD("block-spread"),
BLOCK_PHYSICS("block-physics"),
BLOCK_INTERACT("block-interact"),
BLOCK_FADE("block-fade"),
BLOCK_FORM("block-form"),
PLAYER_SPAWN("player-spawn"),
PLAYER_RESPAWN("player-respawn"),
PLAYER_QUIT("player-quit"),
PLAYER_DEATH("player-death"),
ENTITY_EXPLODE("entity-explode"),
ENTITY_DAMAGE("entity-damage"),
ENTITY_DEATH("entity-death"),
ENTITY_IGNITE("entity-ignite"),
ENTITY_SPAWN("entity-spawn"),
ENTITY_STRIKE("entity-strike"),
ENTITY_INTERACT("entity-interact"),
ITEM_DROP("item-drop"),
ITEM_PICKUP("item-pickup"),
ITEM_USE("item-use"),
WEATHER_PHENOMENON("weather-phenomenon"),
WEATHER_TRANSITION("weather-transition"),
WORLD_LOAD("world-load"),
WORLD_UNLOAD("world-unload"),
WORLD_SAVE("world-save");
private final static Map<String, KnownAttachment> ids = new HashMap<String, KnownAttachment>();
static {
for (KnownAttachment attachment : EnumSet.allOf(KnownAttachment.class)) {
ids.put(attachment.getId().toLowerCase(), attachment);
}
}
private final String id;
KnownAttachment(String id) {
this.id = id;
}
/**
* Get the attachment's string ID.
*
* @return string ID
*/
public String getId() {
return id;
}
/**
* Get an attachment from a given string ID. Not case sensitive.
*
* @param id string ID
* @return attachment name
*/
public static KnownAttachment fromId(String id) {
return ids.get(id.toLowerCase());
}
}

View File

@ -0,0 +1,52 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.EnumMap;
import java.util.Map;
/**
* Holds known attachment rule sets for every {@link KnownAttachment}.
*/
public class KnownAttachmentRules {
private Map<KnownAttachment, RuleSet> ruleSets =
new EnumMap<KnownAttachment, RuleSet>(KnownAttachment.class);
/**
* Build a new instance, with every attachment having an empty {@link RuleSet}
* defined for it.
*/
public KnownAttachmentRules() {
for (KnownAttachment attachment : KnownAttachment.values()) {
ruleSets.put(attachment, new RuleSet());
}
}
/**
* Get a rule set for a given attachment.
*
* @param attachment the attachment
* @return the rule set
*/
public RuleSet get(KnownAttachment attachment) {
return ruleSets.get(attachment);
}
}

View File

@ -0,0 +1,30 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* Attempts to resolve the requested object from other objects. For
* example, a block place event can have multiple 'relevant' blocks, such as
* the target block or the source block. A resolver is used to figure out
* which block is requested, and then the resolver would return the object
* requested by accessing it through a given context.
*/
public interface Resolver {
}

View File

@ -0,0 +1,63 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.HashMap;
import java.util.Map;
public class ResolverManager {
private final Map<Class<? extends Resolver>, Map<String, Resolver>> resolvers
= new HashMap<Class<? extends Resolver>, Map<String, Resolver>>();
private final Map<Resolver, String> reverse = new HashMap<Resolver, String>();
public <T extends Resolver> void register(Class<T> clazz, String id, T resolver) {
Map<String, Resolver> map = resolvers.get(clazz);
if (map == null) {
map = new HashMap<String, Resolver>();
resolvers.put(clazz, map);
}
reverse.put(resolver, id);
map.put(id.toLowerCase(), resolver);
}
public String getId(Object object) {
return reverse.get(object);
}
@SuppressWarnings("unchecked")
public <T extends Resolver> T get(Class<T> clazz, String id) throws DefinitionException {
Map<String, Resolver> map = resolvers.get(clazz);
if (map == null) {
throw new DefinitionException("Don't know how to resolve "
+ clazz.getCanonicalName());
}
Resolver resolver = map.get(id);
if (resolver == null) {
throw new DefinitionException("Don't know how to resolve "
+ clazz.getCanonicalName());
}
return (T) resolver;
}
}

View File

@ -0,0 +1,35 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* A rule that may match a number of events and can be applied in
* a situation. See {@link DefinedRule} for a rule implementation that
* consists of constituent {@link Criteria}s and {@link Action}s.
*
* @author sk89q
* @param <T> implementation-specific context
*/
public interface Rule<T extends Context> {
boolean matches(T context);
void apply(T context);
}

View File

@ -0,0 +1,60 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.List;
/**
* A pair of attachment/event names a rule.
*/
public class RuleEntry {
private final List<String> attachmentNames;
private final Rule<?> rule;
/**
* Construct the rule entry with the list of attachment names and rules.
*
* @param attachmentNames attachment names
* @param rule rules
*/
public RuleEntry(List<String> attachmentNames, Rule<?> rule) {
this.attachmentNames = attachmentNames;
this.rule = rule;
}
/**
* Get the list of attachment names.
*
* @return attachment names
*/
public List<String> getAttachmentNames() {
return attachmentNames;
}
/**
* Get the rule.
*
* @return rule
*/
public Rule<?> getRule() {
return rule;
}
}

View File

@ -0,0 +1,172 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.ConfigurationValue;
import com.sk89q.rebar.config.LoaderBuilderException;
import com.sk89q.rebar.util.LoggerUtils;
/**
* A loader that will load rule definitions for the RuleLists.
*/
public class RuleEntryLoader extends AbstractNodeLoader<RuleEntry> {
public static final String INLINE = "_";
private static Logger logger = LoggerUtils.getLogger(RuleEntryLoader.class, "[WorldGuard] RuleList: ");
private final DefinitionLoader<Criteria<?>> criteriaLoader;
private final DefinitionLoader<Action<?>> actionLoader;
/**
* Construct the loader.
*
* @param ruleListsManager the action lists manager
*/
public RuleEntryLoader(RuleListsManager ruleListsManager) {
criteriaLoader = new DefinitionLoader<Criteria<?>>(ruleListsManager.getCriterion(), true);
actionLoader = new DefinitionLoader<Action<?>>(ruleListsManager.getActions(), false);
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public RuleEntry read(ConfigurationNode node) {
if (node.size() == 0) {
return null;
}
List<String> when = node.getStringList("when", new ArrayList<String>());
// Check to see if the rule has any events defined
if (when.size() == 0) {
logger.warning("A rule has missing 'when' clause:\n" + node.toString());
return null;
}
try {
DefinedRule rule = new DefinedRule();
// Get criterion from the 'if' subnode
for (Criteria criteria : node.listOf("if", criteriaLoader)) {
rule.add(criteria);
}
// Get actions from the 'then' subnode
for (Action action : node.listOf("then", actionLoader)) {
rule.add(action);
}
// A rule needs actions!
if (rule.hasActions()) {
return new RuleEntry(when, rule);
} else {
logger.warning("The following rule has no actions in:\n" + node.toString());
return null;
}
} catch (LoaderBuilderException e) {
logger.warning("A rule had the error '" + e.getMessage() + ", and the rule is:\n" + node.toString());
return null;
}
}
/**
* Inverts an criteria, wrapping it in a {@link InvertedCriteria}.
*
* @param criteria to invert
* @param inverted true to invert (false to not)
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private static <V> V invertCriteria(V object, boolean inverted) {
if (object instanceof Criteria && inverted) {
return (V) new InvertedCriteria((Criteria<?>) object);
}
return object;
}
/**
* Loads specific definitions (criterion or actions) defined.
*
* @param <T> type of definition ({@link Action} or {@link Criteria})
*/
private class DefinitionLoader<T> extends AbstractNodeLoader<T> {
private final DefinitionManager<T> manager;
private final boolean strict;
/**
* Construct the object.
*
* @param manager the definition manager
* @param strict true to throw exceptions on error
*/
public DefinitionLoader(DefinitionManager<T> manager, boolean strict) {
this.manager = manager;
this.strict = strict;
}
@Override
public T read(ConfigurationNode node) {
String id = node.getString("?");
boolean inverted = node.getBoolean("negate", false);
try {
// Check for long hand notation (?: class)
if (id != null) {
return invertCriteria(manager.newInstance(id, node, null), inverted);
}
// Check for short-hand notation (?class: value)
for (String key : node.getKeys(ConfigurationNode.ROOT)) {
if (key.startsWith("?")) {
id = key;
Object value = node.get(key);
return invertCriteria(
manager.newInstance(key.substring(1), node, new ConfigurationValue(value)), inverted);
}
}
// No class defined!
logger.warning("EventListeners: Missing '?' parameter in definition " +
"(to define what kind of criteria/action it is)");
return null;
} catch (DefinitionException e) {
logger.warning("EventListeners: Invalid definition " +
"identified by type '" + id + "': " + e.getMessage());
// Throw an exception in strict mode
if (strict) {
throw new LoaderBuilderException();
}
return null;
}
}
}
}

View File

@ -0,0 +1,65 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.List;
import java.util.logging.Logger;
import com.sk89q.rebar.config.ConfigurationNode;
/**
* RuleList-related utility methods.
*/
public class RuleListUtils {
private RuleListUtils() {
}
/**
* Warn of unknown directives in a rule list block.
*
* @param node node
* @param logger the logger to send to
* @param expected expected keys
*/
public static void warnUnknown(ConfigurationNode node, Logger logger, String ... expected) {
List<String> keys = node.getKeys(ConfigurationNode.ROOT);
for (String key : keys) {
boolean found = false;
if (key.equals("?")) continue;
if (key.equals("negate")) continue;
if (key.equals("_")) continue;
if (key.length() > 0 && key.charAt(0) == '?') continue;
for (String expect : expected) {
if (expect.equals(key)) {
found = true;
break;
}
}
if (!found) {
logger.warning("[WorldGuard] RuleList: Unexpected parameter of '" + key + "' in " + node);
}
}
}
}

View File

@ -0,0 +1,77 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
/**
* Manages action lists and details relevant to them.
*/
public class RuleListsManager {
private final AttachmentManager attachments = new AttachmentManager();
private final DefinitionManager<Criteria<?>> criterion = new DefinitionManager<Criteria<?>>();
private final DefinitionManager<Action<?>> actions = new DefinitionManager<Action<?>>();
private final ResolverManager subjectResolvers = new ResolverManager();
private final ExpressionParser exprParser = new ExpressionParser();
/**
* Get the attachment manager.
*
* @return the attachment manager
*/
public AttachmentManager getAttachments() {
return attachments;
}
/**
* Get the criterion manager.
*
* @return criteron manager
*/
public DefinitionManager<Criteria<?>> getCriterion() {
return criterion;
}
/**
* Get the actions manager.
*
* @return actions manager
*/
public DefinitionManager<Action<?>> getActions() {
return actions;
}
/**
* Get the subject resolvers manager.
*
* @return the subject resolvers manager
*/
public ResolverManager getResolvers() {
return subjectResolvers;
}
/**
* Get the expression parser.
*
* @return the expression parser
*/
public ExpressionParser getParser() {
return exprParser;
}
}

View File

@ -0,0 +1,61 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.LinkedList;
import java.util.List;
public class RuleSet implements Attachment {
private List<Rule<?>> rules = new LinkedList<Rule<?>>();
@Override
public void learn(Rule<?> rule) {
rules.add(rule);
}
@Override
public void forgetRules() {
rules.clear();
}
public boolean hasRules() {
return rules.size() > 0;
}
public List<Rule<?>> getRules() {
return rules;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public boolean process(Context context) {
if (context.isCancelled()) {
return true; // Ignore cancelled events for now
}
for (Rule rule : rules) {
if (rule.matches(context)) {
rule.apply(context);
}
}
return context.isCancelled();
}
}

View File

@ -0,0 +1,131 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.rulelists;
import java.util.ArrayList;
import java.util.List;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.LoaderBuilderException;
import com.sk89q.rebar.config.types.StringLoaderBuilder;
/**
* A loader that will load the built-in rules used. It handles a slightly different
* format that also stores parameter information and other goodies.
*/
public class RuleTemplateEntryLoader extends AbstractNodeLoader<List<RuleEntry>> {
private static final StringLoaderBuilder stringLoader = new StringLoaderBuilder();
private final ConfigurationNode config;
private final RuleEntryLoader entryLoader;
/**
* Construct the loader with the given rule lists manager.
*
* @param manager the manager
* @param config the configuration node to read settings from
*/
public RuleTemplateEntryLoader(RuleListsManager manager, ConfigurationNode config) {
entryLoader = new RuleEntryLoader(manager);
this.config = config;
}
@Override
public List<RuleEntry> read(ConfigurationNode node) throws LoaderBuilderException {
List<RuleEntry> rules = new ArrayList<RuleEntry>();
List<String> settings = node.listOf("setting", stringLoader);
if (settings.size() == 0) {
throw new LoaderBuilderException("No 'setting' value in:\n" + node.toString());
}
String selectedSetting = settings.get(0);
String type = node.getString("type", "boolean");
if (settings.size() > 1) {
boolean migrate = false;
boolean found = false;
Object value = null;
for (String setting : settings) {
if (config.contains(setting)) {
value = config.get(setting);
found = true;
break;
} else {
migrate = true;
}
}
if (found && migrate) {
config.set(settings.get(0), value);
int i = 0;
for (String setting : settings) {
if (i++ != 0) {
config.remove(setting);
}
}
}
}
boolean active = false;
// See if the setting is active
if (type.equals("boolean")) {
boolean negate = node.getBoolean("negate", false);
boolean enabled = config.getBoolean(selectedSetting, negate);
if (negate) {
enabled = !enabled;
}
if (enabled) {
active = true;
}
} else if (type.equals("list")) {
Object val = config.get(selectedSetting);
if (val == null) {
config.set(selectedSetting, new ArrayList<Object>());
} else if (val instanceof List<?> && ((List<?>) val).size() > 0) {
active = true;
}
}
// Load the setting
if (active) {
List<String> paramPaths = node.getStringList("parameters.target", new ArrayList<String>());
if (paramPaths.size() > 0) {
Object val = config.get(selectedSetting);
for (String path : paramPaths) {
node.set(path, val);
}
}
for (RuleEntry rule : node.listOf("rules", entryLoader)) {
rules.add(rule);
}
}
return rules;
}
}

View File

@ -0,0 +1,103 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
import com.sk89q.rulelists.Context;
public class BukkitContext extends Context {
private final Event event;
private String message;
private Entity sourceEntity;
private Entity targetEntity;
private ItemStack item;
private BlockState sourceBlock;
private BlockState targetBlock;
private BlockState replacedTargetBlock;
public BukkitContext(Event event) {
this.event = event;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Entity getSourceEntity() {
return sourceEntity;
}
public void setSourceEntity(Entity sourceEntity) {
this.sourceEntity = sourceEntity;
}
public Entity getTargetEntity() {
return targetEntity;
}
public void setTargetEntity(Entity targetEntity) {
this.targetEntity = targetEntity;
}
public ItemStack getItem() {
return item;
}
public void setItem(ItemStack item) {
this.item = item;
}
public BlockState getSourceBlock() {
return sourceBlock;
}
public void setSourceBlock(BlockState block) {
this.sourceBlock = block;
}
public BlockState getTargetBlock() {
return targetBlock;
}
public void setTargetBlock(BlockState targetBlock) {
this.targetBlock = targetBlock;
}
public BlockState getPlacedBlock() {
return replacedTargetBlock;
}
public void setPlacedBlock(BlockState replacedTargetBlock) {
this.replacedTargetBlock = replacedTargetBlock;
}
public Event getEvent() {
return event;
}
}

View File

@ -225,22 +225,6 @@ public class BukkitUtil {
return str;
}
/**
* Returns whether an entity should be removed for the halt activity mode.
*
* @param entity
* @return true if it's to be removed
*/
public static boolean isIntensiveEntity(Entity entity) {
return entity instanceof Item
|| entity instanceof TNTPrimed
|| entity instanceof ExperienceOrb
|| entity instanceof FallingSand
|| (entity instanceof LivingEntity
&& !(entity instanceof Tameable)
&& !(entity instanceof Player));
}
/**
* Returns whether our running CraftBukkit already supports
* the HangingEvent instead of the PaintingEvent

View File

@ -26,94 +26,70 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import com.sk89q.commandbook.CommandBook;
import com.sk89q.commandbook.GodComponent;
import com.sk89q.util.yaml.YAMLFormat;
import com.sk89q.util.yaml.YAMLProcessor;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.sk89q.rebar.config.ConfigurationException;
import com.sk89q.rebar.config.PairedKeyValueLoaderBuilder;
import com.sk89q.rebar.config.YamlConfigurationFile;
import com.sk89q.rebar.config.YamlStyle;
import com.sk89q.rebar.config.types.LowercaseStringLoaderBuilder;
import com.sk89q.rebar.config.types.StringLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.RuleEntryLoader;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.blacklist.Blacklist;
/**
* Represents the global configuration and also delegates configuration
* for individual worlds.
*
* @author sk89q
* @author Michael
*/
public class ConfigurationManager {
private static final String CONFIG_HEADER = "#\r\n" +
"# WorldGuard's main configuration file\r\n" +
"#\r\n" +
"# This is the global configuration file. Anything placed into here will\r\n" +
"# be applied to all worlds. However, each world has its own configuration\r\n" +
"# file to allow you to replace most settings in here for that world only.\r\n" +
"#\r\n" +
"# About editing this file:\r\n" +
"# - DO NOT USE TABS. You MUST use spaces or Bukkit will complain. If\r\n" +
"# you use an editor like Notepad++ (recommended for Windows users), you\r\n" +
"# must configure it to \"replace tabs with spaces.\" In Notepad++, this can\r\n" +
"# be changed in Settings > Preferences > Language Menu.\r\n" +
"# - Don't get rid of the indents. They are indented so some entries are\r\n" +
"# in categories (like \"enforce-single-session\" is in the \"protection\"\r\n" +
"# category.\r\n" +
"# - If you want to check the format of this file before putting it\r\n" +
"# into WorldGuard, paste it into http://yaml-online-parser.appspot.com/\r\n" +
"# and see if it gives \"ERROR:\".\r\n" +
"# - Lines starting with # are comments and so they are ignored.\r\n" +
"#\r\n";
private static Logger logger = LoggerUtils.getLogger(RuleEntryLoader.class, "[WorldGuard] ");
private static final String DEFAULT_RULELIST_PATH = "rulelist.yml";
private static final String DEFAULT_BLACKLIST_PATH = "worlds/%world%/blacklist.txt";
private static final String DEFAULT_WORLD_CONFIG_PATH = "worlds/%world%/config.yml";
static final YamlStyle YAML_STYLE = new YamlStyle(FlowStyle.BLOCK);
/**
* Reference to the plugin.
*/
private WorldGuardPlugin plugin;
/**
* Holds configurations for different worlds.
*/
private ConcurrentMap<String, WorldConfiguration> worlds;
private YamlConfigurationFile config;
/**
* The global configuration for use when loading worlds
*/
private YAMLProcessor config;
private Map<String, String> ruleLists = new HashMap<String, String>();
private Map<String, String> blacklists = new HashMap<String, String>();
private Map<String, String> worldConfigs = new HashMap<String, String>();
/**
* List of people with god mode.
*/
@Deprecated
private Set<String> hasGodMode = new HashSet<String>();
/**
* List of people who can breathe underwater.
*/
private Set<String> hasAmphibious = new HashSet<String>();
private boolean hasCommandBookGodMode = false;
/* Configuration data start */
public boolean useRegionsScheduler;
public boolean useRegionsCreatureSpawnEvent;
public boolean activityHaltToggle = false;
public boolean autoGodMode;
public boolean usePlayerMove;
public Map<String, String> hostKeys = new HashMap<String, String>();
/**
* Region Storage Configuration method, and config values
*/
public boolean useSqlDatabase = false;
public String sqlDsn;
public String sqlUsername;
public String sqlPassword;
/* Configuration data end */
/**
* Construct the object.
*
* @param plugin The plugin instance
* @param plugin the plugin instance
*/
public ConfigurationManager(WorldGuardPlugin plugin) {
this.plugin = plugin;
@ -123,60 +99,66 @@ public class ConfigurationManager {
/**
* Load the configuration.
*/
@SuppressWarnings("unchecked")
public void load() {
// Create the default configuration file
plugin.createDefaultConfiguration(
new File(plugin.getDataFolder(), "config.yml"), "config.yml");
loadConfig();
config = new YAMLProcessor(new File(plugin.getDataFolder(), "config.yml"), true, YAMLFormat.EXTENDED);
try {
config.load();
} catch (IOException e) {
plugin.getLogger().severe("Error reading configuration for global config: ");
e.printStackTrace();
}
config.removeProperty("suppress-tick-sync-warnings");
useRegionsScheduler = config.getBoolean(
"regions.use-scheduler", true);
useRegionsCreatureSpawnEvent = config.getBoolean(
"regions.use-creature-spawn-event", true);
autoGodMode = config.getBoolean(
"auto-invincible", config.getBoolean("auto-invincible-permission", false));
config.removeProperty("auto-invincible-permission");
usePlayerMove = config.getBoolean(
"use-player-move-event", true);
hostKeys = new HashMap<String, String>();
Object hostKeysRaw = config.getProperty("host-keys");
if (hostKeysRaw == null || !(hostKeysRaw instanceof Map)) {
config.setProperty("host-keys", new HashMap<String, String>());
} else {
for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) hostKeysRaw).entrySet()) {
String key = String.valueOf(entry.getKey());
String value = String.valueOf(entry.getValue());
hostKeys.put(key.toLowerCase(), value);
}
}
useSqlDatabase = config.getBoolean(
"regions.sql.use", false);
// Regions settings
useRegionsScheduler = config.getBoolean("regions.use-scheduler", true);
useRegionsCreatureSpawnEvent = config.getBoolean("regions.use-creature-spawn-event", true);
// Regions SQL settings
useSqlDatabase = config.getBoolean("regions.sql.use", false);
sqlDsn = config.getString("regions.sql.dsn", "jdbc:mysql://localhost/worldguard");
sqlUsername = config.getString("regions.sql.username", "worldguard");
sqlPassword = config.getString("regions.sql.password", "worldguard");
// Other settings
usePlayerMove = config.getBoolean("use-player-move-event", true);
// Load host keys
hostKeys = config.mapOf("host-keys",
PairedKeyValueLoaderBuilder.build(
new LowercaseStringLoaderBuilder(), new StringLoaderBuilder()));
// Load rule list filenames
if (config.contains("rulelists")) {
ruleLists = config.mapOf("rulelists",
PairedKeyValueLoaderBuilder.build(
new LowercaseStringLoaderBuilder(), new StringLoaderBuilder()));
} else {
config.setNode("rulelists").set("__default__", DEFAULT_RULELIST_PATH);
ruleLists = new HashMap<String, String>();
ruleLists.put("__default__", DEFAULT_RULELIST_PATH);
}
// Load blacklist filenames
if (config.contains("blacklists")) {
blacklists = config.mapOf("blacklists",
PairedKeyValueLoaderBuilder.build(
new LowercaseStringLoaderBuilder(), new StringLoaderBuilder()));
} else {
config.setNode("blacklists").set("__default__", DEFAULT_BLACKLIST_PATH);
blacklists = new HashMap<String, String>();
blacklists.put("__default__", DEFAULT_BLACKLIST_PATH);
}
// Load world config filenames
if (config.contains("world-configs")) {
worldConfigs = config.mapOf("world-configs",
PairedKeyValueLoaderBuilder.build(
new LowercaseStringLoaderBuilder(), new StringLoaderBuilder()));
} else {
config.setNode("world-configs").set("__default__", DEFAULT_WORLD_CONFIG_PATH);
worldConfigs = new HashMap<String, String>();
worldConfigs.put("__default__", DEFAULT_WORLD_CONFIG_PATH);
}
// Load configurations for each world
for (World world : plugin.getServer().getWorlds()) {
get(world);
}
config.setHeader(CONFIG_HEADER);
if (!config.save()) {
plugin.getLogger().severe("Error saving configuration!");
}
saveConfig();
}
/**
@ -186,6 +168,41 @@ public class ConfigurationManager {
worlds.clear();
}
/**
* Load the configuration from file.
*/
private void loadConfig() {
config = new YamlConfigurationFile(new File(plugin.getDataFolder(), "config.yml"), YAML_STYLE);
try {
config.load();
} catch (IOException e) {
logger.log(Level.SEVERE, "Error reading config.yml for global config", e);
} catch (ConfigurationException e) {
logger.log(Level.SEVERE, "Error reading config.yml for global config", e);
}
}
/**
* Save the configuration to file.
*/
private void saveConfig() {
config.setHeader(
"# GLOBAL CONFIGURATION FILE\r\n" +
"#\r\n" +
"# Everything in here applies to all worlds. For world-specific settings, edit \r\n" +
"# the files in plugins/WorldGuard/worlds/WORLD_NAME_HERE/config.yml\r\n" +
"#\r\n" +
"# The official format of this file is called YAML. If you've never had to\r\n" +
"# edit one before, you should REALLY read http://wiki.sk89q.com/wiki/Editing_YAML\r\n");
try {
config.save();
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to save configuration", e);
}
}
/**
* Get the configuration for a world.
*
@ -199,7 +216,7 @@ public class ConfigurationManager {
while (config == null) {
if (newConfig == null) {
newConfig = new WorldConfiguration(plugin, worldName, this.config);
newConfig = new WorldConfiguration(plugin, worldName, this, this.config);
}
worlds.putIfAbsent(world.getName(), newConfig);
config = worlds.get(world.getName());
@ -208,12 +225,91 @@ public class ConfigurationManager {
return config;
}
/**
* Get the RuleList file for the given world.
*
* @param worldName world
* @return file (which may or may not exist)
*/
File getRuleListFile(String worldName) {
String path = ruleLists.get(worldName.toLowerCase());
if (path == null) {
path = ruleLists.get("__default__");
}
if (path == null) {
path = DEFAULT_RULELIST_PATH;
}
path = path.replace("%world%", worldName);
File file = new File(plugin.getDataFolder(), path);
if (!file.exists()) {
plugin.createDefaultConfiguration(file, "rulelist.yml");
}
return file;
}
/**
* Get the blacklist file for the given world.
*
* @param worldName world
* @return file (which may or may not exist)
*/
File getBlacklistFile(String worldName) {
String path = blacklists.get(worldName.toLowerCase());
File file;
if (path == null) {
path = blacklists.get("__default__");
}
if (path == null) {
path = DEFAULT_BLACKLIST_PATH;
}
path = path.replace("%world%", worldName);
file = new File(plugin.getDataFolder(), path);
if (!file.exists()) {
plugin.createDefaultConfiguration(file, "blacklist.txt");
}
return file;
}
/**
* Get the world configuration file for the given world.
*
* @param worldName world
* @return file (which may or may not exist)
*/
File getWorldConfigFile(String worldName) {
String path = worldConfigs.get(worldName.toLowerCase());
File file;
if (path == null) {
path = worldConfigs.get("__default__");
}
if (path == null) {
path = DEFAULT_WORLD_CONFIG_PATH;
}
path = path.replace("%world%", worldName);
file = new File(plugin.getDataFolder(), path);
return file;
}
/**
* Forget a player.
*
* @param player The player to forget about
*/
public void forgetPlayer(LocalPlayer player) {
void forgetPlayer(LocalPlayer player) {
for (Map.Entry<String, WorldConfiguration> entry
: worlds.entrySet()) {
@ -235,7 +331,6 @@ public class ConfigurationManager {
*/
@Deprecated
public void enableGodMode(Player player) {
hasGodMode.add(player.getName());
}
@ -293,7 +388,10 @@ public class ConfigurationManager {
return hasAmphibious.contains(player.getName());
}
public void updateCommandBookGodMode() {
/**
* Check and store whether CommandBook is installed.
*/
void updateCommandBookGodMode() {
try {
if (plugin.getServer().getPluginManager().isPluginEnabled("CommandBook")) {
Class.forName("com.sk89q.commandbook.GodComponent");
@ -304,7 +402,12 @@ public class ConfigurationManager {
hasCommandBookGodMode = false;
}
public boolean hasCommandBookGodMode() {
/**
* Return whether CommandBook is available for God mode usage.
*
* @return true if it available
*/
boolean hasCommandBookGodMode() {
return hasCommandBookGodMode;
}
}

View File

@ -60,6 +60,7 @@ public class FlagStateManager implements Runnable {
/**
* Run the task.
*/
@Override
public void run() {
Player[] players = plugin.getServer().getOnlinePlayers();
ConfigurationManager config = plugin.getGlobalStateManager();

View File

@ -0,0 +1,305 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit;
import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.Chunk;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.entity.Animals;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.plugin.PluginManager;
import com.sk89q.rebar.util.LoggerUtils;
/**
* Handles the "stop lag" mode.
*/
public class LagStopMode implements Listener {
private static final Logger logger = LoggerUtils.getLogger(LagStopMode.class,
"[WorldGuard] Lag Stop Mode: ");
private final WorldGuardPlugin plugin;
private boolean enabled = false;
private boolean removeAnimals = true;
LagStopMode(WorldGuardPlugin plugin) {
this.plugin = plugin;
}
/**
* Register this class's events.
*/
void registerEvents() {
PluginManager pm = plugin.getServer().getPluginManager();
pm.registerEvents(this, plugin);
}
/**
* Get whether the lag stop mode is enabled.
*
* @return true if it's enabled
*/
public boolean isEnabled() {
return enabled;
}
/**
* Enable the lag stop mode. This will start the process and emit messages.
*
* @param unloadChunks true to unload chunks
*/
public void enable(boolean unloadChunks) {
if (!enabled) {
Server server = plugin.getServer();
server.broadcastMessage(ChatColor.GRAY
+ "(WorldGuard's 'lag stop' mode has been enabled. Some parts of the game may be 'frozen'. Keep calm and carry on.)");
// Remove entities
server.broadcastMessage(ChatColor.GRAY + "(Please wait... removing entities...)");
for (World world : server.getWorlds()) {
freeUp(world);
}
// Unloading chunks
if (unloadChunks) {
server.broadcastMessage(ChatColor.GRAY + "(Please wait... garbage collecting chunks...)");
for (World world : server.getWorlds()) {
Chunk[] chunks = world.getLoadedChunks();
for (Chunk chunk : chunks) {
chunk.unload(true, true);
}
}
}
server.broadcastMessage(ChatColor.GRAY + "(Completed. Lag stop mode is still enabled.)");
}
this.enabled = true;
}
/**
* Disable the lag stop mode.
*/
public void disable() {
if (enabled) {
Server server = plugin.getServer();
server.broadcastMessage(ChatColor.GRAY
+ "(WorldGuard's 'lag stop' mode is now off. Everything should proceed to start working again.)");
}
this.enabled = false;
}
/**
* Returns whether animals are being removed.
*
* @return true if animals are being removed
*/
public boolean isRemovingAnimals() {
return removeAnimals;
}
/**
* Set whether animals should be removed.
*
* @param removeAnimals true to remove animals
*/
public void setRemoveAnimals(boolean removeAnimals) {
this.removeAnimals = removeAnimals;
}
/**
* Remove items and other things within the chunk.
*
* @param plugin the plugin
* @param chunk the chunk to halt
*/
private void freeUp(Chunk chunk) {
int removed = 0;
for (Entity entity : chunk.getEntities()) {
if (shouldRemove(entity)) {
entity.remove();
removed++;
}
}
if (removed > 50) {
logger.info(removed + " entities (>50) auto-removed from " + chunk.toString());
}
}
/**
* Remove items and other things within the world.
*
* @param plugin the plugin
* @param world the world to halt
*/
private void freeUp(World world) {
int removed = 0;
for (Entity entity : world.getEntities()) {
if (shouldRemove(entity)) {
entity.remove();
removed++;
}
}
if (removed > 50) {
logger.info(removed + " entities (>50) auto-removed from " + world.toString());
}
}
/**
* Returns whether an entity should be removed.
*
* @param entity the entity to check
* @return true if it should be removed
*/
private boolean shouldRemove(Entity entity) {
return entity instanceof Item
|| entity instanceof TNTPrimed
|| entity instanceof ExperienceOrb
|| entity instanceof FallingBlock
|| (entity instanceof LivingEntity
&& !(entity instanceof Tameable)
&& !(entity instanceof Player)
&& (removeAnimals || !(entity instanceof Animals)));
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
World world = player.getWorld();
if (enabled) {
player.sendMessage(ChatColor.GRAY
+ "WorldGuard's 'lag stop' mode has been enabled. Some parts of the game may be 'frozen'.");
freeUp(world);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockFromTo(BlockFromToEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockIgnite(BlockIgniteEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockBurn(BlockBurnEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockPhysics(BlockPhysicsEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockForm(BlockFormEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onLeavesDecay(LeavesDecayEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockSpread(BlockSpreadEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onEntityExplode(EntityExplodeEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onExplosionPrime(ExplosionPrimeEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onCreatureSpawn(CreatureSpawnEvent event) {
if (enabled) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onChunkLoad(ChunkLoadEvent event) {
if (enabled) {
freeUp(event.getChunk());
}
}
}

View File

@ -20,6 +20,7 @@
package com.sk89q.worldguard.bukkit;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import org.bukkit.ChatColor;
@ -27,8 +28,6 @@ import org.bukkit.command.CommandSender;
/**
* Sends all logger messages to a player.
*
* @author sk89q
*/
public class LoggerToChatHandler extends Handler {
/**
@ -64,7 +63,12 @@ public class LoggerToChatHandler extends Handler {
*/
@Override
public void publish(LogRecord record) {
player.sendMessage(ChatColor.GRAY + record.getLevel().getName() + ": "
+ ChatColor.WHITE + record.getMessage());
if (record.getLevel().intValue() >= Level.WARNING.intValue()) {
player.sendMessage(ChatColor.RED + record.getLevel().getName() + ": "
+ ChatColor.YELLOW + record.getMessage());
} else {
player.sendMessage(ChatColor.GRAY + record.getLevel().getName() + ": "
+ ChatColor.WHITE + record.getMessage());
}
}
}

View File

@ -0,0 +1,196 @@
// $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 org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import com.sk89q.worldedit.blocks.BlockID;
/**
* An applicator of the sponge feature.
*/
class SpongeApplicator {
private final int spongeRadius;
private final boolean useRedstone;
private final boolean refillArea;
/**
* Construct a new applicator.
*
* @param spongeRadius the radius of the sponge's effect
* @param useRedstone use Redstone
* @param refillArea refill the area if a sponge is removed
*/
public SpongeApplicator(int spongeRadius, boolean useRedstone, boolean refillArea) {
this.spongeRadius = spongeRadius;
this.useRedstone = useRedstone;
this.refillArea = refillArea;
}
/**
* Returns whether the block at the given position is water.
*
* @param world world
* @param x x
* @param y y
* @param z z
* @return true if it's water
*/
private static boolean isWater(World world, int x, int y, int z) {
int type = world.getBlockTypeIdAt(x, y, z);
return type == BlockID.WATER || type == BlockID.STATIONARY_WATER;
}
/**
* Returns whether the given sponge is an active sponge.
*
* @param block block to check
* @return true if it's active
*/
public boolean isActiveSponge(Block block) {
return block.getType() == Material.SPONGE
&& (!useRedstone || !block.isBlockIndirectlyPowered());
}
/**
* Return true if a given block near an active sponge.
*
* @param blockTo location of the block
* @return true if it's near a sponge (and water should be cancelled)
*/
public boolean isNearSponge(Block blockTo) {
World world = blockTo.getWorld();
int ox = blockTo.getX();
int oy = blockTo.getY();
int oz = blockTo.getZ();
for (int cx = -spongeRadius; cx <= spongeRadius; cx++) {
for (int cy = -spongeRadius; cy <= spongeRadius; cy++) {
for (int cz = -spongeRadius; cz <= spongeRadius; cz++) {
Block sponge = world.getBlockAt(ox + cx, oy + cy, oz + cz);
if (isActiveSponge(sponge)) {
return true;
}
}
}
}
return false;
}
/**
* Remove water due to a sponge from the given position.
*
* @param block the block
*/
public void clearWater(Block block) {
World world = block.getWorld();
int ox = block.getX();
int oy = block.getY();
int oz = block.getZ();
for (int cx = -spongeRadius; cx <= spongeRadius; cx++) {
for (int cy = -spongeRadius; cy <= spongeRadius; cy++) {
for (int cz = -spongeRadius; cz <= spongeRadius; cz++) {
if (isWater(world, ox + cx, oy + cy, oz + cz)) {
world.getBlockAt(ox + cx, oy + cy, oz + cz).setTypeId(0);
}
}
}
}
}
/**
* Add water due to a sponge from the given position.
*
* @param block the block
*/
public void placeWater(Block block) {
if (!refillArea) return;
World world = block.getWorld();
int ox = block.getX();
int oy = block.getY();
int oz = block.getZ();
// The negative x edge
int cx = ox - spongeRadius - 1;
for (int cy = oy - spongeRadius - 1; cy <= oy + spongeRadius + 1; cy++) {
for (int cz = oz - spongeRadius - 1; cz <= oz + spongeRadius + 1; cz++) {
if (isWater(world, cx, cy, cz)) {
world.getBlockAt(cx + 1, cy, cz).setType(Material.STATIONARY_WATER);
}
}
}
// The positive x edge
cx = ox + spongeRadius + 1;
for (int cy = oy - spongeRadius - 1; cy <= oy + spongeRadius + 1; cy++) {
for (int cz = oz - spongeRadius - 1; cz <= oz + spongeRadius + 1; cz++) {
if (isWater(world, cx, cy, cz)) {
world.getBlockAt(cx - 1, cy, cz).setType(Material.STATIONARY_WATER);
}
}
}
// The negative y edge
int cy = oy - spongeRadius - 1;
for (cx = ox - spongeRadius - 1; cx <= ox + spongeRadius + 1; cx++) {
for (int cz = oz - spongeRadius - 1; cz <= oz + spongeRadius + 1; cz++) {
if (isWater(world, cx, cy, cz)) {
world.getBlockAt(cx, cy + 1, cz).setType(Material.STATIONARY_WATER);
}
}
}
// The positive y edge
cy = oy + spongeRadius + 1;
for (cx = ox - spongeRadius - 1; cx <= ox + spongeRadius + 1; cx++) {
for (int cz = oz - spongeRadius - 1; cz <= oz + spongeRadius + 1; cz++) {
if (isWater(world, cx, cy, cz)) {
world.getBlockAt(cx, cy - 1, cz).setType(Material.STATIONARY_WATER);
}
}
}
// The negative z edge
int cz = oz - spongeRadius - 1;
for (cx = ox - spongeRadius - 1; cx <= ox + spongeRadius + 1; cx++) {
for (cy = oy - spongeRadius - 1; cy <= oy + spongeRadius + 1; cy++) {
if (isWater(world, cx, cy, cz)) {
world.getBlockAt(cx, cy, cz + 1).setType(Material.STATIONARY_WATER);
}
}
}
// The positive z edge
cz = oz + spongeRadius + 1;
for (cx = ox - spongeRadius - 1; cx <= ox + spongeRadius + 1; cx++) {
for (cy = oy - spongeRadius - 1; cy <= oy + spongeRadius + 1; cy++) {
if (isWater(world, cx, cy, cz)) {
world.getBlockAt(cx, cy, cz - 1).setType(Material.STATIONARY_WATER);
}
}
}
}
}

View File

@ -1,126 +0,0 @@
// $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 static com.sk89q.worldguard.bukkit.BukkitUtil.isBlockWater;
import static com.sk89q.worldguard.bukkit.BukkitUtil.setBlockToWater;
import org.bukkit.World;
public class SpongeUtil {
/**
* Remove water around a sponge.
*
* @param plugin The plugin instace
* @param world The world the sponge isin
* @param ox The x coordinate of the 'sponge' block
* @param oy The y coordinate of the 'sponge' block
* @param oz The z coordinate of the 'sponge' block
*/
public static void clearSpongeWater(WorldGuardPlugin plugin, World world, int ox, int oy, int oz) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
for (int cx = -wcfg.spongeRadius; cx <= wcfg.spongeRadius; cx++) {
for (int cy = -wcfg.spongeRadius; cy <= wcfg.spongeRadius; cy++) {
for (int cz = -wcfg.spongeRadius; cz <= wcfg.spongeRadius; cz++) {
if (isBlockWater(world, ox + cx, oy + cy, oz + cz)) {
world.getBlockAt(ox + cx, oy + cy, oz + cz).setTypeId(0);
}
}
}
}
}
/**
* Add water around a sponge.
*
* @param plugin The plugin instance
* @param world The world the sponge is located in
* @param ox The x coordinate of the 'sponge' block
* @param oy The y coordinate of the 'sponge' block
* @param oz The z coordinate of the 'sponge' block
*/
public static void addSpongeWater(WorldGuardPlugin plugin, World world, int ox, int oy, int oz) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// The negative x edge
int cx = ox - wcfg.spongeRadius - 1;
for (int cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx + 1, cy, cz);
}
}
}
// The positive x edge
cx = ox + wcfg.spongeRadius + 1;
for (int cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx - 1, cy, cz);
}
}
}
// The negative y edge
int cy = oy - wcfg.spongeRadius - 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy + 1, cz);
}
}
}
// The positive y edge
cy = oy + wcfg.spongeRadius + 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy - 1, cz);
}
}
}
// The negative z edge
int cz = oz - wcfg.spongeRadius - 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy, cz + 1);
}
}
}
// The positive z edge
cz = oz + wcfg.spongeRadius + 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy, cz - 1);
}
}
}
}
}

View File

@ -19,8 +19,27 @@
package com.sk89q.worldguard.bukkit;
import com.sk89q.util.yaml.YAMLFormat;
import com.sk89q.util.yaml.YAMLProcessor;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import com.sk89q.rebar.config.ConfigurationException;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.YamlConfigurationFile;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.KnownAttachmentRules;
import com.sk89q.rulelists.RuleEntry;
import com.sk89q.rulelists.RuleEntryLoader;
import com.sk89q.rulelists.RuleTemplateEntryLoader;
import com.sk89q.worldguard.blacklist.Blacklist;
import com.sk89q.worldguard.blacklist.BlacklistLogger;
import com.sk89q.worldguard.blacklist.loggers.ConsoleLoggerHandler;
@ -28,352 +47,104 @@ import com.sk89q.worldguard.blacklist.loggers.DatabaseLoggerHandler;
import com.sk89q.worldguard.blacklist.loggers.FileLoggerHandler;
import com.sk89q.worldguard.chest.ChestProtection;
import com.sk89q.worldguard.chest.SignChestProtection;
import org.bukkit.block.Block;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
/**
* Holds the configuration for individual worlds.
*
* @author sk89q
* @author Michael
*/
public class WorldConfiguration {
public static final String CONFIG_HEADER = "#\r\n" +
"# WorldGuard's world configuration file\r\n" +
"#\r\n" +
"# This is a world configuration file. Anything placed into here will only\r\n" +
"# affect this world. If you don't put anything in this file, then the\r\n" +
"# settings will be inherited from the main configuration file.\r\n" +
"#\r\n" +
"# If you see {} below, that means that there are NO entries in this file.\r\n" +
"# Remove the {} and add your own entries.\r\n" +
"#\r\n";
private static Logger logger = LoggerUtils.getLogger(WorldConfiguration.class, "[WorldGuard] ");
private WorldGuardPlugin plugin;
private String worldName;
private YAMLProcessor parentConfig;
private YAMLProcessor config;
private File blacklistFile;
private final WorldGuardPlugin plugin;
private final ConfigurationManager configMan;
private final YamlConfigurationFile config;
private final String worldName;
private Blacklist blacklist;
private KnownAttachmentRules ruleList = new KnownAttachmentRules();
private ChestProtection chestProtection = new SignChestProtection();
private SpongeApplicator spongeApplicator = null;
/* Configuration data start */
public boolean opPermissions;
public boolean fireSpreadDisableToggle;
public boolean itemDurability;
public boolean simulateSponge;
public int spongeRadius;
public boolean disableExpDrops;
public boolean pumpkinScuba;
public boolean redstoneSponges;
public boolean noPhysicsGravel;
public boolean noPhysicsSand;
public boolean allowPortalAnywhere;
public Set<Integer> preventWaterDamage;
public boolean blockLighter;
public boolean disableFireSpread;
public Set<Integer> disableFireSpreadBlocks;
public boolean preventLavaFire;
public Set<Integer> allowedLavaSpreadOver;
public boolean blockTNTExplosions;
public boolean blockTNTBlockDamage;
public boolean blockCreeperExplosions;
public boolean blockCreeperBlockDamage;
public boolean blockWitherExplosions;
public boolean blockWitherBlockDamage;
public boolean blockWitherSkullExplosions;
public boolean blockWitherSkullBlockDamage;
public boolean blockEnderDragonBlockDamage;
public boolean blockFireballExplosions;
public boolean blockFireballBlockDamage;
public boolean blockEntityPaintingDestroy;
public boolean blockEntityItemFrameDestroy;
public boolean blockPluginSpawning;
public boolean disableContactDamage;
public boolean disableFallDamage;
public boolean disableLavaDamage;
public boolean disableFireDamage;
public boolean disableLightningDamage;
public boolean disableDrowningDamage;
public boolean disableSuffocationDamage;
public boolean teleportOnSuffocation;
public boolean disableVoidDamage;
public boolean teleportOnVoid;
public boolean disableExplosionDamage;
public boolean disableMobDamage;
public boolean useRegions;
public boolean highFreqFlags;
public int regionWand;
public Set<EntityType> blockCreatureSpawn;
public boolean regionInvinciblityRemovesMobs;
// public boolean useiConomy;
// public boolean buyOnClaim;
// public double buyOnClaimPrice;
public int maxClaimVolume;
public boolean claimOnlyInsideExistingRegions;
public int maxRegionCountPerPlayer;
public boolean antiWolfDumbness;
public boolean signChestProtection;
public boolean disableSignChestProtectionCheck;
public boolean removeInfiniteStacks;
public boolean disableCreatureCropTrampling;
public boolean disablePlayerCropTrampling;
public boolean preventLightningFire;
public Set<Integer> disallowedLightningBlocks;
public boolean disableThunder;
public boolean disableWeather;
public boolean alwaysRaining;
public boolean alwaysThundering;
public boolean disablePigZap;
public boolean disableCreeperPower;
public boolean disableHealthRegain;
public boolean disableMushroomSpread;
public boolean disableIceMelting;
public boolean disableSnowMelting;
public boolean disableSnowFormation;
public boolean disableIceFormation;
public boolean disableLeafDecay;
public boolean disableGrassGrowth;
public boolean disableEndermanGriefing;
public boolean regionInvinciblityRemovesMobs;
public boolean disableDeathMessages;
public boolean disableObsidianGenerators;
private Map<String, Integer> maxRegionCounts;
public boolean fireSpreadDisableToggle;
/* Configuration data end */
/**
* Construct the object.
*
* @param plugin The WorldGuardPlugin instance
* @param worldName The world name that this WorldConfiguration is for.
* @param parentConfig The parent configuration to read defaults from
* @param plugin the plugin instance
* @param worldName name of the world that this object is for
* @param configMan configuration manager
* @param parentConfig parent configuration
*/
public WorldConfiguration(WorldGuardPlugin plugin, String worldName, YAMLProcessor parentConfig) {
File baseFolder = new File(plugin.getDataFolder(), "worlds/" + worldName);
File configFile = new File(baseFolder, "config.yml");
blacklistFile = new File(baseFolder, "blacklist.txt");
public WorldConfiguration(WorldGuardPlugin plugin, String worldName,
ConfigurationManager configMan, ConfigurationNode parentConfig) {
this.plugin = plugin;
this.worldName = worldName;
this.parentConfig = parentConfig;
this.configMan = configMan;
plugin.createDefaultConfiguration(configFile, "config_world.yml");
plugin.createDefaultConfiguration(blacklistFile, "blacklist.txt");
File file = configMan.getWorldConfigFile(worldName);
config = new YamlConfigurationFile(file, ConfigurationManager.YAML_STYLE);
config.setParent(parentConfig);
config = new YAMLProcessor(configFile, true, YAMLFormat.EXTENDED);
loadConfiguration();
plugin.getLogger().info("Loaded configuration for world '" + worldName + "'");
}
private boolean getBoolean(String node, boolean def) {
boolean val = parentConfig.getBoolean(node, def);
if (config.getProperty(node) != null) {
return config.getBoolean(node, def);
} else {
return val;
}
}
private String getString(String node, String def) {
String val = parentConfig.getString(node, def);
if (config.getProperty(node) != null) {
return config.getString(node, def);
} else {
return val;
}
}
private int getInt(String node, int def) {
int val = parentConfig.getInt(node, def);
if (config.getProperty(node) != null) {
return config.getInt(node, def);
} else {
return val;
}
}
@SuppressWarnings("unused")
private double getDouble(String node, double def) {
double val = parentConfig.getDouble(node, def);
if (config.getProperty(node) != null) {
return config.getDouble(node, def);
} else {
return val;
}
}
private List<Integer> getIntList(String node, List<Integer> def) {
List<Integer> res = parentConfig.getIntList(node, def);
if (res == null || res.size() == 0) {
parentConfig.setProperty(node, new ArrayList<Integer>());
}
if (config.getProperty(node) != null) {
res = config.getIntList(node, def);
}
return res;
}
private List<String> getStringList(String node, List<String> def) {
List<String> res = parentConfig.getStringList(node, def);
if (res == null || res.size() == 0) {
parentConfig.setProperty(node, new ArrayList<String>());
}
if (config.getProperty(node) != null) {
res = config.getStringList(node, def);
}
return res;
}
private List<String> getKeys(String node) {
List<String> res = parentConfig.getKeys(node);
if (res == null || res.size() == 0) {
res = config.getKeys(node);
}
if (res == null) {
res = new ArrayList<String>();
}
return res;
}
private Object getProperty(String node) {
Object res = parentConfig.getProperty(node);
if (config.getProperty(node) != null) {
res = config.getProperty(node);
}
return res;
load();
}
/**
* Load the configuration.
*/
private void loadConfiguration() {
try {
config.load();
} catch (IOException e) {
plugin.getLogger().severe("Error reading configuration for world " + worldName + ": ");
e.printStackTrace();
private void load() {
logger.info("Loading configuration for '" + worldName + "'...");
loadConfig();
// Load rule lists
loadBuiltInRules();
loadUserRules();
loadBlacklist();
// Load other rules
opPermissions = config.getBoolean("op-permissions", true);
boolean simulateSponge = config.getBoolean("simulation.sponge.enable", true);
int spongeRadius = Math.max(1, config.getInt("simulation.sponge.radius", 3)) - 1;
boolean redstoneSponges = config.getBoolean("simulation.sponge.redstone", false);
boolean refillArea = config.getBoolean("simulation.sponge.refill-area", false);
if (simulateSponge) {
spongeApplicator = new SpongeApplicator(spongeRadius, redstoneSponges, refillArea);
}
opPermissions = getBoolean("op-permissions", true);
signChestProtection = config.getBoolean("chest-protection.enable", false);
disableSignChestProtectionCheck = config.getBoolean("chest-protection.disable-off-check", false);
itemDurability = getBoolean("protection.item-durability", true);
removeInfiniteStacks = getBoolean("protection.remove-infinite-stacks", false);
disableExpDrops = getBoolean("protection.disable-xp-orb-drops", false);
disableObsidianGenerators = getBoolean("protection.disable-obsidian-generators", false);
useRegions = config.getBoolean("regions.enable", true);
regionInvinciblityRemovesMobs = config.getBoolean("regions.invincibility-removes-mobs", false);
highFreqFlags = config.getBoolean("regions.high-frequency-flags", false);
regionWand = config.getInt("regions.wand", 287);
maxClaimVolume = config.getInt("regions.max-claim-volume", 30000);
claimOnlyInsideExistingRegions = config.getBoolean("regions.claim-only-inside-existing-regions", false);
simulateSponge = getBoolean("simulation.sponge.enable", true);
spongeRadius = Math.max(1, getInt("simulation.sponge.radius", 3)) - 1;
redstoneSponges = getBoolean("simulation.sponge.redstone", false);
pumpkinScuba = getBoolean("default.pumpkin-scuba", false);
disableHealthRegain = getBoolean("default.disable-health-regain", false);
noPhysicsGravel = getBoolean("physics.no-physics-gravel", false);
noPhysicsSand = getBoolean("physics.no-physics-sand", false);
allowPortalAnywhere = getBoolean("physics.allow-portal-anywhere", false);
preventWaterDamage = new HashSet<Integer>(getIntList("physics.disable-water-damage-blocks", null));
blockTNTExplosions = getBoolean("ignition.block-tnt", false);
blockTNTBlockDamage = getBoolean("ignition.block-tnt-block-damage", false);
blockLighter = getBoolean("ignition.block-lighter", false);
preventLavaFire = getBoolean("fire.disable-lava-fire-spread", true);
disableFireSpread = getBoolean("fire.disable-all-fire-spread", false);
disableFireSpreadBlocks = new HashSet<Integer>(getIntList("fire.disable-fire-spread-blocks", null));
allowedLavaSpreadOver = new HashSet<Integer>(getIntList("fire.lava-spread-blocks", null));
blockCreeperExplosions = getBoolean("mobs.block-creeper-explosions", false);
blockCreeperBlockDamage = getBoolean("mobs.block-creeper-block-damage", false);
blockWitherExplosions = getBoolean("mobs.block-wither-explosions", false);
blockWitherBlockDamage = getBoolean("mobs.block-wither-block-damage", false);
blockWitherSkullExplosions = getBoolean("mobs.block-wither-skull-explosions", false);
blockWitherSkullBlockDamage = getBoolean("mobs.block-wither-skull-block-damage", false);
blockEnderDragonBlockDamage = getBoolean("mobs.block-enderdragon-block-damage", false);
blockFireballExplosions = getBoolean("mobs.block-fireball-explosions", false);
blockFireballBlockDamage = getBoolean("mobs.block-fireball-block-damage", false);
antiWolfDumbness = getBoolean("mobs.anti-wolf-dumbness", false);
disableEndermanGriefing = getBoolean("mobs.disable-enderman-griefing", false);
blockEntityPaintingDestroy = getBoolean("mobs.block-painting-destroy", false);
blockEntityItemFrameDestroy = getBoolean("mobs.block-item-frame-destroy", false);
blockPluginSpawning = getBoolean("mobs.block-plugin-spawning", true);
disableFallDamage = getBoolean("player-damage.disable-fall-damage", false);
disableLavaDamage = getBoolean("player-damage.disable-lava-damage", false);
disableFireDamage = getBoolean("player-damage.disable-fire-damage", false);
disableLightningDamage = getBoolean("player-damage.disable-lightning-damage", false);
disableDrowningDamage = getBoolean("player-damage.disable-drowning-damage", false);
disableSuffocationDamage = getBoolean("player-damage.disable-suffocation-damage", false);
disableContactDamage = getBoolean("player-damage.disable-contact-damage", false);
teleportOnSuffocation = getBoolean("player-damage.teleport-on-suffocation", false);
disableVoidDamage = getBoolean("player-damage.disable-void-damage", false);
teleportOnVoid = getBoolean("player-damage.teleport-on-void-falling", false);
disableExplosionDamage = getBoolean("player-damage.disable-explosion-damage", false);
disableMobDamage = getBoolean("player-damage.disable-mob-damage", false);
disableDeathMessages = getBoolean("player-damage.disable-death-messages", false);
signChestProtection = getBoolean("chest-protection.enable", false);
disableSignChestProtectionCheck = getBoolean("chest-protection.disable-off-check", false);
disableCreatureCropTrampling = getBoolean("crops.disable-creature-trampling", false);
disablePlayerCropTrampling = getBoolean("crops.disable-player-trampling", false);
disallowedLightningBlocks = new HashSet<Integer>(getIntList("weather.prevent-lightning-strike-blocks", null));
preventLightningFire = getBoolean("weather.disable-lightning-strike-fire", false);
disableThunder = getBoolean("weather.disable-thunderstorm", false);
disableWeather = getBoolean("weather.disable-weather", false);
disablePigZap = getBoolean("weather.disable-pig-zombification", false);
disableCreeperPower = getBoolean("weather.disable-powered-creepers", false);
alwaysRaining = getBoolean("weather.always-raining", false);
alwaysThundering = getBoolean("weather.always-thundering", false);
disableMushroomSpread = getBoolean("dynamics.disable-mushroom-spread", false);
disableIceMelting = getBoolean("dynamics.disable-ice-melting", false);
disableSnowMelting = getBoolean("dynamics.disable-snow-melting", false);
disableSnowFormation = getBoolean("dynamics.disable-snow-formation", false);
disableIceFormation = getBoolean("dynamics.disable-ice-formation", false);
disableLeafDecay = getBoolean("dynamics.disable-leaf-decay", false);
disableGrassGrowth = getBoolean("dynamics.disable-grass-growth", false);
useRegions = getBoolean("regions.enable", true);
regionInvinciblityRemovesMobs = getBoolean("regions.invincibility-removes-mobs", false);
highFreqFlags = getBoolean("regions.high-frequency-flags", false);
regionWand = getInt("regions.wand", 334);
maxClaimVolume = getInt("regions.max-claim-volume", 30000);
claimOnlyInsideExistingRegions = getBoolean("regions.claim-only-inside-existing-regions", false);
maxRegionCountPerPlayer = getInt("regions.max-region-count-per-player.default", 7);
maxRegionCountPerPlayer = config.getInt("regions.max-region-count-per-player.default", 7);
maxRegionCounts = new HashMap<String, Integer>();
maxRegionCounts.put(null, maxRegionCountPerPlayer);
for (String key : getKeys("regions.max-region-count-per-player")) {
for (String key : config.getKeys("regions.max-region-count-per-player")) {
if (!key.equalsIgnoreCase("default")) {
Object val = getProperty("regions.max-region-count-per-player." + key);
Object val = config.get("regions.max-region-count-per-player." + key);
if (val != null && val instanceof Number) {
maxRegionCounts.put(key, ((Number) val).intValue());
}
@ -384,111 +155,149 @@ public class WorldConfiguration {
// buyOnClaim = getBoolean("iconomy.buy-on-claim", false);
// buyOnClaimPrice = getDouble("iconomy.buy-on-claim-price", 1.0);
blockCreatureSpawn = new HashSet<EntityType>();
for (String creatureName : getStringList("mobs.block-creature-spawn", null)) {
EntityType creature = EntityType.fromName(creatureName);
saveConfig();
}
if (creature == null) {
plugin.getLogger().warning("Unknown mob type '" + creatureName + "'");
} else if (!creature.isAlive()) {
plugin.getLogger().warning("Entity type '" + creatureName + "' is not a creature");
} else {
blockCreatureSpawn.add(creature);
}
}
boolean useBlacklistAsWhitelist = getBoolean("blacklist.use-as-whitelist", false);
// Console log configuration
boolean logConsole = getBoolean("blacklist.logging.console.enable", true);
// Database log configuration
boolean logDatabase = getBoolean("blacklist.logging.database.enable", false);
String dsn = getString("blacklist.logging.database.dsn", "jdbc:mysql://localhost:3306/minecraft");
String user = getString("blacklist.logging.database.user", "root");
String pass = getString("blacklist.logging.database.pass", "");
String table = getString("blacklist.logging.database.table", "blacklist_events");
// File log configuration
boolean logFile = getBoolean("blacklist.logging.file.enable", false);
String logFilePattern = getString("blacklist.logging.file.path", "worldguard/logs/%Y-%m-%d.log");
int logFileCacheSize = Math.max(1, getInt("blacklist.logging.file.open-files", 10));
// Load the blacklist
/**
* Load the configuration from file.
*/
private void loadConfig() {
try {
config.load();
} catch (IOException e) {
logger.log(Level.SEVERE, "Error reading configuration for world " + worldName, e);
} catch (ConfigurationException e) {
logger.log(Level.SEVERE, "Error reading configuration for world " + worldName, e);
}
}
/**
* Save the configuration to file.
*/
private void saveConfig() {
config.setHeader(
"# CONFIGURATION FILE FOR ONLY THIS WORLD\r\n" +
"#\r\n" +
"# Everything in here applies to ONLY this world. For global settings, edit \r\n" +
"# the file in plugins/WorldGuard/config.yml\r\n" +
"#\r\n" +
"# How do you use this file? Copy potions of the global configuration file into this file.\r\n" +
"#\r\n" +
"# EXAMPLE (remove the # in front):\r\n" +
"#physics:\r\n" +
"# block-tnt-damage: false");
try {
config.save();
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to save configuration", e);
}
}
/**
* Load the built-in rules.
*/
private void loadBuiltInRules() {
try {
RuleTemplateEntryLoader loader = new RuleTemplateEntryLoader(
plugin.getRulesListManager(), config);
for (List<RuleEntry> entries : plugin.getBuiltInRules().listOf("", loader)) {
for (RuleEntry entry : entries) {
learnRule(entry);
}
}
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to load the built-in rules", e);
} catch (ConfigurationException e) {
logger.log(Level.SEVERE, "Failed to load the built-in rules", e);
}
}
/**
* Load the user rules.
*/
private void loadUserRules() {
File rulesFile = configMan.getRuleListFile(worldName);
RuleEntryLoader entryLoader = new RuleEntryLoader(plugin.getRulesListManager());
YamlConfigurationFile rulesConfig = new YamlConfigurationFile(rulesFile,
ConfigurationManager.YAML_STYLE, false);
try {
rulesConfig.load();
for (RuleEntry entry : rulesConfig.listOf(ConfigurationNode.ROOT, entryLoader)) {
learnRule(entry);
}
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to load " + rulesFile.getAbsolutePath(), e);
} catch (ConfigurationException e) {
logger.log(Level.SEVERE, "Failed to load " + rulesFile.getAbsolutePath(), e);
}
}
/**
* Load the blacklist.
*/
private void loadBlacklist() {
try {
// If there was an existing blacklist, close loggers
if (blacklist != null) {
blacklist.getLogger().close();
}
// First load the blacklist data from worldguard-blacklist.txt
Blacklist blist = new BukkitBlacklist(useBlacklistAsWhitelist, plugin);
blist.load(blacklistFile);
File blacklistFile = configMan.getBlacklistFile(worldName);
// If the blacklist is empty, then set the field to null
// and save some resources
if (blist.isEmpty()) {
// Load blacklist settings
boolean useBlacklistAsWhitelist = config.getBoolean("blacklist.use-as-whitelist", false);
boolean logConsole = config.getBoolean("blacklist.logging.console.enable", true);
boolean logDatabase = config.getBoolean("blacklist.logging.database.enable", false);
String dsn = config.getString("blacklist.logging.database.dsn", "jdbc:mysql://localhost:3306/minecraft");
String user = config.getString("blacklist.logging.database.user", "root");
String pass = config.getString("blacklist.logging.database.pass", "");
String table = config.getString("blacklist.logging.database.table", "blacklist_events");
boolean logFile = config.getBoolean("blacklist.logging.file.enable", false);
String logFilePattern = config.getString("blacklist.logging.file.path", "worldguard/logs/%Y-%m-%d.log");
int logFileCacheSize = Math.max(1, config.getInt("blacklist.logging.file.open-files", 10));
Blacklist newBlacklist = new BukkitBlacklist(useBlacklistAsWhitelist, plugin);
newBlacklist.load(blacklistFile);
// If the blacklist is empty, then set the field to null and save some resources
if (newBlacklist.isEmpty()) {
this.blacklist = null;
} else {
this.blacklist = blist;
plugin.getLogger().log(Level.INFO, "Blacklist loaded.");
this.blacklist = newBlacklist;
logger.log(Level.INFO, "Blacklist loaded.");
BlacklistLogger blacklistLogger = blist.getLogger();
BlacklistLogger blacklistLogger = newBlacklist.getLogger();
if (logDatabase) {
blacklistLogger.addHandler(new DatabaseLoggerHandler(dsn, user, pass, table, worldName, plugin.getLogger()));
}
if (logDatabase)
blacklistLogger.addHandler(new DatabaseLoggerHandler(dsn, user,
pass, table, worldName, logger));
if (logConsole) {
blacklistLogger.addHandler(new ConsoleLoggerHandler(worldName, plugin.getLogger()));
}
if (logConsole)
blacklistLogger.addHandler(new ConsoleLoggerHandler(worldName,
logger));
if (logFile) {
FileLoggerHandler handler =
new FileLoggerHandler(logFilePattern, logFileCacheSize, worldName, plugin.getLogger());
FileLoggerHandler handler = new FileLoggerHandler(logFilePattern,
logFileCacheSize, worldName, logger);
blacklistLogger.addHandler(handler);
}
}
} catch (FileNotFoundException e) {
plugin.getLogger().log(Level.WARNING, "WorldGuard blacklist does not exist.");
logger.log(Level.WARNING, "WorldGuard blacklist does not exist", e);
} catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "Could not load WorldGuard blacklist: "
+ e.getMessage());
logger.log(Level.WARNING, "Could not load blacklist", e);
}
// Print an overview of settings
if (getBoolean("summary-on-start", true)) {
plugin.getLogger().log(Level.INFO, blockTNTExplosions
? "(" + worldName + ") TNT ignition is blocked."
: "(" + worldName + ") TNT ignition is PERMITTED.");
plugin.getLogger().log(Level.INFO, blockLighter
? "(" + worldName + ") Lighters are blocked."
: "(" + worldName + ") Lighters are PERMITTED.");
plugin.getLogger().log(Level.INFO, preventLavaFire
? "(" + worldName + ") Lava fire is blocked."
: "(" + worldName + ") Lava fire is PERMITTED.");
if (disableFireSpread) {
plugin.getLogger().log(Level.INFO, "(" + worldName + ") All fire spread is disabled.");
} else {
if (disableFireSpreadBlocks.size() > 0) {
plugin.getLogger().log(Level.INFO, "(" + worldName
+ ") Fire spread is limited to "
+ disableFireSpreadBlocks.size() + " block types.");
} else {
plugin.getLogger().log(Level.INFO, "(" + worldName
+ ") Fire spread is UNRESTRICTED.");
}
}
}
config.setHeader(CONFIG_HEADER);
config.save();
}
public Blacklist getBlacklist() {
return this.blacklist;
return blacklist;
}
SpongeApplicator getSpongeApplicator() {
return spongeApplicator;
}
public String getWorldName() {
@ -550,4 +359,24 @@ public class WorldConfiguration {
}
return max;
}
public KnownAttachmentRules getRuleList() {
return ruleList;
}
/**
* Register a rule with this rule list.
*
* @param entry entry
*/
public void learnRule(RuleEntry entry) {
for (String name : entry.getAttachmentNames()) {
KnownAttachment attachment = KnownAttachment.fromId(name);
if (attachment != null) {
ruleList.get(attachment).learn(entry.getRule());
} else {
logger.warning("Don't know what the RuleList event '" + name + "' is");
}
}
}
}

View File

@ -16,14 +16,17 @@
* 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 static com.sk89q.worldguard.bukkit.BukkitUtil.toVector;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -35,19 +38,18 @@ import org.bukkit.event.block.BlockFadeEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockIgniteEvent.IgniteCause;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.block.BlockIgniteEvent.IgniteCause;
import org.bukkit.inventory.ItemStack;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.worldedit.blocks.ItemType;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.blacklist.events.BlockBreakBlacklistEvent;
@ -59,86 +61,58 @@ import com.sk89q.worldguard.protection.managers.RegionManager;
/**
* The listener for block events.
*
* @author sk89q
*/
public class WorldGuardBlockListener implements Listener {
private WorldGuardPlugin plugin;
/**
* Construct the object.
*
* @param plugin The plugin instance
*/
public WorldGuardBlockListener(WorldGuardPlugin plugin) {
this.plugin = plugin;
}
/**
* Register events.
*/
public void registerEvents() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* Get the world configuration given a world.
*
* @param world The world to get the configuration for.
* @return The configuration for {@code world}
*/
protected WorldConfiguration getWorldConfig(World world) {
return plugin.getGlobalStateManager().get(world);
}
/**
* Get the world configuration given a player.
*
* @param player The player to get the wold from
* @return The {@link WorldConfiguration} for the player's world
*/
protected WorldConfiguration getWorldConfig(Player player) {
return getWorldConfig(player.getWorld());
}
/*
* Called when a block is damaged.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockDamage(BlockDamageEvent event) {
Player player = event.getPlayer();
Block blockDamaged = event.getBlock();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
// Cake are damaged and not broken when they are eaten, so we must
// handle them a bit separately
if (blockDamaged.getTypeId() == BlockID.CAKE_BLOCK) {
// Regions
if (!plugin.getGlobalRegionManager().canBuild(player, blockDamaged)) {
player.sendMessage(ChatColor.DARK_RED + "You're not invited to this tea party!");
event.setCancelled(true);
return;
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_INTERACT);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
}
/*
* Called when a block is broken.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
WorldConfiguration wcfg = getWorldConfig(player);
Block block = event.getBlock();
if (!wcfg.itemDurability) {
ItemStack held = player.getItemInHand();
if (held.getTypeId() > 0
&& !(ItemType.usesDamageValue(held.getTypeId())
|| BlockType.usesData(held.getTypeId()))) {
held.setDurability((short) -1);
player.setItemInHand(held);
}
}
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
// Regions
if (!plugin.getGlobalRegionManager().canBuild(player, event.getBlock())
|| !plugin.getGlobalRegionManager().canConstruct(player, event.getBlock())) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
@ -146,6 +120,7 @@ public class WorldGuardBlockListener implements Listener {
return;
}
// Blacklist
if (wcfg.getBlacklist() != null) {
if (!wcfg.getBlacklist().check(
new BlockBreakBlacklistEvent(plugin.wrapPlayer(player),
@ -164,85 +139,46 @@ public class WorldGuardBlockListener implements Listener {
}
}
// Chest protection
if (wcfg.isChestProtected(event.getBlock(), player)) {
player.sendMessage(ChatColor.DARK_RED + "The chest is protected.");
event.setCancelled(true);
return;
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_BREAK);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
/* --- No short-circuit returns below this line --- */
// Sponges
SpongeApplicator spongeAppl = wcfg.getSpongeApplicator();
if (spongeAppl != null && block.getType() == Material.SPONGE) {
if (spongeAppl.isActiveSponge(block)) {
spongeAppl.placeWater(block);
}
}
}
/*
* Called when fluids flow.
*/
@EventHandler(ignoreCancelled = true)
public void onBlockFromTo(BlockFromToEvent event) {
World world = event.getBlock().getWorld();
Block blockFrom = event.getBlock();
Block blockTo = event.getToBlock();
boolean isWater = blockFrom.getTypeId() == 8 || blockFrom.getTypeId() == 9;
boolean isLava = blockFrom.getTypeId() == 10 || blockFrom.getTypeId() == 11;
boolean isAir = blockFrom.getTypeId() == 0;
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
if (cfg.activityHaltToggle) {
event.setCancelled(true);
return;
}
if (wcfg.simulateSponge && isWater) {
int ox = blockTo.getX();
int oy = blockTo.getY();
int oz = blockTo.getZ();
for (int cx = -wcfg.spongeRadius; cx <= wcfg.spongeRadius; cx++) {
for (int cy = -wcfg.spongeRadius; cy <= wcfg.spongeRadius; cy++) {
for (int cz = -wcfg.spongeRadius; cz <= wcfg.spongeRadius; cz++) {
Block sponge = world.getBlockAt(ox + cx, oy + cy, oz + cz);
if (sponge.getTypeId() == 19
&& (!wcfg.redstoneSponges || !sponge.isBlockIndirectlyPowered())) {
event.setCancelled(true);
return;
}
}
}
}
}
/*if (plugin.classicWater && isWater) {
int blockBelow = blockFrom.getRelative(0, -1, 0).getTypeId();
if (blockBelow != 0 && blockBelow != 8 && blockBelow != 9) {
blockFrom.setTypeId(9);
if (blockTo.getTypeId() == 0) {
blockTo.setTypeId(9);
}
return;
}
}*/
// Check the fluid block (from) whether it is air.
// If so and the target block is protected, cancel the event
if (wcfg.preventWaterDamage.size() > 0) {
int targetId = blockTo.getTypeId();
if ((isAir || isWater) &&
wcfg.preventWaterDamage.contains(targetId)) {
event.setCancelled(true);
return;
}
}
if (wcfg.allowedLavaSpreadOver.size() > 0 && isLava) {
int targetId = blockTo.getRelative(0, -1, 0).getTypeId();
if (!wcfg.allowedLavaSpreadOver.contains(targetId)) {
event.setCancelled(true);
return;
}
}
// Regions
if (wcfg.highFreqFlags && isWater
&& !plugin.getGlobalRegionManager().allows(DefaultFlag.WATER_FLOW,
blockFrom.getLocation())) {
@ -257,73 +193,43 @@ public class WorldGuardBlockListener implements Listener {
return;
}
if (wcfg.disableObsidianGenerators && (isAir || isLava)
&& blockTo.getTypeId() == 55) {
blockTo.setTypeId(0);
return;
}
}
/*
* Called when a block gets ignited.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockIgnite(BlockIgniteEvent event) {
IgniteCause cause = event.getCause();
Block block = event.getBlock();
World world = block.getWorld();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (cfg.activityHaltToggle) {
event.setCancelled(true);
return;
}
boolean isFireSpread = cause == IgniteCause.SPREAD;
if (wcfg.preventLightningFire && cause == IgniteCause.LIGHTNING) {
event.setCancelled(true);
return;
}
if (wcfg.preventLavaFire && cause == IgniteCause.LAVA) {
event.setCancelled(true);
return;
}
if (wcfg.disableFireSpread && isFireSpread) {
event.setCancelled(true);
return;
}
if (wcfg.blockLighter && (cause == IgniteCause.FLINT_AND_STEEL || cause == IgniteCause.FIREBALL)
&& event.getPlayer() != null
&& !plugin.hasPermission(event.getPlayer(), "worldguard.override.lighter")) {
event.setCancelled(true);
return;
}
if (wcfg.fireSpreadDisableToggle && isFireSpread) {
event.setCancelled(true);
return;
}
if (wcfg.disableFireSpreadBlocks.size() > 0 && isFireSpread) {
int x = block.getX();
int y = block.getY();
int z = block.getZ();
if (wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y - 1, z))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x + 1, y, z))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x - 1, y, z))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y, z - 1))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y, z + 1))) {
// Sponges
SpongeApplicator spongeAppl = wcfg.getSpongeApplicator();
if (spongeAppl != null && isWater) {
if (spongeAppl.isNearSponge(blockTo)) {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_SPREAD);
BukkitContext context = new BukkitContext(event);
context.setSourceBlock(event.getBlock().getState());
context.setTargetBlock(event.getToBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockIgnite(BlockIgniteEvent event) {
IgniteCause cause = event.getCause();
Block block = event.getBlock();
World world = block.getWorld();
boolean isFireSpread = cause == IgniteCause.SPREAD;
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// Fire stop toggle
if (wcfg.fireSpreadDisableToggle && isFireSpread) {
event.setCancelled(true);
return;
}
// Regions
if (wcfg.useRegions) {
Vector pt = toVector(block);
Player player = event.getPlayer();
@ -363,26 +269,79 @@ public class WorldGuardBlockListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules;
BukkitContext context;
BlockState placedState;
switch (event.getCause()) {
case FLINT_AND_STEEL:
// Consider flint and steel as an item use
rules = wcfg.getRuleList().get(KnownAttachment.ITEM_USE);
context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
context.setTargetBlock(event.getBlock().getState());
context.setItem(event.getPlayer().getItemInHand()); // Should be flint and steel
// Make a virtual new state
placedState = event.getBlock().getState();
placedState.setType(Material.FIRE);
context.setPlacedBlock(placedState);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
break;
case LAVA:
case SPREAD:
// Consider everything else as a block spread
rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_SPREAD);
context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
// Make a virtual source state
BlockState sourceState = event.getBlock().getState();
sourceState.setType(event.getCause() == IgniteCause.LAVA ? Material.LAVA : Material.FIRE);
context.setSourceBlock(sourceState);
// Make a virtual new state
placedState = event.getBlock().getState();
placedState.setType(Material.FIRE);
context.setPlacedBlock(placedState);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
break;
case FIREBALL:
case LIGHTNING:
// Consider everything else as a block spread
rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_PLACE);
context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
// Make a virtual new state
placedState = event.getBlock().getState();
placedState.setType(Material.FIRE);
context.setPlacedBlock(placedState);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
break;
}
}
/*
* Called when a block is destroyed from burning.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockBurn(BlockBurnEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
if (cfg.activityHaltToggle) {
event.setCancelled(true);
return;
}
if (wcfg.disableFireSpread) {
event.setCancelled(true);
return;
}
// Fire stop toggle
if (wcfg.fireSpreadDisableToggle) {
Block block = event.getBlock();
event.setCancelled(true);
@ -390,21 +349,13 @@ public class WorldGuardBlockListener implements Listener {
return;
}
if (wcfg.disableFireSpreadBlocks.size() > 0) {
Block block = event.getBlock();
if (wcfg.disableFireSpreadBlocks.contains(block.getTypeId())) {
event.setCancelled(true);
checkAndDestroyAround(block.getWorld(), block.getX(), block.getY(), block.getZ(), BlockID.FIRE);
return;
}
}
// Chest protection
if (wcfg.isChestProtected(event.getBlock())) {
event.setCancelled(true);
return;
}
// Regions
if (wcfg.useRegions) {
Block block = event.getBlock();
int x = block.getX();
@ -419,7 +370,18 @@ public class WorldGuardBlockListener implements Listener {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_BREAK);
BukkitContext context = new BukkitContext(event);
BlockState virtualFireState = event.getBlock().getState();
virtualFireState.setType(Material.FIRE);
context.setSourceBlock(virtualFireState);
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@ -438,40 +400,35 @@ public class WorldGuardBlockListener implements Listener {
}
}
/*
* Called when block physics occurs.
*/
@EventHandler(ignoreCancelled = true)
public void onBlockPhysics(BlockPhysicsEvent event) {
Block block = event.getBlock();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
if (cfg.activityHaltToggle) {
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_PHYSICS);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
int id = event.getChangedTypeId();
/* --- No short-circuit returns below this line --- */
if (id == 13 && wcfg.noPhysicsGravel) {
event.setCancelled(true);
return;
}
if (id == 12 && wcfg.noPhysicsSand) {
event.setCancelled(true);
return;
}
if (id == 90 && wcfg.allowPortalAnywhere) {
event.setCancelled(true);
return;
// Sponges
SpongeApplicator spongeAppl = wcfg.getSpongeApplicator();
if (spongeAppl != null && block.getType() == Material.SPONGE) {
if (spongeAppl.isActiveSponge(block)) {
spongeAppl.placeWater(block);
} else {
spongeAppl.clearWater(block);
}
}
}
/*
* Called when a player places a block.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) {
Block blockPlaced = event.getBlock();
@ -481,6 +438,7 @@ public class WorldGuardBlockListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// Regions
if (wcfg.useRegions) {
final Location location = blockPlaced.getLocation();
if (!plugin.getGlobalRegionManager().canBuild(player, location)
@ -491,6 +449,7 @@ public class WorldGuardBlockListener implements Listener {
}
}
// Blacklist
if (wcfg.getBlacklist() != null) {
if (!wcfg.getBlacklist().check(
new BlockPlaceBlacklistEvent(plugin.wrapPlayer(player), toVector(blockPlaced),
@ -500,6 +459,7 @@ public class WorldGuardBlockListener implements Listener {
}
}
// Chest protection
if (wcfg.signChestProtection && wcfg.getChestProtection().isChest(blockPlaced.getTypeId())) {
if (wcfg.isAdjacentChestProtected(event.getBlock(), player)) {
player.sendMessage(ChatColor.DARK_RED + "This spot is for a chest that you don't have permission for.");
@ -508,62 +468,31 @@ public class WorldGuardBlockListener implements Listener {
}
}
if (wcfg.simulateSponge && blockPlaced.getTypeId() == 19) {
if (wcfg.redstoneSponges && blockPlaced.isBlockIndirectlyPowered()) {
return;
}
int ox = blockPlaced.getX();
int oy = blockPlaced.getY();
int oz = blockPlaced.getZ();
SpongeUtil.clearSpongeWater(plugin, world, ox, oy, oz);
// Sponges
SpongeApplicator spongeAppl = wcfg.getSpongeApplicator();
if (spongeAppl != null && spongeAppl.isActiveSponge(blockPlaced)) {
spongeAppl.clearWater(blockPlaced);
}
}
/*
* Called when redstone changes.
*/
@EventHandler(priority = EventPriority.HIGH)
public void onBlockRedstoneChange(BlockRedstoneEvent event) {
Block blockTo = event.getBlock();
World world = blockTo.getWorld();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (wcfg.simulateSponge && wcfg.redstoneSponges) {
int ox = blockTo.getX();
int oy = blockTo.getY();
int oz = blockTo.getZ();
for (int cx = -1; cx <= 1; cx++) {
for (int cy = -1; cy <= 1; cy++) {
for (int cz = -1; cz <= 1; cz++) {
Block sponge = world.getBlockAt(ox + cx, oy + cy, oz + cz);
if (sponge.getTypeId() == 19
&& sponge.isBlockIndirectlyPowered()) {
SpongeUtil.clearSpongeWater(plugin, world, ox + cx, oy + cy, oz + cz);
} else if (sponge.getTypeId() == 19
&& !sponge.isBlockIndirectlyPowered()) {
SpongeUtil.addSpongeWater(plugin, world, ox + cx, oy + cy, oz + cz);
}
}
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_PLACE);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
context.setPlacedBlock(event.getBlockReplacedState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
/*
* Called when a sign is changed.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onSignChange(SignChangeEvent event) {
Player player = event.getPlayer();
WorldConfiguration wcfg = getWorldConfig(player);
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(player.getWorld());
// Chest protection
if (wcfg.signChestProtection) {
if (event.getLine(0).equalsIgnoreCase("[Lock]")) {
if (wcfg.isChestProtectedPlacement(event.getBlock(), player)) {
@ -623,6 +552,15 @@ public class WorldGuardBlockListener implements Listener {
event.setCancelled(true);
return;
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_INTERACT);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -630,44 +568,34 @@ public class WorldGuardBlockListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
if (cfg.activityHaltToggle) {
event.setCancelled(true);
return;
}
if (wcfg.disableLeafDecay) {
event.setCancelled(true);
return;
}
// Regions
if (wcfg.useRegions) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.LEAF_DECAY,
event.getBlock().getLocation())) {
event.setCancelled(true);
return;
}
}
}
/*
* Called when a block is formed based on world conditions.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockForm(BlockFormEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
if (cfg.activityHaltToggle) {
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_FADE);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockForm(BlockFormEvent event) {
int type = event.getNewState().getTypeId();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
// Regions
if (type == BlockID.ICE) {
if (wcfg.disableIceFormation) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.ICE_FORM, event.getBlock().getLocation())) {
event.setCancelled(true);
@ -676,38 +604,33 @@ public class WorldGuardBlockListener implements Listener {
}
if (type == BlockID.SNOW) {
if (wcfg.disableSnowFormation) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.SNOW_FALL, event.getBlock().getLocation())) {
event.setCancelled(true);
return;
}
}
}
/*
* Called when a block spreads based on world conditions.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockSpread(BlockSpreadEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
if (cfg.activityHaltToggle) {
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_FORM);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
context.setPlacedBlock(event.getNewState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockSpread(BlockSpreadEvent event) {
int fromType = event.getSource().getTypeId();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
// Regions
if (fromType == BlockID.RED_MUSHROOM || fromType == BlockID.BROWN_MUSHROOM) {
if (wcfg.disableMushroomSpread) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.MUSHROOMS, event.getBlock().getLocation())) {
event.setCancelled(true);
@ -716,34 +639,34 @@ public class WorldGuardBlockListener implements Listener {
}
if (fromType == BlockID.GRASS) {
if (wcfg.disableGrassGrowth) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.GRASS_SPREAD, event.getBlock().getLocation())) {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_SPREAD);
BukkitContext context = new BukkitContext(event);
context.setSourceBlock(event.getSource().getState());
context.setTargetBlock(event.getBlock().getState());
context.setPlacedBlock(event.getNewState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
/*
* Called when a block fades.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockFade(BlockFadeEvent event) {
int type = event.getBlock().getTypeId();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
int type = event.getBlock().getTypeId();
// regions
if (type == BlockID.ICE) {
if (wcfg.disableIceMelting) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.ICE_MELT, event.getBlock().getLocation())) {
event.setCancelled(true);
@ -752,31 +675,36 @@ public class WorldGuardBlockListener implements Listener {
}
if (type == BlockID.SNOW) {
if (wcfg.disableSnowMelting) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.SNOW_MELT, event.getBlock().getLocation())) {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_FADE);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(event.getBlock().getState());
context.setPlacedBlock(event.getNewState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
/*
* Called when a piston extends
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockPistonExtend(BlockPistonExtendEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
// Regions
if (wcfg.useRegions) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.PISTONS, event.getBlock().getLocation())) {
event.setCancelled(true);
return;
}
for (Block block : event.getBlocks()) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.PISTONS, block.getLocation())) {
event.setCancelled(true);
@ -786,14 +714,12 @@ public class WorldGuardBlockListener implements Listener {
}
}
/*
* Called when a piston retracts
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockPistonRetract(BlockPistonRetractEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getBlock().getWorld());
// Regions
if (wcfg.useRegions && event.isSticky()) {
if (!(plugin.getGlobalRegionManager().allows(DefaultFlag.PISTONS, event.getRetractLocation()))
|| !(plugin.getGlobalRegionManager().allows(DefaultFlag.PISTONS, event.getBlock().getLocation()))) {

View File

@ -20,6 +20,7 @@ package com.sk89q.worldguard.bukkit;
import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector;
import java.util.Iterator;
import java.util.Set;
import org.bukkit.ChatColor;
@ -27,7 +28,7 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Creature;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.EnderPearl;
@ -40,7 +41,6 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.Wolf;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -51,20 +51,20 @@ import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageByBlockEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityInteractEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.PigZapEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.inventory.ItemStack;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
@ -74,117 +74,144 @@ import com.sk89q.worldguard.protection.flags.DefaultFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
/**
* Listener for entity related events.
*
* @author sk89q
* The listener for entity events.
*/
public class WorldGuardEntityListener implements Listener {
private WorldGuardPlugin plugin;
private EntityType fireballType;
private EntityType witherType;
private EntityType witherSkullType;
/**
* Construct the object;
*
* @param plugin The plugin instance
*/
public WorldGuardEntityListener(WorldGuardPlugin plugin) {
this.plugin = plugin;
fireballType = BukkitUtil.tryEnum(EntityType.class, "LARGE_FIREBALL", "FIREBALL");
witherType = BukkitUtil.tryEnum(EntityType.class, "WITHER");
witherSkullType = BukkitUtil.tryEnum(EntityType.class, "WITHER_SKULL");
}
/**
* Register events.
*/
public void registerEvents() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityInteract(EntityInteractEvent event) {
Entity entity = event.getEntity();
Block block = event.getBlock();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(entity.getWorld());
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
if (block.getTypeId() == BlockID.SOIL) {
if (entity instanceof Creature && wcfg.disableCreatureCropTrampling) {
event.setCancelled(true);
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_INTERACT);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getEntity());
context.setTargetBlock(event.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onEntityDeath(EntityDeathEvent event) {
WorldConfiguration wcfg = plugin.getGlobalStateManager().get(event.getEntity().getWorld());
if (wcfg.disableExpDrops || !plugin.getGlobalRegionManager().allows(DefaultFlag.EXP_DROPS,
event.getEntity().getLocation())) {
event.setDroppedExp(0);
}
if (event instanceof PlayerDeathEvent && wcfg.disableDeathMessages) {
((PlayerDeathEvent) event).setDeathMessage("");
}
}
private void onEntityDamageByBlock(EntityDamageByBlockEvent event) {
Entity defender = event.getEntity();
DamageCause type = event.getCause();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(defender.getWorld());
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
if (defender instanceof Wolf && ((Wolf) defender).isTamed()) {
if (wcfg.antiWolfDumbness && !(type == DamageCause.VOID)) {
event.setCancelled(true);
return;
}
} else if (defender instanceof Player) {
Player player = (Player) defender;
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_DEATH);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
if (isInvincible(player)) {
// Set a message if it's a death from a player
if (event instanceof PlayerDeathEvent) {
context.setMessage(((PlayerDeathEvent) event).getDeathMessage());
}
rules.process(context);
// Set the message back
if (event instanceof PlayerDeathEvent) {
((PlayerDeathEvent) event).setDeathMessage(context.getMessage());
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityDamage(EntityDamageEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
// Redirect damage done by an entity
if (event instanceof EntityDamageByEntityEvent) {
this.onEntityDamageByEntity((EntityDamageByEntityEvent) event);
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_DAMAGE);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(((EntityDamageByEntityEvent) event).getDamager());
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
if (wcfg.disableLavaDamage && type == DamageCause.LAVA) {
event.setCancelled(true);
player.setFireTicks(0);
return;
// Redirect damage done by blocks
} else if (event instanceof EntityDamageByBlockEvent) {
Entity defender = event.getEntity();
// God-mode/amphibious mode
if (defender instanceof Player) {
Player player = (Player) defender;
if (isInvincible(player)) {
event.setCancelled(true);
return;
}
}
if (wcfg.disableContactDamage && type == DamageCause.CONTACT) {
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_DAMAGE);
BukkitContext context = new BukkitContext(event);
Block damager = ((EntityDamageByBlockEvent) event).getDamager();
if (damager != null) { // Should NOT be null!
context.setSourceBlock(damager.getState());
}
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
if (wcfg.teleportOnVoid && type == DamageCause.VOID) {
BukkitUtil.findFreePosition(player);
event.setCancelled(true);
return;
// Other damage
} else {
Entity defender = event.getEntity();
DamageCause type = event.getCause();
// God-mode/amphibious mode
if (defender instanceof Player) {
Player player = (Player) defender;
if (isInvincible(player)) {
event.setCancelled(true);
player.setFireTicks(0);
return;
}
if (type == DamageCause.DROWNING && cfg.hasAmphibiousMode(player)) {
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
return;
}
}
if (wcfg.disableVoidDamage && type == DamageCause.VOID) {
event.setCancelled(true);
return;
}
if (wcfg.disableExplosionDamage && type == DamageCause.BLOCK_EXPLOSION) {
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_DAMAGE);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
}
/**
* Handle a damage by entity event.
*
* @param event event
*/
private void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Projectile) {
onEntityDamageByProjectile(event);
return;
@ -231,16 +258,6 @@ public class WorldGuardEntityListener implements Listener {
return;
}
if (wcfg.disableLightningDamage && event.getCause() == DamageCause.LIGHTNING) {
event.setCancelled(true);
return;
}
if (wcfg.disableExplosionDamage && event.getCause() == DamageCause.ENTITY_EXPLOSION) {
event.setCancelled(true);
return;
}
if (attacker != null && attacker instanceof Player) {
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
@ -256,10 +273,6 @@ public class WorldGuardEntityListener implements Listener {
}
if (attacker != null && attacker instanceof TNTPrimed) {
if (wcfg.blockTNTExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld());
@ -272,10 +285,6 @@ public class WorldGuardEntityListener implements Listener {
}
if (attacker != null && attacker instanceof Fireball) {
if (wcfg.blockFireballExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
Fireball fireball = (Fireball) attacker;
Vector pt = toVector(defender.getLocation());
@ -299,16 +308,6 @@ public class WorldGuardEntityListener implements Listener {
}
if (attacker != null && attacker instanceof LivingEntity && !(attacker instanceof Player)) {
if (attacker instanceof Creeper && wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.disableMobDamage) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld());
@ -350,10 +349,6 @@ public class WorldGuardEntityListener implements Listener {
// Check Mob
if (attacker != null && attacker instanceof LivingEntity && !(attacker instanceof Player)) {
if (wcfg.disableMobDamage) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld());
@ -384,84 +379,6 @@ public class WorldGuardEntityListener implements Listener {
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityDamage(EntityDamageEvent event) {
if (event instanceof EntityDamageByEntityEvent) {
this.onEntityDamageByEntity((EntityDamageByEntityEvent) event);
return;
} else if (event instanceof EntityDamageByBlockEvent) {
this.onEntityDamageByBlock((EntityDamageByBlockEvent) event);
return;
}
Entity defender = event.getEntity();
DamageCause type = event.getCause();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(defender.getWorld());
if (defender instanceof Wolf && ((Wolf) defender).isTamed()) {
if (wcfg.antiWolfDumbness) {
event.setCancelled(true);
return;
}
} else if (defender instanceof Player) {
Player player = (Player) defender;
if (isInvincible(player)) {
event.setCancelled(true);
player.setFireTicks(0);
return;
}
if (type == DamageCause.DROWNING && cfg.hasAmphibiousMode(player)) {
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
return;
}
ItemStack helmet = player.getInventory().getHelmet();
if (type == DamageCause.DROWNING && wcfg.pumpkinScuba
&& helmet != null
&& (helmet.getTypeId() == BlockID.PUMPKIN
|| helmet.getTypeId() == BlockID.JACKOLANTERN)) {
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
return;
}
if (wcfg.disableFallDamage && type == DamageCause.FALL) {
event.setCancelled(true);
return;
}
if (wcfg.disableFireDamage && (type == DamageCause.FIRE
|| type == DamageCause.FIRE_TICK)) {
event.setCancelled(true);
return;
}
if (wcfg.disableDrowningDamage && type == DamageCause.DROWNING) {
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
return;
}
if (wcfg.teleportOnSuffocation && type == DamageCause.SUFFOCATION) {
BukkitUtil.findFreePosition(player);
event.setCancelled(true);
return;
}
if (wcfg.disableSuffocationDamage && type == DamageCause.SUFFOCATION) {
event.setCancelled(true);
return;
}
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityCombust(EntityCombustEvent event) {
Entity entity = event.getEntity();
@ -469,6 +386,7 @@ public class WorldGuardEntityListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(entity.getWorld());
// God mode and regions
if (entity instanceof Player) {
Player player = (Player) entity;
@ -477,11 +395,17 @@ public class WorldGuardEntityListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_IGNITE);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(entity);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
/*
* Called on entity explode.
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityExplode(EntityExplodeEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
@ -490,47 +414,19 @@ public class WorldGuardEntityListener implements Listener {
WorldConfiguration wcfg = cfg.get(world);
Entity ent = event.getEntity();
if (cfg.activityHaltToggle) {
ent.remove();
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_EXPLODE);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
if (ent.getType() == witherType) {
if (wcfg.blockWitherBlockDamage) {
event.blockList().clear();
return;
}
if (wcfg.blockWitherExplosions) {
event.setCancelled(true);
return;
}
}
if (ent.getType() == witherSkullType) {
if (wcfg.blockWitherSkullBlockDamage) {
event.blockList().clear();
return;
}
if (wcfg.blockWitherSkullExplosions) {
event.setCancelled(true);
return;
}
}
/* --- No short-circuit returns below this line --- */
// Regions
if (ent instanceof Creeper) {
if (wcfg.blockCreeperBlockDamage) {
event.blockList().clear();
return;
}
if (wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
if (wcfg.useRegions) {
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -544,11 +440,6 @@ public class WorldGuardEntityListener implements Listener {
}
}
} else if (ent instanceof EnderDragon) {
if (wcfg.blockEnderDragonBlockDamage) {
event.blockList().clear();
return;
}
if (wcfg.useRegions) {
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -560,16 +451,6 @@ public class WorldGuardEntityListener implements Listener {
}
}
} else if (ent instanceof TNTPrimed) {
if (wcfg.blockTNTBlockDamage) {
event.blockList().clear();
return;
}
if (wcfg.blockTNTExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -581,16 +462,6 @@ public class WorldGuardEntityListener implements Listener {
}
}
} else if (ent instanceof Fireball) {
if (wcfg.blockFireballBlockDamage) {
event.blockList().clear();
return;
}
if (wcfg.blockFireballExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -612,79 +483,46 @@ public class WorldGuardEntityListener implements Listener {
}
}
// Now apply RuleLists for each block
Iterator<Block> iter = event.blockList().iterator();
while (iter.hasNext()) {
Block block = iter.next();
rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_BREAK);
context = new BukkitContext(event);
context.setSourceEntity(event.getEntity());
context.setTargetBlock(block.getState());
rules.process(context);
if (context.isCancelled()) {
iter.remove();
}
}
}
/*
* Called on explosion prime
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onExplosionPrime(ExplosionPrimeEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
Entity ent = event.getEntity();
if (cfg.activityHaltToggle) {
ent.remove();
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_EXPLODE);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
if (event.getEntityType() == witherType) {
if (wcfg.blockWitherExplosions) {
event.setCancelled(true);
return;
}
}
else if (event.getEntityType() == witherSkullType) {
if (wcfg.blockWitherSkullExplosions) {
event.setCancelled(true);
return;
}
}
else if (event.getEntityType() == fireballType) {
if (wcfg.blockFireballExplosions) {
event.setCancelled(true);
return;
}
}
else if (event.getEntityType() == EntityType.CREEPER) {
if (wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
}
else if (event.getEntityType() == EntityType.PRIMED_TNT) {
if (wcfg.blockTNTExplosions) {
event.setCancelled(true);
return;
}
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onCreatureSpawn(CreatureSpawnEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
if (cfg.activityHaltToggle) {
event.setCancelled(true);
return;
}
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
// allow spawning of creatures from plugins
if (!wcfg.blockPluginSpawning && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.CUSTOM)
return;
EntityType entityType = event.getEntityType();
if (wcfg.blockCreatureSpawn.contains(entityType)) {
event.setCancelled(true);
return;
}
Location eventLoc = event.getLocation();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
// Regions
if (wcfg.useRegions && cfg.useRegionsCreatureSpawnEvent) {
Vector pt = toVector(eventLoc);
RegionManager mgr = plugin.getGlobalRegionManager().get(eventLoc.getWorld());
@ -703,6 +541,15 @@ public class WorldGuardEntityListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_SPAWN);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -710,9 +557,11 @@ public class WorldGuardEntityListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
if (wcfg.disablePigZap) {
event.setCancelled(true);
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_STRIKE);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
rules.process(context);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -720,64 +569,37 @@ public class WorldGuardEntityListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld());
if (wcfg.disableCreeperPower) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEntityRegainHealth(EntityRegainHealthEvent event) {
Entity ent = event.getEntity();
World world = ent.getWorld();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (wcfg.disableHealthRegain) {
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_STRIKE);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
/**
* Called when an enderman picks up or puts down a block and some other cases.
*
* @param event Relevant event details
*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onEndermanPickup(EntityChangeBlockEvent event) {
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
Entity ent = event.getEntity();
Block block = event.getBlock();
Location location = block.getLocation();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(ent.getWorld());
if (ent instanceof Enderman) {
if (event.getTo() == Material.AIR) {
// pickup
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(ent.getWorld());
if (wcfg.disableEndermanGriefing) {
event.setCancelled(true);
return;
}
if (event.getTo() == Material.AIR) { // Pickup
// Blacklist
if (wcfg.useRegions) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.ENDER_BUILD, location)) {
event.setCancelled(true);
return;
}
}
// Place
} else {
// place
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(ent.getWorld());
if (wcfg.disableEndermanGriefing) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.ENDER_BUILD, location)) {
event.setCancelled(true);
@ -785,14 +607,20 @@ public class WorldGuardEntityListener implements Listener {
}
}
}
} else if (ent.getType() == witherType) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(ent.getWorld());
if (wcfg.blockWitherBlockDamage || wcfg.blockWitherExplosions) {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(event.getTo() == Material.AIR ?
KnownAttachment.BLOCK_BREAK : KnownAttachment.BLOCK_PLACE);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(ent);
BlockState newState = event.getBlock().getState(); // This event is lame
newState.setType(event.getTo()); // Need to construct our own BlockState
context.setTargetBlock(event.getBlock().getState());
context.setPlacedBlock(newState);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@ -802,6 +630,7 @@ public class WorldGuardEntityListener implements Listener {
Player player = (Player) event.getEntity();
if (event.getFoodLevel() < player.getFoodLevel() && isInvincible(player)) {
event.setCancelled(true);
return;
}
}
}
@ -810,12 +639,15 @@ public class WorldGuardEntityListener implements Listener {
public void onPotionSplash(PotionSplashEvent event) {
GlobalRegionManager global = plugin.getGlobalRegionManager();
int blockedEntities = 0;
for (LivingEntity e : event.getAffectedEntities()) {
if (!global.allows(DefaultFlag.POTION_SPLASH, e.getLocation(), e instanceof Player ? plugin.wrapPlayer((Player) e) : null)) {
if (!global.allows(DefaultFlag.POTION_SPLASH, e.getLocation(),
e instanceof Player ? plugin.wrapPlayer((Player) e) : null)) {
event.setIntensity(e, 0);
++blockedEntities;
}
}
if (blockedEntities == event.getAffectedEntities().size()) {
event.setCancelled(true);
}
@ -852,20 +684,28 @@ public class WorldGuardEntityListener implements Listener {
/**
* Using a DisallowedPVPEvent, notifies other plugins that WorldGuard
* wants to cancel a PvP damage event.<br />
* If this event is not cancelled, the attacking player is notified that
* wants to cancel a PvP damage event.
*
* <p>If this event is not cancelled, the attacking player is notified that
* PvP is disabled and WorldGuard cancels the damage event.
*
* @param attackingPlayer The attacker
* @param defendingPlayer The defender
* @param event The event that caused WorldGuard to act
* @param aggressorTriggered whether the aggressor triggered the incident.
*/
public void tryCancelPVPEvent(final Player attackingPlayer, final Player defendingPlayer, EntityDamageByEntityEvent event, boolean aggressorTriggered) {
final DisallowedPVPEvent disallowedPVPEvent = new DisallowedPVPEvent(attackingPlayer, defendingPlayer, event);
plugin.getServer().getPluginManager().callEvent(disallowedPVPEvent);
if (!disallowedPVPEvent.isCancelled()) {
if (aggressorTriggered) attackingPlayer.sendMessage(ChatColor.DARK_RED + "You are in a no-PvP area.");
else attackingPlayer.sendMessage(ChatColor.DARK_RED + "That player is in a no-PvP area.");
if (aggressorTriggered) {
attackingPlayer.sendMessage(ChatColor.DARK_RED
+ "You are in a no-PvP area.");
} else {
attackingPlayer.sendMessage(ChatColor.DARK_RED
+ "That player is in a no-PvP area.");
}
event.setCancelled(true);
}
}

View File

@ -38,6 +38,8 @@ import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.hanging.HangingPlaceEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
import com.sk89q.worldedit.blocks.ItemID;
import com.sk89q.worldguard.blacklist.events.BlockBreakBlacklistEvent;
import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent;
@ -108,10 +110,6 @@ public class WorldGuardHangingListener implements Listener {
}
} else {
if (event.getRemover() instanceof Creeper) {
if (wcfg.blockCreeperBlockDamage || wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(DefaultFlag.CREEPER_EXPLOSION, hanging.getLocation())) {
event.setCancelled(true);
return;
@ -119,17 +117,26 @@ public class WorldGuardHangingListener implements Listener {
}
if (hanging instanceof Painting
&& (wcfg.blockEntityPaintingDestroy
|| (wcfg.useRegions
&& !plugin.getGlobalRegionManager().allows(DefaultFlag.ENTITY_PAINTING_DESTROY, hanging.getLocation())))) {
&& ((wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.ENTITY_PAINTING_DESTROY, hanging.getLocation())))) {
event.setCancelled(true);
} else if (hanging instanceof ItemFrame
&& (wcfg.blockEntityItemFrameDestroy
|| (wcfg.useRegions
&& !plugin.getGlobalRegionManager().allows(DefaultFlag.ENTITY_ITEM_FRAME_DESTROY, hanging.getLocation())))) {
&& ((wcfg.useRegions && !plugin.getGlobalRegionManager()
.allows(DefaultFlag.ENTITY_ITEM_FRAME_DESTROY,
hanging.getLocation())))) {
event.setCancelled(true);
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_DAMAGE);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getRemover());
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -165,6 +172,16 @@ public class WorldGuardHangingListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_SPAWN);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
context.setTargetEntity(event.getEntity());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -181,16 +198,28 @@ public class WorldGuardHangingListener implements Listener {
event.setCancelled(true);
return;
}
if (entity instanceof ItemFrame
&& ((!plugin.getGlobalRegionManager().allows(
DefaultFlag.ENTITY_ITEM_FRAME_DESTROY, entity.getLocation())))) {
event.setCancelled(true);
return;
} else if (entity instanceof Painting
&& ((!plugin.getGlobalRegionManager().allows(
DefaultFlag.ENTITY_PAINTING_DESTROY, entity.getLocation())))) {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_INTERACT);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
context.setTargetEntity(entity);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
}

View File

@ -37,6 +37,8 @@ import org.bukkit.event.painting.PaintingBreakEvent;
import org.bukkit.event.painting.PaintingPlaceEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
import com.sk89q.worldedit.blocks.ItemID;
import com.sk89q.worldguard.blacklist.events.BlockBreakBlacklistEvent;
import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent;
@ -103,22 +105,24 @@ public class WorldGuardPaintingListener implements Listener {
}
} else {
if (event.getRemover() instanceof Creeper) {
if (wcfg.blockCreeperBlockDamage || wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
if (wcfg.useRegions && !plugin.getGlobalRegionManager().allows(DefaultFlag.CREEPER_EXPLOSION, painting.getLocation())) {
event.setCancelled(true);
return;
}
}
if (wcfg.blockEntityPaintingDestroy
|| (wcfg.useRegions
&& !plugin.getGlobalRegionManager().allows(DefaultFlag.ENTITY_PAINTING_DESTROY, painting.getLocation()))) {
if ((wcfg.useRegions && !plugin.getGlobalRegionManager().allows(
DefaultFlag.ENTITY_PAINTING_DESTROY, painting.getLocation()))) {
event.setCancelled(true);
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_DAMAGE);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getRemover());
context.setTargetEntity(event.getPainting());
rules.process(context);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -147,6 +151,16 @@ public class WorldGuardPaintingListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_SPAWN);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
context.setTargetEntity(event.getPainting());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -163,12 +177,23 @@ public class WorldGuardPaintingListener implements Listener {
event.setCancelled(true);
return;
}
if (entity instanceof Painting
&& ((!plugin.getGlobalRegionManager().allows(
DefaultFlag.ENTITY_PAINTING_DESTROY, entity.getLocation())))) {
event.setCancelled(true);
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ENTITY_INTERACT);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
context.setTargetEntity(entity);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
}

View File

@ -22,14 +22,12 @@ import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector;
import java.util.Iterator;
import java.util.Set;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.blocks.ItemID;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.Event.Result;
@ -37,6 +35,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
@ -45,7 +44,6 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerMoveEvent;
@ -55,8 +53,12 @@ import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.worldedit.blocks.ItemID;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.blacklist.events.BlockBreakBlacklistEvent;
import com.sk89q.worldguard.blacklist.events.BlockInteractBlacklistEvent;
@ -71,24 +73,16 @@ import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
/**
* Handles all events thrown in relation to a player.
* Listener for player events.
*/
public class WorldGuardPlayerListener implements Listener {
private WorldGuardPlugin plugin;
/**
* Construct the object;
*
* @param plugin
*/
public WorldGuardPlayerListener(WorldGuardPlugin plugin) {
this.plugin = plugin;
}
/**
* Register events.
*/
public void registerEvents() {
final PluginManager pm = plugin.getServer().getPluginManager();
pm.registerEvents(this, plugin);
@ -98,6 +92,10 @@ public class WorldGuardPlayerListener implements Listener {
}
}
/**
* Listener just for {@link PlayerMoveEvent}. This handler may not always be
* registered for performance reasons.
*/
class PlayerMoveHandler implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerMove(PlayerMoveEvent event) {
@ -240,6 +238,8 @@ public class WorldGuardPlayerListener implements Listener {
public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) {
Player player = event.getPlayer();
WorldConfiguration wcfg = plugin.getGlobalStateManager().get(player.getWorld());
// Regions
if (wcfg.useRegions && !plugin.getGlobalRegionManager().hasBypass(player, player.getWorld())) {
GameMode gameMode = plugin.getGlobalRegionManager().get(player.getWorld())
.getApplicableRegions(player.getLocation()).getFlag(DefaultFlag.GAME_MODE);
@ -260,39 +260,18 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (cfg.activityHaltToggle) {
player.sendMessage(ChatColor.YELLOW
+ "Intensive server activity has been HALTED.");
int removed = 0;
for (Entity entity : world.getEntities()) {
if (BukkitUtil.isIntensiveEntity(entity)) {
entity.remove();
removed++;
}
}
if (removed > 10) {
plugin.getLogger().info("Halt-Act: " + removed + " entities (>10) auto-removed from "
+ player.getWorld().toString());
}
}
/* --- No short-circuit returns below this line --- */
if (wcfg.fireSpreadDisableToggle) {
player.sendMessage(ChatColor.YELLOW
+ "Fire spread is currently globally disabled for this world.");
}
if (!cfg.hasCommandBookGodMode() && cfg.autoGodMode && (plugin.inGroup(player, "wg-invincible")
|| plugin.hasPermission(player, "worldguard.auto-invincible"))) {
cfg.enableGodMode(player);
}
if (plugin.inGroup(player, "wg-amphibious")) {
cfg.enableAmphibiousMode(player);
}
// Regions
if (wcfg.useRegions) {
PlayerFlagState state = plugin.getFlagStateManager().getState(player);
Location loc = player.getLocation();
@ -301,12 +280,20 @@ public class WorldGuardPlayerListener implements Listener {
state.lastBlockY = loc.getBlockY();
state.lastBlockZ = loc.getBlockZ();
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.PLAYER_SPAWN);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
rules.process(context);
}
@EventHandler(ignoreCancelled = true)
public void onPlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
WorldConfiguration wcfg = plugin.getGlobalStateManager().get(player.getWorld());
// Regions
if (wcfg.useRegions) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.SEND_CHAT, player.getLocation())) {
player.sendMessage(ChatColor.RED + "You don't have permission to chat in this region!");
@ -319,6 +306,7 @@ public class WorldGuardPlayerListener implements Listener {
i.remove();
}
}
if (event.getRecipients().size() == 0) {
event.setCancelled(true);
}
@ -330,6 +318,9 @@ public class WorldGuardPlayerListener implements Listener {
Player player = event.getPlayer();
ConfigurationManager cfg = plugin.getGlobalStateManager();
/* --- No short-circuit returns below this line --- */
// Host keys
String hostKey = cfg.hostKeys.get(player.getName().toLowerCase());
if (hostKey != null) {
String hostname = event.getHostname();
@ -357,6 +348,9 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
/* --- No short-circuit returns below this line --- */
// Regions
// This is to make the enter/exit flags accurate -- move events are not
// sent constantly, so it is possible to move just a little enough to
// not trigger the event and then rejoin so that you are then considered
@ -387,14 +381,23 @@ public class WorldGuardPlayerListener implements Listener {
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.PLAYER_QUIT);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
rules.process(context);
// Cleanup
cfg.forgetPlayer(plugin.wrapPlayer(player));
plugin.forgetPlayer(player);
}
@EventHandler(priority = EventPriority.HIGH)
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
World world = player.getWorld();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(player.getWorld());
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
handleBlockRightClick(event);
@ -408,17 +411,14 @@ public class WorldGuardPlayerListener implements Listener {
handlePhysicalInteract(event);
}
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (wcfg.removeInfiniteStacks
&& !plugin.hasPermission(player, "worldguard.override.infinite-stack")) {
int slot = player.getInventory().getHeldItemSlot();
ItemStack heldItem = player.getInventory().getItem(slot);
if (heldItem != null && heldItem.getAmount() < 0) {
player.getInventory().setItem(slot, null);
player.sendMessage(ChatColor.RED + "Infinite stack removed.");
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.BLOCK_INTERACT);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
context.setTargetBlock(event.getClickedBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@ -438,8 +438,6 @@ public class WorldGuardPlayerListener implements Listener {
* @param event Thrown event
*/
private void handleBlockLeftClick(PlayerInteractEvent event) {
if (event.isCancelled()) return;
Player player = event.getPlayer();
Block block = event.getClickedBlock();
int type = block.getTypeId();
@ -501,10 +499,6 @@ public class WorldGuardPlayerListener implements Listener {
* @param event Thrown event
*/
private void handleAirRightClick(PlayerInteractEvent event) {
if (event.isCancelled()) {
return;
}
Player player = event.getPlayer();
World world = player.getWorld();
ItemStack item = player.getItemInHand();
@ -530,10 +524,6 @@ public class WorldGuardPlayerListener implements Listener {
* @param event Thrown event
*/
private void handleBlockRightClick(PlayerInteractEvent event) {
if (event.isCancelled()) {
return;
}
Block block = event.getClickedBlock();
World world = block.getWorld();
int type = block.getTypeId();
@ -552,7 +542,6 @@ public class WorldGuardPlayerListener implements Listener {
|| type == BlockID.BREWING_STAND
|| type == BlockID.ENCHANTMENT_TABLE
|| type == BlockID.CAULDRON)
&& wcfg.removeInfiniteStacks
&& !plugin.hasPermission(player, "worldguard.override.infinite-stack")) {
for (int slot = 0; slot < 40; slot++) {
ItemStack heldItem = player.getInventory().getItem(slot);
@ -751,55 +740,6 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
}
/*if (wcfg.useRegions && wcfg.useiConomy && cfg.getiConomy() != null
&& (type == BlockID.SIGN_POST || type == ItemID.SIGN || type == BlockID.WALL_SIGN)) {
BlockState block = blockClicked.getState();
if (((Sign)block).getLine(0).equalsIgnoreCase("[WorldGuard]")
&& ((Sign)block).getLine(1).equalsIgnoreCase("For sale")) {
String regionId = ((Sign)block).getLine(2);
//String regionComment = ((Sign)block).getLine(3);
if (regionId != null && regionId != "") {
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().get(player.getWorld().getName());
ProtectedRegion region = mgr.getRegion(regionId);
if (region != null) {
RegionFlags flags = region.getFlags();
if (flags.getBooleanFlag(DefaultFlag.BUYABLE).getValue(false)) {
if (iConomy.getBank().hasAccount(player.getName())) {
Account account = iConomy.getBank().getAccount(player.getName());
double balance = account.getBalance();
double regionPrice = flags.getDoubleFlag(DefaultFlag.PRICE).getValue();
if (balance >= regionPrice) {
account.subtract(regionPrice);
player.sendMessage(ChatColor.YELLOW + "You have bought the region " + regionId + " for " +
iConomy.getBank().format(regionPrice));
DefaultDomain owners = region.getOwners();
owners.addPlayer(player.getName());
region.setOwners(owners);
flags.getBooleanFlag(DefaultFlag.BUYABLE).setValue(false);
account.save();
} else {
player.sendMessage(ChatColor.YELLOW + "You have not enough money.");
}
} else {
player.sendMessage(ChatColor.YELLOW + "You have not enough money.");
}
} else {
player.sendMessage(ChatColor.RED + "Region: " + regionId + " is not buyable");
}
} else {
player.sendMessage(ChatColor.DARK_RED + "The region " + regionId + " does not exist.");
}
} else {
player.sendMessage(ChatColor.DARK_RED + "No region specified.");
}
}
}*/
}
/**
@ -808,8 +748,6 @@ public class WorldGuardPlayerListener implements Listener {
* @param event Thrown event
*/
private void handlePhysicalInteract(PlayerInteractEvent event) {
if (event.isCancelled()) return;
Player player = event.getPlayer();
Block block = event.getClickedBlock(); //not actually clicked but whatever
int type = block.getTypeId();
@ -818,11 +756,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (block.getTypeId() == BlockID.SOIL && wcfg.disablePlayerCropTrampling) {
event.setCancelled(true);
return;
}
// Regions
if (wcfg.useRegions) {
Vector pt = toVector(block);
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -841,79 +775,13 @@ public class WorldGuardPlayerListener implements Listener {
}
}
/**
* Called when a player uses an item.
*//*
@Override
public void onPlayerItem(PlayerItemEvent event) {
if (event.isCancelled()) {
return;
}
Player player = event.getPlayer();
Block block = event.getBlockClicked();
ItemStack item = event.getItem();
int itemId = item.getTypeId();
GlobalConfiguration cfg = plugin.getGlobalConfiguration();
WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (wcfg.useRegions
&& (itemId == 322 || itemId == 320 || itemId == 319 || itemId == 297 || itemId == 260
|| itemId == 350 || itemId == 349 || itemId == 354) ) {
return;
}
if (!wcfg.itemDurability) {
// Hoes
if (item.getTypeId() >= 290 && item.getTypeId() <= 294) {
item.setDurability((byte) -1);
player.setItemInHand(item);
}
}
if (wcfg.useRegions && !event.isBlock() && block != null) {
Vector pt = toVector(block.getRelative(event.getBlockFace()));
if (block.getTypeId() == BlockID.WALL_SIGN) {
pt = pt.subtract(0, 1, 0);
}
if (!cfg.canBuild(player, pt)) {
player.sendMessage(ChatColor.DARK_RED
+ "You don't have permission for this area.");
event.setCancelled(true);
return;
}
}
if (wcfg.getBlacklist() != null && item != null && block != null) {
if (!wcfg.getBlacklist().check(
new ItemUseBlacklistEvent(plugin.wrapPlayer(player),
toVector(block.getRelative(event.getBlockFace())),
item.getTypeId()), false, false)) {
event.setCancelled(true);
return;
}
}
if (wcfg.useRegions && item != null && block != null && item.getTypeId() == 259) {
Vector pt = toVector(block.getRelative(event.getBlockFace()));
RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld().getName());
if (!mgr.getApplicableRegions(pt).isStateFlagAllowed(DefaultFlag.LIGHTER)) {
event.setCancelled(true);
return;
}
}
}*/
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerDropItem(PlayerDropItemEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getPlayer().getWorld());
Player player = event.getPlayer();
// Regions
if (wcfg.useRegions) {
if (!plugin.getGlobalRegionManager().allows(DefaultFlag.ITEM_DROP, player.getLocation())) {
event.setCancelled(true);
@ -921,6 +789,7 @@ public class WorldGuardPlayerListener implements Listener {
}
}
// Blacklists
if (wcfg.getBlacklist() != null) {
Item ci = event.getItemDrop();
@ -931,6 +800,16 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ITEM_DROP);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(player);
context.setItem(event.getItemDrop().getItemStack());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -938,6 +817,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getPlayer().getWorld());
// Blacklist
if (wcfg.getBlacklist() != null) {
Item ci = event.getItem();
@ -948,8 +828,31 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ITEM_PICKUP);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
context.setItem(event.getItem().getItemStack());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerDeath(PlayerDeathEvent event) {
Player player = event.getEntity();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(player.getWorld());
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.PLAYER_DEATH);
BukkitContext context = new BukkitContext(event);
context.setTargetEntity(player);
rules.process(context);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
@ -959,6 +862,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// Regions
if (!plugin.getGlobalRegionManager().canBuild(
player, event.getBlockClicked().getRelative(event.getBlockFace()))) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
@ -966,6 +870,7 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
// Blacklist
if (wcfg.getBlacklist() != null) {
if (!wcfg.getBlacklist().check(
new ItemUseBlacklistEvent(plugin.wrapPlayer(player),
@ -974,6 +879,16 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ITEM_USE);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
context.setItem(event.getItemStack());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -984,6 +899,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// Regions
if (!plugin.getGlobalRegionManager().canBuild(
player, event.getBlockClicked().getRelative(event.getBlockFace()))) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
@ -991,6 +907,7 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
// Blacklist
if (wcfg.getBlacklist() != null) {
if (!wcfg.getBlacklist().check(
new ItemUseBlacklistEvent(plugin.wrapPlayer(player),
@ -999,6 +916,16 @@ public class WorldGuardPlayerListener implements Listener {
return;
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.ITEM_USE);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
context.setItem(event.getItemStack());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGHEST)
@ -1009,6 +936,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(player.getWorld());
// Regions
if (wcfg.useRegions) {
Vector pt = toVector(location);
RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld());
@ -1021,24 +949,12 @@ public class WorldGuardPlayerListener implements Listener {
event.setRespawnLocation(com.sk89q.worldedit.bukkit.BukkitUtil.toLocation(spawn));
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onItemHeldChange(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(player.getWorld());
if (wcfg.removeInfiniteStacks
&& !plugin.hasPermission(player, "worldguard.override.infinite-stack")) {
int newSlot = event.getNewSlot();
ItemStack heldItem = player.getInventory().getItem(newSlot);
if (heldItem != null && heldItem.getAmount() < 0) {
player.getInventory().setItem(newSlot, null);
player.sendMessage(ChatColor.RED + "Infinite stack removed.");
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.PLAYER_RESPAWN);
BukkitContext context = new BukkitContext(event);
context.setSourceEntity(event.getPlayer());
rules.process(context);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -1049,6 +965,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(player.getWorld());
// Regions
if (wcfg.useRegions) {
Vector pt = toVector(location);
RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld());
@ -1071,6 +988,7 @@ public class WorldGuardPlayerListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// Regions
if (wcfg.useRegions && !plugin.getGlobalRegionManager().hasBypass(player, world)) {
Vector pt = toVector(player.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -1085,6 +1003,7 @@ public class WorldGuardPlayerListener implements Listener {
if (allowedCommands != null && !allowedCommands.contains(lowerCommand)
&& (blockedCommands == null || blockedCommands.contains(lowerCommand))) {
player.sendMessage(ChatColor.RED + lowerCommand + " is not allowed in this area.");
event.setMessage("/"); // Make sure that it's disabled
event.setCancelled(true);
return;
}
@ -1092,6 +1011,7 @@ public class WorldGuardPlayerListener implements Listener {
if (blockedCommands != null && blockedCommands.contains(lowerCommand)
&& (allowedCommands == null || !allowedCommands.contains(lowerCommand))) {
player.sendMessage(ChatColor.RED + lowerCommand + " is blocked in this area.");
event.setMessage("/"); // Make sure that it's disabled
event.setCancelled(true);
return;
}

View File

@ -22,7 +22,6 @@ package com.sk89q.worldguard.bukkit;
import static com.sk89q.worldguard.bukkit.BukkitUtil.hasHangingEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -31,12 +30,8 @@ import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.logging.Level;
import com.sk89q.bukkit.util.CommandsManagerRegistration;
import com.sk89q.minecraft.util.commands.*;
import com.sk89q.wepif.PermissionsResolverManager;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
@ -46,55 +41,86 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.permissions.Permissible;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import com.sk89q.bukkit.util.CommandsManagerRegistration;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissionsException;
import com.sk89q.minecraft.util.commands.CommandUsageException;
import com.sk89q.minecraft.util.commands.CommandsManager;
import com.sk89q.minecraft.util.commands.MissingNestedCommandException;
import com.sk89q.minecraft.util.commands.SimpleInjector;
import com.sk89q.minecraft.util.commands.WrappedCommandException;
import com.sk89q.rebar.bukkit.VirtualRebarPlugin;
import com.sk89q.rebar.config.ConfigurationException;
import com.sk89q.rebar.config.YamlConfiguration;
import com.sk89q.rebar.config.YamlConfigurationResource;
import com.sk89q.rulelists.Action;
import com.sk89q.rulelists.Criteria;
import com.sk89q.rulelists.DefinitionManager;
import com.sk89q.rulelists.ResolverManager;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.wepif.PermissionsResolverManager;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.bukkit.commands.GeneralCommands;
import com.sk89q.worldguard.bukkit.commands.ProtectionCommands;
import com.sk89q.worldguard.bukkit.commands.ToggleCommands;
import com.sk89q.worldguard.bukkit.definitions.BlockCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.CancelActionLoader;
import com.sk89q.worldguard.bukkit.definitions.DamageCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.EntityCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.ItemCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.PermissionCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.PhenomenonCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.SetBlockActionLoader;
import com.sk89q.worldguard.bukkit.definitions.SetDropActionLoader;
import com.sk89q.worldguard.bukkit.definitions.SpawnCriteriaLoader;
import com.sk89q.worldguard.bukkit.definitions.TellActionLoader;
import com.sk89q.worldguard.bukkit.definitions.UpdateEntityActionLoader;
import com.sk89q.worldguard.bukkit.definitions.UpdateItemActionLoader;
import com.sk89q.worldguard.bukkit.definitions.SetMessageActionLoader;
import com.sk89q.worldguard.bukkit.definitions.UpdateWorldActionLoader;
import com.sk89q.worldguard.bukkit.definitions.WeatherCriteriaLoader;
import com.sk89q.worldguard.bukkit.resolvers.BlockResolver;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.ItemStackSlotResolver;
import com.sk89q.worldguard.bukkit.resolvers.PlacedBlockResolver;
import com.sk89q.worldguard.bukkit.resolvers.PlayerItemStackSlotResolver;
import com.sk89q.worldguard.bukkit.resolvers.PlayerItemStackSlotResolver.Slot;
import com.sk89q.worldguard.bukkit.resolvers.SourceBlockResolver;
import com.sk89q.worldguard.bukkit.resolvers.SourceEntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.TargetBlockResolver;
import com.sk89q.worldguard.bukkit.resolvers.TargetEntityResolver;
import com.sk89q.worldguard.protection.GlobalRegionManager;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.util.FatalConfigurationLoadingException;
/**
* The main class for WorldGuard as a Bukkit plugin.
*
* @author sk89q
*/
public class WorldGuardPlugin extends JavaPlugin {
/**
* Manager for commands. This automatically handles nested commands,
* permissions checking, and a number of other fancy command things.
* We just set it up and register commands against it.
*/
private final CommandsManager<CommandSender> commands;
/**
* Handles the region databases for all worlds.
*/
private final GlobalRegionManager globalRegionManager;
/**
* Handles all configuration.
*/
private final ConfigurationManager configuration;
/**
* Used for scheduling flags.
*/
private FlagStateManager flagStateManager;
private RuleListsManager ruleListsManager;
private final LagStopMode lagStopper;
private WorldGuardWorldListener worldListener;
/**
* Construct objects. Actual loading occurs when the plugin is enabled, so
* this merely instantiates the objects.
* Do initial loading of WorldGuard. Only called once. {@link #onEnable()} will be
* called when WorldGuard is enabled.
*/
public WorldGuardPlugin() {
configuration = new ConfigurationManager(this);
globalRegionManager = new GlobalRegionManager(this);
lagStopper = new LagStopMode(this);
final WorldGuardPlugin plugin = this;
commands = new CommandsManager<CommandSender>() {
@ -105,11 +131,15 @@ public class WorldGuardPlugin extends JavaPlugin {
};
}
/**
* Called on plugin enable.
*/
@SuppressWarnings("deprecation")
@Override
public void onEnable() {
// We don't require Rebar yet
VirtualRebarPlugin.setup(this);
// Set up RuleLists
ruleListsManager = new RuleListsManager();
registerRuleList();
// Set the proper command injector
commands.setInjector(new SimpleInjector(this));
@ -141,7 +171,7 @@ public class WorldGuardPlugin extends JavaPlugin {
configuration.load();
globalRegionManager.preload();
} catch (FatalConfigurationLoadingException e) {
e.printStackTrace();
getLogger().log(Level.SEVERE, "Fatal error encountered", e);
getServer().shutdown();
}
@ -162,6 +192,12 @@ public class WorldGuardPlugin extends JavaPlugin {
(new WorldGuardWeatherListener(this)).registerEvents();
(new WorldGuardVehicleListener(this)).registerEvents();
(new WorldGuardServerListener(this)).registerEvents();
(worldListener = new WorldGuardWorldListener(this)).registerEvents();
lagStopper.registerEvents();
// Initialization
simulateWorldLoad();
if (hasHangingEvent()) {
(new WorldGuardHangingListener(this)).registerEvents();
} else {
@ -172,37 +208,15 @@ public class WorldGuardPlugin extends JavaPlugin {
if (getServer().getPluginManager().isPluginEnabled("CommandBook")) {
getServer().getPluginManager().registerEvents(new WorldGuardCommandBookListener(this), this);
}
// handle worlds separately to initialize already loaded worlds
WorldGuardWorldListener worldListener = (new WorldGuardWorldListener(this));
for (World world : getServer().getWorlds()) {
worldListener.initWorld(world);
}
worldListener.registerEvents();
if (!configuration.hasCommandBookGodMode()) {
// Check god mode for existing players, if any
for (Player player : getServer().getOnlinePlayers()) {
if (inGroup(player, "wg-invincible") ||
(configuration.autoGodMode && hasPermission(player, "worldguard.auto-invincible"))) {
configuration.enableGodMode(player);
}
}
}
}
/**
* Called on plugin disable.
*/
@Override
public void onDisable() {
globalRegionManager.unload();
configuration.unload();
this.getServer().getScheduler().cancelTasks(this);
}
/**
* Handle a command.
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label,
String[] args) {
@ -229,6 +243,16 @@ public class WorldGuardPlugin extends JavaPlugin {
return true;
}
/**
* Dispatch {@link WorldLoadEvent}s to the world listener.
*/
public void simulateWorldLoad() {
for (World world : getServer().getWorlds()) {
WorldLoadEvent event = new WorldLoadEvent(world);
worldListener.onWorldLoad(event);
}
}
/**
* Get the GlobalRegionManager.
*
@ -267,6 +291,74 @@ public class WorldGuardPlugin extends JavaPlugin {
return configuration;
}
/**
* Get the rules list manager.
*
* @return rule lists manager
*/
public RuleListsManager getRulesListManager() {
return ruleListsManager;
}
/**
* Get the built-in rules.
*
* @return built-in rules
* @throws ConfigurationException
* on config error
* @throws IOException
* on I/O exception
*/
public YamlConfiguration getBuiltInRules() throws IOException, ConfigurationException {
YamlConfiguration rules = new YamlConfigurationResource(getClass(),
"/defaults/builtin_rules.yml");
rules.load();
return rules;
}
/**
* Register RuleList resolvers, criterion, and actions.
*/
private void registerRuleList() {
// Subject resolvers
ResolverManager resolvers = ruleListsManager.getResolvers();
resolvers.register(BlockResolver.class, "source", new SourceBlockResolver());
resolvers.register(BlockResolver.class, "target", new TargetBlockResolver());
resolvers.register(BlockResolver.class, "placed", new PlacedBlockResolver());
resolvers.register(EntityResolver.class, "source", new SourceEntityResolver());
resolvers.register(EntityResolver.class, "target", new TargetEntityResolver());
resolvers.register(ItemStackSlotResolver.class, "held", new PlayerItemStackSlotResolver(Slot.HELD));
resolvers.register(ItemStackSlotResolver.class, "helmet", new PlayerItemStackSlotResolver(Slot.HELMET));
resolvers.register(ItemStackSlotResolver.class, "chestplate", new PlayerItemStackSlotResolver(Slot.CHESTPLATE));
resolvers.register(ItemStackSlotResolver.class, "leggings", new PlayerItemStackSlotResolver(Slot.LEGGINGS));
resolvers.register(ItemStackSlotResolver.class, "boots", new PlayerItemStackSlotResolver(Slot.BOOTS));
// Criterion
DefinitionManager<Criteria<?>> criterion = ruleListsManager.getCriterion();
criterion.register("match-block", new BlockCriteriaLoader(ruleListsManager));
criterion.register("match-item", new ItemCriteriaLoader(ruleListsManager));
criterion.register("match-entity", new EntityCriteriaLoader(ruleListsManager));
criterion.register("match-damage", new DamageCriteriaLoader());
criterion.register("match-spawn", new SpawnCriteriaLoader());
criterion.register("match-phenomenon", new PhenomenonCriteriaLoader());
criterion.register("match-weather", new WeatherCriteriaLoader());
criterion.register("has-permission", new PermissionCriteriaLoader(this, ruleListsManager));
// Actions
DefinitionManager<Action<?>> actions = ruleListsManager.getActions();
actions.register("cancel", new CancelActionLoader());
actions.register("tell", new TellActionLoader(ruleListsManager));
actions.register("update-item", new UpdateItemActionLoader(ruleListsManager));
actions.register("update-world", new UpdateWorldActionLoader());
actions.register("update-entity", new UpdateEntityActionLoader(this, ruleListsManager));
actions.register("set-message", new SetMessageActionLoader(ruleListsManager));
actions.register("set-drop", new SetDropActionLoader());
actions.register("set-block", new SetBlockActionLoader(ruleListsManager));
}
/**
* Check whether a player is in a group.
* This calls the corresponding method in PermissionsResolverManager
@ -698,9 +790,7 @@ public class WorldGuardPlugin extends JavaPlugin {
* @param actual The destination file
* @param defaultName The name of the file inside the jar's defaults folder
*/
public void createDefaultConfiguration(File actual,
String defaultName) {
public void createDefaultConfiguration(File actual, String defaultName) {
// Make parent directories
File parent = actual.getParentFile();
if (!parent.exists()) {
@ -711,16 +801,10 @@ public class WorldGuardPlugin extends JavaPlugin {
return;
}
InputStream input =
null;
try {
JarFile file = new JarFile(getFile());
ZipEntry copy = file.getEntry("defaults/" + defaultName);
if (copy == null) throw new FileNotFoundException();
input = file.getInputStream(copy);
} catch (IOException e) {
getLogger().severe("Unable to read default configuration: " + defaultName);
}
InputStream input = WorldGuardPlugin.class.getResourceAsStream("/defaults/" + defaultName);
if (input == null) {
getLogger().severe("Unable to read default configuration: " + defaultName);
}
if (input != null) {
FileOutputStream output = null;
@ -823,6 +907,15 @@ public class WorldGuardPlugin extends JavaPlugin {
return getGlobalRegionManager().get(world);
}
/**
* Get the "lag stop mode" controller.
*
* @return the lag stop mode
*/
public LagStopMode getLagStopMode() {
return lagStopper;
}
/**
* Replace macros in the text.
*

View File

@ -7,7 +7,7 @@ import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.PluginManager;
/**
* @author zml2008
* Listener for server events.
*/
public class WorldGuardServerListener implements Listener {
@ -24,6 +24,7 @@ public class WorldGuardServerListener implements Listener {
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
// Legacy god mode
if (event.getPlugin().getDescription().getName().equalsIgnoreCase("CommandBook")) {
plugin.getGlobalStateManager().updateCommandBookGodMode();
}
@ -31,6 +32,7 @@ public class WorldGuardServerListener implements Listener {
@EventHandler
public void onPluginDisable(PluginDisableEvent event) {
// Legacy god mode
if (event.getPlugin().getDescription().getName().equalsIgnoreCase("CommandBook")) {
plugin.getGlobalStateManager().updateCommandBookGodMode();
}

View File

@ -16,6 +16,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.event.vehicle.VehicleMoveEvent;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.bukkit.FlagStateManager.PlayerFlagState;
@ -24,22 +25,17 @@ import com.sk89q.worldguard.protection.flags.DefaultFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
/**
* Listener for vehicle events.
*/
public class WorldGuardVehicleListener implements Listener {
private WorldGuardPlugin plugin;
/**
* Construct the object;
*
* @param plugin
*/
public WorldGuardVehicleListener(WorldGuardPlugin plugin) {
this.plugin = plugin;
}
/**
* Register events.
*/
public void registerEvents() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@ -50,12 +46,14 @@ public class WorldGuardVehicleListener implements Listener {
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);
// Regions
if (wcfg.useRegions) {
Vector pt = toVector(vehicle.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().get(world);
@ -82,6 +80,7 @@ public class WorldGuardVehicleListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
// Regions
// unfortunate code duplication
if (wcfg.useRegions) {
// Did we move a block?

View File

@ -27,23 +27,21 @@ import org.bukkit.event.Listener;
import org.bukkit.event.weather.LightningStrikeEvent;
import org.bukkit.event.weather.ThunderChangeEvent;
import org.bukkit.event.weather.WeatherChangeEvent;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
/**
* Listener for weather events.
*/
public class WorldGuardWeatherListener implements Listener {
/**
* Plugin.
*/
private WorldGuardPlugin plugin;
/**
* Construct the object;
*
* @param plugin The plugin instance
*/
public WorldGuardWeatherListener(WorldGuardPlugin plugin) {
this.plugin = plugin;
}
@ -57,14 +55,12 @@ public class WorldGuardWeatherListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getWorld());
if (event.toWeatherState()) {
if (wcfg.disableWeather) {
event.setCancelled(true);
}
} else {
if (!wcfg.disableWeather && wcfg.alwaysRaining) {
event.setCancelled(true);
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.WEATHER_TRANSITION);
BukkitContext context = new BukkitContext(event);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@ -73,30 +69,23 @@ public class WorldGuardWeatherListener implements Listener {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getWorld());
if (event.toThunderState()) {
if (wcfg.disableThunder) {
event.setCancelled(true);
}
} else {
if (!wcfg.disableWeather && wcfg.alwaysThundering) {
event.setCancelled(true);
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.WEATHER_TRANSITION);
BukkitContext context = new BukkitContext(event);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onLightningStrike(LightningStrikeEvent event) {
Location loc = event.getLightning().getLocation();
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getWorld());
if (wcfg.disallowedLightningBlocks.size() > 0) {
int targetId = event.getLightning().getLocation().getBlock().getTypeId();
if (wcfg.disallowedLightningBlocks.contains(targetId)) {
event.setCancelled(true);
}
}
Location loc = event.getLightning().getLocation();
// Regions
if (wcfg.useRegions) {
Vector pt = toVector(loc);
RegionManager mgr = plugin.getGlobalRegionManager().get(loc.getWorld());
@ -106,5 +95,14 @@ public class WorldGuardWeatherListener implements Listener {
event.setCancelled(true);
}
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.WEATHER_PHENOMENON);
BukkitContext context = new BukkitContext(event);
context.setTargetBlock(loc.getBlock().getState());
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
}

View File

@ -5,79 +5,63 @@
*/
package com.sk89q.worldguard.bukkit;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldSaveEvent;
import org.bukkit.event.world.WorldUnloadEvent;
import com.sk89q.rulelists.KnownAttachment;
import com.sk89q.rulelists.RuleSet;
/**
* Listener for world events.
*/
public class WorldGuardWorldListener implements Listener {
private WorldGuardPlugin plugin;
/**
* Construct the object;
*
* @param plugin The plugin instance
*/
public WorldGuardWorldListener(WorldGuardPlugin plugin) {
this.plugin = plugin;
}
/**
* Register events.
*/
public void registerEvents() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler
public void onChunkLoad(ChunkLoadEvent event) {
public void onWorldLoad(WorldLoadEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getWorld());
if (cfg.activityHaltToggle) {
int removed = 0;
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.WORLD_LOAD);
BukkitContext context = new BukkitContext(event);
rules.process(context);
}
for (Entity entity : event.getChunk().getEntities()) {
if (BukkitUtil.isIntensiveEntity(entity)) {
entity.remove();
removed++;
}
}
@EventHandler
public void onWorldLoad(WorldUnloadEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(event.getWorld());
if (removed > 50) {
plugin.getLogger().info("Halt-Act: " + removed + " entities (>50) auto-removed from "
+ event.getChunk().toString());
}
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.WORLD_UNLOAD);
BukkitContext context = new BukkitContext(event);
if (rules.process(context)) {
event.setCancelled(true);
return;
}
}
@EventHandler
public void onWorldLoad(WorldLoadEvent event) {
initWorld(event.getWorld());
}
/**
* Initialize the settings for the specified world
* @see WorldConfiguration#alwaysRaining
* @see WorldConfiguration#disableWeather
* @see WorldConfiguration#alwaysThundering
* @see WorldConfiguration#disableThunder
* @param world The specified world
*/
public void initWorld(World world) {
public void onWorldSave(WorldSaveEvent event) {
ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
if (wcfg.alwaysRaining && !wcfg.disableWeather) {
world.setStorm(true);
} else if (wcfg.disableWeather && !wcfg.alwaysRaining) {
world.setStorm(false);
}
if (wcfg.alwaysThundering && !wcfg.disableThunder) {
world.setThundering(true);
} else if (wcfg.disableThunder && !wcfg.alwaysThundering) {
world.setStorm(false);
}
WorldConfiguration wcfg = cfg.get(event.getWorld());
// RuleLists
RuleSet rules = wcfg.getRuleList().get(KnownAttachment.WORLD_SAVE);
BukkitContext context = new BukkitContext(event);
rules.process(context);
}
}

View File

@ -22,15 +22,11 @@ package com.sk89q.worldguard.bukkit.commands;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.worldguard.bukkit.BukkitUtil;
import com.sk89q.worldguard.bukkit.ConfigurationManager;
import com.sk89q.worldguard.bukkit.LagStopMode;
import com.sk89q.worldguard.bukkit.WorldConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
@ -45,15 +41,15 @@ public class ToggleCommands {
desc = "Disables all fire spread temporarily", max = 1)
@CommandPermissions({"worldguard.fire-toggle.stop"})
public void stopFire(CommandContext args, CommandSender sender) throws CommandException {
World world;
if (args.argsLength() == 0) {
world = plugin.checkPlayer(sender).getWorld();
} else {
world = plugin.matchWorld(sender, args.getString(0));
}
WorldConfiguration wcfg = plugin.getGlobalStateManager().get(world);
if (!wcfg.fireSpreadDisableToggle) {
@ -74,15 +70,14 @@ public class ToggleCommands {
desc = "Allows all fire spread temporarily", max = 1)
@CommandPermissions({"worldguard.fire-toggle.stop"})
public void allowFire(CommandContext args, CommandSender sender) throws CommandException {
World world;
if (args.argsLength() == 0) {
world = plugin.checkPlayer(sender).getWorld();
} else {
world = plugin.matchWorld(sender, args.getString(0));
}
WorldConfiguration wcfg = plugin.getGlobalStateManager().get(world);
if (wcfg.fireSpreadDisableToggle) {
@ -98,48 +93,20 @@ public class ToggleCommands {
}
@Command(aliases = {"halt-activity", "stoplag", "haltactivity"},
desc = "Attempts to cease as much activity in order to stop lag", flags = "c", max = 0)
desc = "Attempts to cease as much activity in order to stop lag", flags = "cag", max = 0)
@CommandPermissions({"worldguard.halt-activity"})
public void stopLag(CommandContext args, CommandSender sender) throws CommandException {
LagStopMode lagStopper = plugin.getLagStopMode();
ConfigurationManager configManager = plugin.getGlobalStateManager();
configManager.activityHaltToggle = !args.hasFlag('c');
if (configManager.activityHaltToggle) {
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.YELLOW
+ "ALL intensive server activity halted.");
}
plugin.getServer().broadcastMessage(ChatColor.YELLOW
+ "ALL intensive server activity halted by "
+ plugin.toName(sender) + ".");
for (World world : plugin.getServer().getWorlds()) {
int removed = 0;
for (Entity entity : world.getEntities()) {
if (BukkitUtil.isIntensiveEntity(entity)) {
entity.remove();
removed++;
}
}
if (removed > 10) {
sender.sendMessage("" + removed + " entities (>10) auto-removed from "
+ world.toString());
}
}
lagStopper.setRemoveAnimals(!args.hasFlag('c'));
if (!args.hasFlag('c')) {
sender.sendMessage(ChatColor.YELLOW + "Enabling lag stop mode...");
lagStopper.enable(!args.hasFlag('g'));
} else {
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.YELLOW
+ "ALL intensive server activity no longer halted.");
}
plugin.getServer().broadcastMessage(ChatColor.YELLOW
+ "ALL intensive server activity is now allowed.");
sender.sendMessage(ChatColor.YELLOW + "Disabling lag stop mode...");
lagStopper.disable();
}
}
}

View File

@ -32,6 +32,7 @@ import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.rebar.util.MaterialDatabase;
import com.sk89q.worldguard.bukkit.LoggerToChatHandler;
import com.sk89q.worldguard.bukkit.ReportWriter;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
@ -56,18 +57,19 @@ public class WorldGuardCommands {
@Command(aliases = {"reload"}, desc = "Reload WorldGuard configuration", max = 0)
@CommandPermissions({"worldguard.reload"})
public void reload(CommandContext args, CommandSender sender) throws CommandException {
LoggerToChatHandler handler = null;
Logger minecraftLogger = null;
if (sender instanceof Player) {
handler = new LoggerToChatHandler(sender);
handler.setLevel(Level.ALL);
minecraftLogger = Logger.getLogger("Minecraft");
minecraftLogger = Logger.getLogger("");
minecraftLogger.addHandler(handler);
}
try {
MaterialDatabase.reload();
plugin.getGlobalStateManager().unload();
plugin.getGlobalRegionManager().unload();
plugin.getGlobalStateManager().load();
@ -81,15 +83,17 @@ public class WorldGuardCommands {
minecraftLogger.removeHandler(handler);
}
}
plugin.simulateWorldLoad();
}
@Command(aliases = {"report"}, desc = "Writes a report on WorldGuard", flags = "p", max = 0)
@CommandPermissions({"worldguard.report"})
public void report(CommandContext args, final CommandSender sender) throws CommandException {
File dest = new File(plugin.getDataFolder(), "report.txt");
ReportWriter report = new ReportWriter(plugin);
try {
report.write(dest);
sender.sendMessage(ChatColor.YELLOW + "WorldGuard report written to "
@ -97,18 +101,20 @@ public class WorldGuardCommands {
} catch (IOException e) {
throw new CommandException("Failed to write report: " + e.getMessage());
}
if (args.hasFlag('p')) {
plugin.checkPermission(sender, "worldguard.report.pastebin");
sender.sendMessage(ChatColor.YELLOW + "Now uploading to Pastebin...");
PastebinPoster.paste(report.toString(), new PasteCallback() {
@Override
public void handleSuccess(String url) {
// Hope we don't have a thread safety issue here
sender.sendMessage(ChatColor.YELLOW + "WorldGuard report (1 hour): " + url);
}
@Override
public void handleError(String err) {
// Hope we don't have a thread safety issue here
sender.sendMessage(ChatColor.YELLOW + "WorldGuard report pastebin error: " + err);

View File

@ -0,0 +1,117 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import java.util.List;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import com.sk89q.rebar.util.MaterialPattern;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.resolvers.BlockResolver;
public class BlockCriteria implements Criteria<BukkitContext> {
public enum Direction {
AT,
ABOVE,
BELOW,
AROUND
}
private final BlockResolver resolver;
private Direction direction;
private MaterialPattern[] patterns = new MaterialPattern[0];
public BlockCriteria(BlockResolver resolver) {
this.resolver = resolver;
}
public MaterialPattern[] getPatterns() {
return patterns;
}
public void setPatterns(MaterialPattern[] patterns) {
this.patterns = patterns;
}
public void setPatterns(List<MaterialPattern> patterns) {
MaterialPattern[] arr = new MaterialPattern[patterns.size()];
patterns.toArray(arr);
this.patterns = arr;
}
public Direction getDirection() {
return direction;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
private boolean matches(BlockState block) {
for (MaterialPattern pattern : patterns) {
if (pattern.matches(block.getTypeId(), block.getRawData())) {
return true;
}
}
return false;
}
private boolean matches(Block block) {
for (MaterialPattern pattern : patterns) {
if (pattern.matches(block.getTypeId(), block.getData())) {
return true;
}
}
return false;
}
@Override
public boolean matches(BukkitContext context) {
BlockState block = resolver.resolve(context);
if (block == null) {
return false;
}
switch (getDirection()) {
case AT:
return matches(block);
case ABOVE:
return matches(block.getBlock().getRelative(0, 1, 0));
case BELOW:
return matches(block.getBlock().getRelative(0, -1, 0));
case AROUND:
return matches(block.getBlock().getRelative(0, -1, 0)) ||
matches(block.getBlock().getRelative(0, 1, 0)) ||
matches(block.getBlock().getRelative(-1, 0, 0)) ||
matches(block.getBlock().getRelative(1, 0, 0)) ||
matches(block.getBlock().getRelative(0, 0, -1)) ||
matches(block.getBlock().getRelative(0, 0, 1));
}
return false;
}
}

View File

@ -0,0 +1,74 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.List;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.LoaderBuilderException;
import com.sk89q.rebar.config.types.EnumLoaderBuilder;
import com.sk89q.rebar.config.types.MaterialPatternLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rebar.util.MaterialPattern;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.definitions.BlockCriteria.Direction;
import com.sk89q.worldguard.bukkit.resolvers.BlockResolver;
public class BlockCriteriaLoader extends AbstractNodeLoader<BlockCriteria> {
private final RuleListsManager manager;
private MaterialPatternLoaderBuilder materialLoader = new MaterialPatternLoaderBuilder();
private EnumLoaderBuilder<Direction> dirLoader = new EnumLoaderBuilder<Direction>(Direction.class);
public BlockCriteriaLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public BlockCriteria read(ConfigurationNode node)
throws DefinitionException {
BlockResolver resolver = manager.getResolvers()
.get(BlockResolver.class, node.getString("block", "target"));
// Load patterns
List<MaterialPattern> patterns = node.contains(INLINE) ?
node.listOf(INLINE, materialLoader) : node.listOf("material", materialLoader);
if (patterns.size() == 0) {
throw new LoaderBuilderException("No block materials specified");
}
// Load direction
Direction direction = node.getOf("relative", dirLoader, Direction.AT);
BlockCriteria criteria = new BlockCriteria(resolver);
criteria.setPatterns(patterns);
criteria.setDirection(direction);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"block", "material", "relative");
return criteria;
}
}

View File

@ -0,0 +1,31 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rulelists.Action;
import com.sk89q.rulelists.Context;
public class CancelAction implements Action<Context> {
@Override
public void apply(Context context) {
context.cancel();
}
}

View File

@ -0,0 +1,39 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class CancelActionLoader extends AbstractNodeLoader<CancelAction> {
private final CancelAction instance = new CancelAction();
@Override
public CancelAction read(ConfigurationNode node)
throws DefinitionException {
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()));
return instance;
}
}

View File

@ -0,0 +1,58 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.event.Event;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class DamageCriteria implements Criteria<BukkitContext> {
private Set<DamageCause> causes = new HashSet<DamageCause>();
public DamageCriteria(Set<DamageCause> causes) {
this.causes = causes;
}
public Set<DamageCause> getCauses() {
return causes;
}
public void setCauses(Set<DamageCause> causes) {
this.causes = causes;
}
@Override
public boolean matches(BukkitContext context) {
Event event = context.getEvent();
if (event instanceof EntityDamageEvent) {
return causes.contains(((EntityDamageEvent) event).getCause());
} else {
return false;
}
}
}

View File

@ -0,0 +1,53 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.Set;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.types.EnumLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class DamageCriteriaLoader extends AbstractNodeLoader<DamageCriteria> {
private EnumLoaderBuilder<DamageCause> typeLoader =
new EnumLoaderBuilder<DamageCause>(DamageCause.class);
@Override
public DamageCriteria read(ConfigurationNode node) throws DefinitionException {
Set<DamageCause> types = node.contains(INLINE) ?
node.setOf(INLINE, typeLoader) :
node.setOf("type", typeLoader);
DamageCriteria criteria = new DamageCriteria(types);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"type");
return criteria;
}
}

View File

@ -0,0 +1,119 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Tameable;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockIgniteEvent.IgniteCause;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.BukkitUtil;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.SourceEntityResolver;
public class EntityCriteria implements Criteria<BukkitContext> {
private final EntityResolver entityResolver;
private Set<EntityType> types = new HashSet<EntityType>();
private Class<?>[] ofTypes = new Class<?>[0];
private Boolean isTamed = null;
// Counteract 1.3->1.4 breaking change
private EntityType fireballType =
BukkitUtil.tryEnum(EntityType.class, "FIREBALL", "LARGE_FIREBALL");
public EntityCriteria(EntityResolver entityResolver) {
this.entityResolver = entityResolver;
}
public Class<?>[] getOfTypes() {
return ofTypes;
}
public void setOfTypes(Class<?>[] ofTypes) {
this.ofTypes = ofTypes;
}
public Set<EntityType> getTypes() {
return types;
}
public void setTypes(Set<EntityType> types) {
this.types = types;
}
public Boolean getIsTamed() {
return isTamed;
}
public void setIsTamed(Boolean isTamed) {
this.isTamed = isTamed;
}
@Override
public boolean matches(BukkitContext context) {
Entity entity = entityResolver.resolve(context);
// Hack because BlockIgniteEvent doesn't give an entity
if (context.getEvent() instanceof BlockIgniteEvent && entityResolver instanceof SourceEntityResolver) {
BlockIgniteEvent igniteEvent = (BlockIgniteEvent) context.getEvent();
if (igniteEvent.getCause() == IgniteCause.FIREBALL) {
if (types.contains(fireballType)) {
return true;
}
}
if (igniteEvent.getCause() == IgniteCause.LIGHTNING) {
if (types.contains(EntityType.LIGHTNING)) {
return true;
}
}
}
if (entity == null) {
return false;
}
if (ofTypes.length != 0) {
Class<?> cls = entity.getClass();
for (Class<?> type : ofTypes) {
if (type.isAssignableFrom(cls)) {
return true;
}
}
}
if (isTamed != null) {
if (entity instanceof Tameable && ((Tameable) entity).isTamed() == isTamed) {
return true;
}
}
return types.size() == 0 || types.contains(entity.getType());
}
}

View File

@ -0,0 +1,91 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.entity.Animals;
import org.bukkit.entity.Creature;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.types.EnumLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class EntityCriteriaLoader extends AbstractNodeLoader<EntityCriteria> {
private final RuleListsManager manager;
private EnumLoaderBuilder<EntityType> typeLoader =
new EnumLoaderBuilder<EntityType>(EntityType.class);
public EntityCriteriaLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public EntityCriteria read(ConfigurationNode node) throws DefinitionException {
EntityResolver entityResolver = manager.getResolvers()
.get(EntityResolver.class, node.getString("entity", "source"));
Set<EntityType> types = node.contains(INLINE) ?
node.setOf(INLINE, typeLoader) :
node.setOf("type", typeLoader);
EntityCriteria criteria = new EntityCriteria(entityResolver);
List<Class<?>> ofTypes = new ArrayList<Class<?>>();
if (node.getBoolean("is-animal", false))
ofTypes.add(Animals.class);
if (node.getBoolean("is-monster", false))
ofTypes.add(Monster.class);
if (node.getBoolean("is-creature", false))
ofTypes.add(Creature.class);
if (node.getBoolean("is-living", false))
ofTypes.add(LivingEntity.class);
if (node.getBoolean("is-player", false))
ofTypes.add(Player.class);
if (node.getBoolean("is-tameable", false))
ofTypes.add(Tameable.class);
criteria.setTypes(types);
criteria.setOfTypes(ofTypes.toArray(new Class<?>[ofTypes.size()]));
criteria.setIsTamed(node.getBoolean("is-tamed"));
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"entity", "type", "is-animal", "is-monster", "is-creature",
"is-living", "is-player", "is-tameable", "is-tamed");
return criteria;
}
}

View File

@ -0,0 +1,93 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import java.util.List;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.ItemStack;
import com.sk89q.rebar.util.MaterialPattern;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.ItemStackSlotResolver;
public class ItemCriteria implements Criteria<BukkitContext> {
private final EntityResolver entityResolver;
private final ItemStackSlotResolver itemResolver;
private MaterialPattern[] patterns = new MaterialPattern[0];
private Boolean hasData = false;
public ItemCriteria(EntityResolver entityResolver, ItemStackSlotResolver itemResolver) {
this.entityResolver = entityResolver;
this.itemResolver = itemResolver;
}
public Boolean hasDataCheck() {
return hasData;
}
public void setDataCheck(Boolean hasData) {
this.hasData = hasData;
}
public MaterialPattern[] getPatterns() {
return patterns;
}
public void setPatterns(MaterialPattern[] patterns) {
this.patterns = patterns;
}
public void setPatterns(List<MaterialPattern> patterns) {
MaterialPattern[] arr = new MaterialPattern[patterns.size()];
patterns.toArray(arr);
this.patterns = arr;
}
@Override
public boolean matches(BukkitContext context) {
Entity entity = entityResolver.resolve(context);
if (entity == null) {
return false;
}
ItemStack item = itemResolver.resolve(entity).get();
if (item == null) {
return false;
}
if (hasData != null && hasData == (item.getDurability() != 0)) {
return true;
}
for (MaterialPattern pattern : patterns) {
if (pattern.matches(item.getTypeId(), item.getDurability())) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,77 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.List;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.LoaderBuilderException;
import com.sk89q.rebar.config.types.MaterialPatternLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rebar.util.MaterialPattern;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.ItemStackSlotResolver;
public class ItemCriteriaLoader extends AbstractNodeLoader<ItemCriteria> {
private final RuleListsManager manager;
private MaterialPatternLoaderBuilder materialLoader = new MaterialPatternLoaderBuilder();
public ItemCriteriaLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public ItemCriteria read(ConfigurationNode node) throws DefinitionException {
ItemStackSlotResolver resolver = manager.getResolvers()
.get(ItemStackSlotResolver.class, node.getString("item", ItemStackSlotResolver.DEFAULT));
EntityResolver entityResolver = manager.getResolvers()
.get(EntityResolver.class, node.getString("entity", EntityResolver.DEFAULT));
// has-data
Boolean hasData = null;
if (node.contains("has-data")) {
hasData = node.getBoolean("has-data", false);
}
// Patterns
List<MaterialPattern> patterns = node.contains(INLINE) ? node.listOf(INLINE,
materialLoader) : node.listOf("material", materialLoader);
if (patterns.size() == 0 && hasData == null) {
throw new LoaderBuilderException("No block materials specified");
}
ItemCriteria criteria = new ItemCriteria(entityResolver, resolver);
criteria.setPatterns(patterns);
criteria.setDataCheck(hasData);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"item", "entity", "has-data", "material");
return criteria;
}
}

View File

@ -0,0 +1,63 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class PermissionCriteria implements Criteria<BukkitContext> {
private final WorldGuardPlugin wg;
private final EntityResolver entityResolver;
private String permission;
public PermissionCriteria(WorldGuardPlugin wg, EntityResolver entityResolver) {
this.wg = wg;
this.entityResolver = entityResolver;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
@Override
public boolean matches(BukkitContext context) {
Entity entity = entityResolver.resolve(context);
if (entity == null) {
return false;
}
if (entity instanceof Player) {
return wg.hasPermission((Player) entity, permission);
}
return false;
}
}

View File

@ -0,0 +1,60 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class PermissionCriteriaLoader extends AbstractNodeLoader<PermissionCriteria> {
private final WorldGuardPlugin wg;
private final RuleListsManager manager;
public PermissionCriteriaLoader(WorldGuardPlugin wg, RuleListsManager manager) {
this.wg = wg;
this.manager = manager;
}
@Override
public PermissionCriteria read(ConfigurationNode node) throws DefinitionException {
EntityResolver entityResolver = manager.getResolvers()
.get(EntityResolver.class, node.getString("entity", "source"));
String permission = node.contains(INLINE) ?
node.getString(INLINE, "") :
node.getString("permission", "");
PermissionCriteria criteria = new PermissionCriteria(wg, entityResolver);
criteria.setPermission(permission);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"entity", "permission");
return criteria;
}
}

View File

@ -0,0 +1,53 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.event.Event;
import org.bukkit.event.weather.LightningStrikeEvent;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class PhenomenonCriteria implements Criteria<BukkitContext> {
private Boolean isLightning = null;
public PhenomenonCriteria(Boolean isLightning) {
}
public Boolean getIsLightning() {
return isLightning;
}
public void setIsLightning(Boolean isLightning) {
this.isLightning = isLightning;
}
@Override
public boolean matches(BukkitContext context) {
Event event = context.getEvent();
if (isLightning != null && isLightning && event instanceof LightningStrikeEvent) {
return true;
} else {
return isLightning == null;
}
}
}

View File

@ -0,0 +1,55 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.Set;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.types.EnumLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class PhenomenonCriteriaLoader extends AbstractNodeLoader<PhenomenonCriteria> {
public enum Phenomenon {
LIGHTNING;
}
private EnumLoaderBuilder<Phenomenon> typeLoader =
new EnumLoaderBuilder<Phenomenon>(Phenomenon.class);
@Override
public PhenomenonCriteria read(ConfigurationNode node) throws DefinitionException {
Set<Phenomenon> types = node.contains(INLINE) ?
node.setOf(INLINE, typeLoader) :
node.setOf("type", typeLoader);
PhenomenonCriteria criteria = new PhenomenonCriteria(types.contains(Phenomenon.LIGHTNING));
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"type");
return criteria;
}
}

View File

@ -0,0 +1,65 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.block.BlockState;
import org.bukkit.event.Event;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import com.sk89q.rebar.util.MaterialPattern;
import com.sk89q.rulelists.Action;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.resolvers.BlockResolver;
public class SetBlockAction implements Action<BukkitContext> {
private final BlockResolver blockResolver;
private MaterialPattern material;
public SetBlockAction(BlockResolver blockResolver) {
this.blockResolver = blockResolver;
}
public MaterialPattern getMaterial() {
return material;
}
public void setMaterial(MaterialPattern material) {
this.material = material;
}
@Override
public void apply(BukkitContext context) {
BlockState state = blockResolver.resolve(context);
Event event = context.getEvent();
if (state == null) {
return;
}
state.setTypeId(material.getMaterial());
state.setRawData((byte) material.getDefaultData());
if (!(event instanceof BlockPlaceEvent || event instanceof BlockBreakEvent)) {
state.update();
}
}
}

View File

@ -0,0 +1,64 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.LoaderBuilderException;
import com.sk89q.rebar.config.types.MaterialPatternLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rebar.util.MaterialPattern;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.resolvers.BlockResolver;
public class SetBlockActionLoader extends AbstractNodeLoader<SetBlockAction> {
private final RuleListsManager manager;
private MaterialPatternLoaderBuilder materialLoader = new MaterialPatternLoaderBuilder();
public SetBlockActionLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public SetBlockAction read(ConfigurationNode node) throws DefinitionException {
BlockResolver resolver = manager.getResolvers()
.get(BlockResolver.class, node.getString("block", "target"));
// Load patterns
MaterialPattern material = node.contains(INLINE) ?
node.getOf(INLINE, materialLoader) : node.getOf("material", materialLoader);
if (material == null) {
throw new LoaderBuilderException("One block material must be specified");
}
SetBlockAction criteria = new SetBlockAction(resolver);
criteria.setMaterial(material);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"block", "material");
return criteria;
}
}

View File

@ -0,0 +1,53 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.event.Event;
import org.bukkit.event.entity.PlayerDeathEvent;
import com.sk89q.rulelists.Action;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class SetDropAction implements Action<BukkitContext> {
private Integer exp;
public Integer getExp() {
return exp;
}
public void setExp(Integer exp) {
this.exp = exp;
}
@Override
public void apply(BukkitContext context) {
Event event = context.getEvent();
if (event instanceof PlayerDeathEvent) {
PlayerDeathEvent deathEvent = (PlayerDeathEvent) event;
if (exp != null) {
deathEvent.setDroppedExp(exp);
}
}
}
}

View File

@ -0,0 +1,41 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class SetDropActionLoader extends AbstractNodeLoader<SetDropAction> {
@Override
public SetDropAction read(ConfigurationNode node) throws DefinitionException {
SetDropAction criteria = new SetDropAction();
criteria.setExp(node.getInt("set-xp"));
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"set-xp");
return criteria;
}
}

View File

@ -0,0 +1,61 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rulelists.Action;
import com.sk89q.rulelists.ExpressionParser;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class SetMessageAction implements Action<BukkitContext> {
private ExpressionParser parser;
private String message;
public SetMessageAction(String message) {
this.message = message;
}
public ExpressionParser getParser() {
return parser;
}
public void setParser(ExpressionParser parser) {
this.parser = parser;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void apply(BukkitContext context) {
String newMessage = message;
if (parser != null) {
newMessage = parser.format(context, newMessage);
}
context.setMessage(newMessage);
}
}

View File

@ -0,0 +1,58 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.LoaderBuilderException;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
public class SetMessageActionLoader extends AbstractNodeLoader<SetMessageAction> {
private final RuleListsManager manager;
public SetMessageActionLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public SetMessageAction read(ConfigurationNode node) throws DefinitionException {
String message = node.contains(INLINE) ?
node.getString(INLINE) :
node.getString("message");
if (message == null) {
throw new LoaderBuilderException("No message specified");
}
SetMessageAction action = new SetMessageAction(message);
action.setParser(manager.getParser());
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"message");
return action;
}
}

View File

@ -0,0 +1,58 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.event.Event;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class SpawnCriteria implements Criteria<BukkitContext> {
private Set<SpawnReason> causes = new HashSet<SpawnReason>();
public SpawnCriteria(Set<SpawnReason> causes) {
this.causes = causes;
}
public Set<SpawnReason> getCauses() {
return causes;
}
public void setCauses(Set<SpawnReason> causes) {
this.causes = causes;
}
@Override
public boolean matches(BukkitContext context) {
Event event = context.getEvent();
if (event instanceof CreatureSpawnEvent) {
return causes.contains(((CreatureSpawnEvent) event).getSpawnReason());
} else {
return false;
}
}
}

View File

@ -0,0 +1,53 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.Set;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.types.EnumLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class SpawnCriteriaLoader extends AbstractNodeLoader<SpawnCriteria> {
private EnumLoaderBuilder<SpawnReason> typeLoader =
new EnumLoaderBuilder<SpawnReason>(SpawnReason.class);
@Override
public SpawnCriteria read(ConfigurationNode node) throws DefinitionException {
Set<SpawnReason> types = node.contains(INLINE) ?
node.setOf(INLINE, typeLoader) :
node.setOf("type", typeLoader);
SpawnCriteria criteria = new SpawnCriteria(types);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"type");
return criteria;
}
}

View File

@ -0,0 +1,68 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import com.sk89q.rulelists.Action;
import com.sk89q.rulelists.ExpressionParser;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class TellAction implements Action<BukkitContext> {
private ExpressionParser parser;
private EntityResolver entityResolver;
private String message;
public TellAction(EntityResolver entityResolver, String message) {
this.entityResolver = entityResolver;
this.message = message;
}
public ExpressionParser getParser() {
return parser;
}
public void setParser(ExpressionParser parser) {
this.parser = parser;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void apply(BukkitContext context) {
Entity sender = entityResolver.resolve(context);
if (sender != null && sender instanceof CommandSender) {
if (parser != null) {
message = parser.format(context, message);
}
((CommandSender) sender).sendMessage(message);
}
}
}

View File

@ -0,0 +1,55 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class TellActionLoader extends AbstractNodeLoader<TellAction> {
private final RuleListsManager manager;
public TellActionLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public TellAction read(ConfigurationNode node) throws DefinitionException {
EntityResolver entityResolver = manager.getResolvers()
.get(EntityResolver.class, node.getString("entity", "source"));
String message = node.contains(INLINE) ? node.getString(INLINE) : node.getString("message");
TellAction action = new TellAction(entityResolver, message);
action.setParser(manager.getParser());
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"message");
return action;
}
}

View File

@ -0,0 +1,344 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import com.sk89q.rulelists.Action;
import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.ConfigurationManager;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class UpdateEntityAction implements Action<BukkitContext> {
private final WorldGuardPlugin wg;
private final EntityResolver entityResolver;
private Boolean explode;
private Float fallDistance;
private Integer fireTicks;
private Integer health;
private Integer damage;
private Integer remainingAir;
private Integer foodLevel;
private Float exhaustionLevel;
private Float saturationLevel;
private Float walkSpeed;
private Boolean allowFlight;
private Boolean flying;
private Float flySpeed;
private Boolean sneaking;
private Boolean sprinting;
private Boolean invincible;
private Boolean openWorkbench;
private String performCommand;
private Boolean teleportSafely;
public UpdateEntityAction(WorldGuardPlugin wg, EntityResolver entityResolver) {
this.wg = wg;
this.entityResolver = entityResolver;
}
public Boolean getExplode() {
return explode;
}
public void setExplode(Boolean explode) {
this.explode = explode;
}
public Float getFallDistance() {
return fallDistance;
}
public void setFallDistance(Float fallDistance) {
this.fallDistance = fallDistance;
}
public Integer getFireTicks() {
return fireTicks;
}
public void setFireTicks(Integer fireTicks) {
this.fireTicks = fireTicks;
}
public Integer getHealth() {
return health;
}
public void setHealth(Integer health) {
this.health = health;
}
public Integer getDamage() {
return damage;
}
public void setDamage(Integer damage) {
this.damage = damage;
}
public Integer getRemainingAir() {
return remainingAir;
}
public void setRemainingAir(Integer remainingAir) {
this.remainingAir = remainingAir;
}
public Integer getFoodLevel() {
return foodLevel;
}
public void setFoodLevel(Integer foodLevel) {
this.foodLevel = foodLevel;
}
public Float getExhaustionLevel() {
return exhaustionLevel;
}
public void setExhaustionLevel(Float exhaustionLevel) {
this.exhaustionLevel = exhaustionLevel;
}
public Float getSaturationLevel() {
return saturationLevel;
}
public void setSaturationLevel(Float saturationLevel) {
this.saturationLevel = saturationLevel;
}
public Float getWalkSpeed() {
return walkSpeed;
}
public void setWalkSpeed(Float walkSpeed) {
this.walkSpeed = walkSpeed;
}
public Boolean getAllowFlight() {
return allowFlight;
}
public void setAllowFlight(Boolean allowFlight) {
this.allowFlight = allowFlight;
}
public Boolean getFlying() {
return flying;
}
public void setFlying(Boolean flying) {
this.flying = flying;
}
public Float getFlySpeed() {
return flySpeed;
}
public void setFlySpeed(Float flySpeed) {
this.flySpeed = flySpeed;
}
public Boolean getSneaking() {
return sneaking;
}
public void setSneaking(Boolean sneaking) {
this.sneaking = sneaking;
}
public Boolean getSprinting() {
return sprinting;
}
public void setSprinting(Boolean sprinting) {
this.sprinting = sprinting;
}
public Boolean getInvincible() {
return invincible;
}
public void setInvincible(Boolean invincible) {
this.invincible = invincible;
}
public Boolean getOpenWorkbench() {
return openWorkbench;
}
public void setOpenWorkbench(Boolean openWorkbench) {
this.openWorkbench = openWorkbench;
}
public String getPerformCommand() {
return performCommand;
}
public void setPerformCommand(String performCommand) {
this.performCommand = performCommand;
}
public Boolean getTeleportSafely() {
return teleportSafely;
}
public void setTeleportSafely(Boolean teleportSafely) {
this.teleportSafely = teleportSafely;
}
@SuppressWarnings("deprecation")
@Override
public void apply(BukkitContext context) {
Entity entity = entityResolver.resolve(context);
if (explode != null)
entity.getWorld().createExplosion(null, 4);
if (fireTicks != null)
entity.setFireTicks(fireTicks);
if (fallDistance != null)
entity.setFallDistance(fallDistance);
if (entity instanceof LivingEntity) {
LivingEntity living = (LivingEntity) entity;
if (health != null)
living.setHealth(health);
if (damage != null)
living.damage(damage);
if (remainingAir != null)
living.setRemainingAir(remainingAir);
}
if (entity instanceof Player) {
Player player = (Player) entity;
if (foodLevel != null)
player.setFoodLevel(foodLevel);
if (saturationLevel != null)
player.setSaturation(saturationLevel);
if (exhaustionLevel != null)
player.setExhaustion(exhaustionLevel);
if (walkSpeed != null)
player.setWalkSpeed(walkSpeed);
if (allowFlight != null)
player.setAllowFlight(allowFlight);
if (flying != null)
player.setFlying(flying);
if (flySpeed != null)
player.setFlySpeed(flySpeed);
if (sneaking != null)
player.setSneaking(sneaking);
if (sprinting != null)
player.setSneaking(sprinting);
if (invincible != null) {
ConfigurationManager cfg = wg.getGlobalStateManager();
if (invincible) {
cfg.enableGodMode(player);
} else {
cfg.disableGodMode(player);
}
}
if (openWorkbench != null && openWorkbench)
player.openWorkbench(player.getLocation(), true);
if (performCommand != null)
player.performCommand(performCommand);
}
if (teleportSafely != null && teleportSafely) {
Location loc = entity.getLocation();
World world = loc.getWorld();
// In case we're in void!
if (loc.getY() < 1) {
loc.setY(1);
}
int maxY = world.getMaxHeight();
int x = loc.getBlockX();
int y = Math.max(0, loc.getBlockY());
int z = loc.getBlockZ();
byte free = 0;
loop:
while (y <= maxY + 2) {
if (BlockType.canPassThrough(new Location(world, x, y, z).getBlock().getTypeId())) {
++free;
} else {
free = 0;
}
if (free == 2) {
Block block = world.getBlockAt(x, y - 2, z);
int id = block.getTypeId();
int data = block.getData();
Location newLoc = new Location(world, x + 0.5,
y - 2 + BlockType.centralTopLimit(id, data), z + 0.5);
// Don't want the player falling into void
if (newLoc.getBlockY() <= 1) {
Block bottomBlock = world.getBlockAt(x, 0, z);
bottomBlock.setType(Material.GLASS);
newLoc.add(0, 1, 0);
}
entity.teleport(newLoc);
entity.setFallDistance(0);
break loop;
}
++y;
}
}
}
}

View File

@ -0,0 +1,81 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
public class UpdateEntityActionLoader extends AbstractNodeLoader<UpdateEntityAction> {
private final WorldGuardPlugin wg;
private final RuleListsManager manager;
public UpdateEntityActionLoader(WorldGuardPlugin wg, RuleListsManager manager) {
this.wg = wg;
this.manager = manager;
}
@Override
public UpdateEntityAction read(ConfigurationNode node) throws DefinitionException {
EntityResolver entityResolver = manager.getResolvers()
.get(EntityResolver.class, node.getString("entity", "source"));
UpdateEntityAction criteria = new UpdateEntityAction(wg, entityResolver);
criteria.setExplode(node.getBoolean("explode"));
criteria.setFallDistance(node.getFloat("set-fall-distance"));
criteria.setFireTicks(node.getInt("set-fire-ticks"));
criteria.setTeleportSafely(node.getBoolean("teleport-safely"));
criteria.setHealth(node.getInt("set-health"));
criteria.setDamage(node.getInt("damage"));
criteria.setRemainingAir(node.getInt("set-air"));
criteria.setFoodLevel(node.getInt("food-level"));
criteria.setSaturationLevel(node.getFloat("set-saturation"));
criteria.setExhaustionLevel(node.getFloat("set-exhaustion"));
criteria.setWalkSpeed(node.getFloat("set-walk-speed"));
criteria.setAllowFlight(node.getBoolean("set-allow-flight"));
criteria.setFlying(node.getBoolean("set-flying"));
criteria.setFlySpeed(node.getFloat("set-fly-speed"));
criteria.setSneaking(node.getBoolean("set-sneaking"));
criteria.setSprinting(node.getBoolean("set-sprinting"));
criteria.setInvincible(node.getBoolean("set-invincible"));
criteria.setOpenWorkbench(node.getBoolean("open-workbench"));
criteria.setPerformCommand(node.getString("perform-command"));
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"entity", "explode", "set-fall-distance",
"set-fire-ticks", "set-health", "damage", "set-air",
"food-level", "set-saturation", "set-exhaustion",
"set-walk-speed", "set-allow-flight", "set-flying",
"set-fly-speed", "set-sneaking", "set-sprinting",
"set-invincible", "open-workbench", "perform-command",
"teleport-safely");
return criteria;
}
}

View File

@ -0,0 +1,83 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.ItemStack;
import com.sk89q.rulelists.Action;
import com.sk89q.worldguard.bukkit.BukkitContext;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.ItemStackSlot;
import com.sk89q.worldguard.bukkit.resolvers.ItemStackSlotResolver;
public class UpdateItemAction implements Action<BukkitContext> {
private final EntityResolver entityResolver;
private final ItemStackSlotResolver itemResolver;
private boolean destroy = false;
private short newData = -1;
public UpdateItemAction(EntityResolver entityResolver, ItemStackSlotResolver itemResolver) {
this.entityResolver = entityResolver;
this.itemResolver = itemResolver;
}
public boolean isDestroy() {
return destroy;
}
public void setDestroy(boolean destroy) {
this.destroy = destroy;
}
public short getNewData() {
return newData;
}
public void setNewData(short newData) {
this.newData = newData;
}
@Override
public void apply(BukkitContext context) {
Entity entity = entityResolver.resolve(context);
ItemStackSlot slot = itemResolver.resolve(entity);
ItemStack item = slot.get();
boolean updated = false;
if (item == null) {
return;
}
if (destroy) {
item = null;
updated = true;
} else if (newData >= 0) {
item.setDurability(newData);
updated = true;
}
if (updated) {
slot.update(item);
}
}
}

View File

@ -0,0 +1,58 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
import com.sk89q.rulelists.RuleListsManager;
import com.sk89q.worldguard.bukkit.resolvers.EntityResolver;
import com.sk89q.worldguard.bukkit.resolvers.ItemStackSlotResolver;
public class UpdateItemActionLoader extends AbstractNodeLoader<UpdateItemAction> {
private final RuleListsManager manager;
public UpdateItemActionLoader(RuleListsManager manager) {
this.manager = manager;
}
@Override
public UpdateItemAction read(ConfigurationNode node) throws DefinitionException {
ItemStackSlotResolver resolver = manager.getResolvers()
.get(ItemStackSlotResolver.class, node.getString("item", "held"));
EntityResolver entityResolver = manager.getResolvers()
.get(EntityResolver.class, node.getString("entity", "source"));
boolean destroy = node.getBoolean("destroy", false);
short newData = (short) node.getInt("set-data", -1);
UpdateItemAction action = new UpdateItemAction(entityResolver, resolver);
action.setDestroy(destroy);
action.setNewData(newData);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"item", "entity", "destroy", "set-data");
return action;
}
}

View File

@ -0,0 +1,75 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import org.bukkit.World;
import org.bukkit.event.Event;
import org.bukkit.event.weather.WeatherChangeEvent;
import org.bukkit.event.world.WorldEvent;
import com.sk89q.rulelists.Action;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class UpdateWorldAction implements Action<BukkitContext> {
private Boolean storm = null;
private Boolean thunderstorm = null;
public UpdateWorldAction() {
}
public Boolean getStorm() {
return storm;
}
public void setStorm(Boolean storm) {
this.storm = storm;
}
public Boolean getThunderstorm() {
return thunderstorm;
}
public void setThunderstorm(Boolean thunderstorm) {
this.thunderstorm = thunderstorm;
}
@Override
public void apply(BukkitContext context) {
Event event = context.getEvent();
World world = null;
if (event instanceof WeatherChangeEvent) {
world = ((WeatherChangeEvent) event).getWorld();
} else if (event instanceof WorldEvent) {
world = ((WorldEvent) event).getWorld();
}
if (world != null) {
if (storm != null) {
world.setStorm(storm);
}
if (thunderstorm != null) {
world.setThundering(thunderstorm);
}
}
}
}

View File

@ -0,0 +1,44 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class UpdateWorldActionLoader extends AbstractNodeLoader<UpdateWorldAction> {
@Override
public UpdateWorldAction read(ConfigurationNode node) throws DefinitionException {
Boolean storm = node.getBoolean("set-storm");
Boolean thunderstorm = node.getBoolean("set-thunderstorm");
UpdateWorldAction action = new UpdateWorldAction();
action.setStorm(storm);
action.setThunderstorm(thunderstorm);
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"set-storm", "set-thunderstorm");
return action;
}
}

View File

@ -0,0 +1,80 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.event.Event;
import org.bukkit.event.weather.ThunderChangeEvent;
import org.bukkit.event.weather.WeatherChangeEvent;
import com.sk89q.rulelists.Criteria;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class WeatherCriteria implements Criteria<BukkitContext> {
public enum Type {
STORM,
THUNDERSTORM,
}
private Set<Type> causes = new HashSet<Type>();
private Boolean isStarting = null;
public WeatherCriteria(Set<Type> causes) {
this.causes = causes;
}
public Set<Type> getCauses() {
return causes;
}
public void setCauses(Set<Type> causes) {
this.causes = causes;
}
public Boolean getIsStarting() {
return isStarting;
}
public void setIsStarting(Boolean isStarting) {
this.isStarting = isStarting;
}
@Override
public boolean matches(BukkitContext context) {
Event event = context.getEvent();
boolean startVal = true;
if (isStarting != null) {
startVal = event instanceof WeatherChangeEvent &&
((WeatherChangeEvent) event).toWeatherState() == isStarting;
}
if (event instanceof WeatherChangeEvent) {
return startVal && causes.contains(Type.STORM);
} else if (event instanceof ThunderChangeEvent) {
return startVal && causes.contains(Type.THUNDERSTORM);
} else {
return startVal;
}
}
}

View File

@ -0,0 +1,52 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.definitions;
import static com.sk89q.rulelists.RuleEntryLoader.INLINE;
import java.util.Set;
import com.sk89q.rebar.config.AbstractNodeLoader;
import com.sk89q.rebar.config.ConfigurationNode;
import com.sk89q.rebar.config.types.EnumLoaderBuilder;
import com.sk89q.rebar.util.LoggerUtils;
import com.sk89q.rulelists.DefinitionException;
import com.sk89q.rulelists.RuleListUtils;
public class WeatherCriteriaLoader extends AbstractNodeLoader<WeatherCriteria> {
private EnumLoaderBuilder<WeatherCriteria.Type> typeLoader =
new EnumLoaderBuilder<WeatherCriteria.Type>(WeatherCriteria.Type.class);
@Override
public WeatherCriteria read(ConfigurationNode node) throws DefinitionException {
Set<WeatherCriteria.Type> types = node.contains(INLINE) ?
node.setOf(INLINE, typeLoader) :
node.setOf("type", typeLoader);
WeatherCriteria criteria = new WeatherCriteria(types);
criteria.setIsStarting(node.getBoolean("is-starting"));
RuleListUtils.warnUnknown(node, LoggerUtils.getLogger(getClass()),
"type", "is-starting");
return criteria;
}
}

View File

@ -0,0 +1,32 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.block.BlockState;
import com.sk89q.rulelists.Context;
import com.sk89q.rulelists.Resolver;
public interface BlockResolver extends Resolver {
public static final String DEFAULT = "target";
public BlockState resolve(Context context);
}

View File

@ -0,0 +1,31 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.entity.Entity;
import com.sk89q.rulelists.Context;
import com.sk89q.rulelists.Resolver;
public interface EntityResolver extends Resolver {
public static final String DEFAULT = "source";
public Entity resolve(Context context);
}

View File

@ -0,0 +1,44 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.inventory.ItemStack;
/**
* Indicates an item stack slot that can be updated with a new stack.
*
* @author sk89q
*/
public interface ItemStackSlot {
/**
* Get the current item stack.
*
* @return item stack, or null
*/
ItemStack get();
/**
* Update the slot with a new item stack.
*
* @param stack the new item stack
*/
void update(ItemStack stack);
}

View File

@ -0,0 +1,30 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.entity.Entity;
import com.sk89q.rulelists.Resolver;
public interface ItemStackSlotResolver extends Resolver {
public static final String DEFAULT = "held";
public ItemStackSlot resolve(Entity entity);
}

View File

@ -0,0 +1,33 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.block.BlockState;
import com.sk89q.rulelists.Context;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class PlacedBlockResolver implements BlockResolver {
@Override
public BlockState resolve(Context context) {
return ((BukkitContext) context).getPlacedBlock();
}
}

View File

@ -0,0 +1,127 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.entity.Entity;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
public class PlayerItemStackSlotResolver implements ItemStackSlotResolver {
public enum Slot {
HELD,
HELMET,
CHESTPLATE,
LEGGINGS,
BOOTS;
}
private final Slot slot;
public PlayerItemStackSlotResolver(Slot slot) {
this.slot = slot;
}
@Override
public ItemStackSlot resolve(Entity entity) {
if (entity != null && entity instanceof HumanEntity) {
final PlayerInventory inventory = ((HumanEntity) entity).getInventory();
switch (slot) {
case HELD:
final ItemStack item = nonNull(inventory.getItemInHand());
return new ItemStackSlot() {
@Override
public void update(ItemStack stack) {
inventory.setItemInHand(stack);
}
@Override
public ItemStack get() {
return item;
}
};
case HELMET:
final ItemStack helmet = nonNull(inventory.getHelmet());
return new ItemStackSlot() {
@Override
public void update(ItemStack stack) {
inventory.setHelmet(stack);
}
@Override
public ItemStack get() {
return helmet;
}
};
case CHESTPLATE:
final ItemStack chestPlate = nonNull(inventory.getChestplate());
return new ItemStackSlot() {
@Override
public void update(ItemStack stack) {
inventory.setChestplate(stack);
}
@Override
public ItemStack get() {
return chestPlate;
}
};
case LEGGINGS:
final ItemStack leggings = nonNull(inventory.getLeggings());
return new ItemStackSlot() {
@Override
public void update(ItemStack stack) {
inventory.setLeggings(stack);
}
@Override
public ItemStack get() {
return leggings;
}
};
case BOOTS:
final ItemStack boots = nonNull(inventory.getBoots());
return new ItemStackSlot() {
@Override
public void update(ItemStack stack) {
inventory.setBoots(stack);
}
@Override
public ItemStack get() {
return boots;
}
};
}
}
return null;
}
private static ItemStack nonNull(ItemStack item) {
return item == null ? new ItemStack(0) : item;
}
}

View File

@ -0,0 +1,23 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
public class SimpleMethodCaller {
}

View File

@ -0,0 +1,33 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.block.BlockState;
import com.sk89q.rulelists.Context;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class SourceBlockResolver implements BlockResolver {
@Override
public BlockState resolve(Context context) {
return ((BukkitContext) context).getSourceBlock();
}
}

View File

@ -0,0 +1,33 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.entity.Entity;
import com.sk89q.rulelists.Context;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class SourceEntityResolver implements EntityResolver {
@Override
public Entity resolve(Context context) {
return ((BukkitContext) context).getSourceEntity();
}
}

View File

@ -0,0 +1,33 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.block.BlockState;
import com.sk89q.rulelists.Context;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class TargetBlockResolver implements BlockResolver {
@Override
public BlockState resolve(Context context) {
return ((BukkitContext) context).getTargetBlock();
}
}

View File

@ -0,0 +1,33 @@
// $Id$
/*
* This file is a part of WorldGuard.
* Copyright (c) sk89q <http://www.sk89q.com>
* Copyright (c) the WorldGuard team and contributors
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* (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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.resolvers;
import org.bukkit.entity.Entity;
import com.sk89q.rulelists.Context;
import com.sk89q.worldguard.bukkit.BukkitContext;
public class TargetEntityResolver implements EntityResolver {
@Override
public Entity resolve(Context context) {
return ((BukkitContext) context).getTargetEntity();
}
}

View File

@ -0,0 +1,687 @@
- setting: [auto-invincible, auto-invincible-permission]
rules:
- when: player-spawn
if:
- ?has-permission: worldguard.auto-invincible
then:
- ?: update-entity
set-invincible: true
# ----------------------------------------------
# protection.*
# ----------------------------------------------
- setting: protection.item-durability
negate: true
rules:
- when: block-break
if:
- ?: match-item
has-data: true
then:
- ?: update-item
set-data: 0
- setting: protection.disable-xp-orb-drops
rules:
- when: player-death
then:
- ?: set-drop
set-xp: 0
- setting: protection.disable-obsidian-generators
rules:
- when: block-spread
if:
- ?: match-block
material: [lava, moving_lava, air]
block: source
- ?: match-block
material: redstone_block
block: target
then:
- ?: set-block
block: target
material: air
# ----------------------------------------------
# default.*
# ----------------------------------------------
- setting: default.pumpkin-scuba
rules:
- when: entity-damage
if:
- ?match-entity: [player]
entity: target
- ?match-damage: drowning
- ?: match-item
material: pumpkin
item: helmet
entity: target
then:
- ?: update-entity
entity: target
set-air: 320
- ?: cancel
# ----------------------------------------------
# physics.*
# ----------------------------------------------
- setting: physics.no-physics-gravel
rules:
- when: block-physics
if:
- ?match-block: gravel
then:
- ?: cancel
- setting: physics.no-physics-sand
rules:
- when: block-physics
if:
- ?match-block: sand
then:
- ?: cancel
- setting: physics.no-physics-portal
rules:
- when: block-physics
if:
- ?match-block: portal
then:
- ?: cancel
- setting: physics.disable-water-damage-blocks
type: list
parameters:
target: "rules[0].if[1].?match-block"
rules:
- when: block-spread
if:
- ?match-block: [water, water_moving]
block: source
- ?match-block: VARIABLE
block: target
then:
- ?: cancel
- setting: physics.block-tnt
rules:
- when: entity-explode
if:
- ?match-entity: primed_tnt
entity: target
then:
- ?: cancel
- when: entity-damage
if:
- ?match-entity: primed_tnt
entity: source
then:
- ?: cancel
- setting: physics.block-tnt-damage
rules:
- when: block-break
if:
- ?match-entity: primed_tnt
entity: source
then:
- ?: cancel
# ----------------------------------------------
# ignition.*
# ----------------------------------------------
- setting: ignition.lighter
rules:
- when: item-use
if:
- ?match-block: fire
block: placed
- ?match-entity: [player]
entity: source
- ?match-item: lighter
slot: held
- ?has-permission: worldguard.override.lighter
negate: true
then:
- ?: cancel
# ----------------------------------------------
# fire.*
# ----------------------------------------------
- setting: fire.disable-lava-fire-spread
rules:
- when: block-spread
if:
- ?match-block: fire
block: placed
- ?match-block: [lava, moving_lava]
block: source
then:
- ?: cancel
- setting: fire.disable-all-fire-spread
rules:
- when: block-spread
if:
- ?match-block: fire
block: placed
then:
- ?: cancel
- when: block-break
if:
- ?match-block: fire
block: source
then:
- ?: cancel
- setting: fire.disable-fire-spread-blocks
type: list
parameters:
target: ["rules[0].if[0].?match-block",
"rules[1].if[0].?match-block"]
rules:
- when: block-spread
if:
- ?match-block: VARIABLE
block: target
relative: around
- ?match-block: fire
block: placed
then:
- ?: cancel
- when: block-break
if:
- ?match-block: VARIABLE
block: target
- ?match-block: fire
block: source
then:
- ?: cancel
- setting: fire.lava-spread-blocks
type: list
parameters:
target: "rules[0].if[1].?match-block"
rules:
- when: block-spread
if:
- ?match-block: [lava, moving_lava]
block: source
- ?match-block: VARIABLE
block: target
relative: below
negate: true
then:
- ?: cancel
- setting: [fire.disable-lightning-strike-fire, weather.disable-lightning-strike-fire]
rules:
- when: block-place
if:
- ?match-block: fire
block: placed
- ?match-entity: lightning
entity: source
then:
- ?: cancel
# ----------------------------------------------
# mobs.*
# ----------------------------------------------
- setting: mobs.block-enderdragon-block-damage
rules:
- when: block-break
if:
- ?match-entity: enderdragon
entity: source
then:
- ?: cancel
- setting: mobs.block-fireball-explosions
rules:
- when: entity-explode
if:
- ?match-entity: fireball
entity: target
then:
- ?: cancel
- setting: mobs.block-fireball-block-damage
rules:
- when: block-break
if:
- ?match-entity: fireball
entity: source
then:
- ?: cancel
- setting: mobs.disable-enderman-griefing
rules:
- when: [block-place, block-break]
if:
- ?match-entity: enderman
entity: source
then:
- ?: cancel
# Creepers
- setting: mobs.block-creeper-explosions
rules:
- when: entity-damage
if:
- ?match-entity: creeper # Why is this needed?
entity: source
then:
- ?: cancel
- when: entity-explode
if:
- ?match-entity: creeper
entity: target
then:
- ?: cancel
- setting: mobs.block-creeper-block-damage
rules:
- when: block-break
if:
- ?match-entity: creeper
entity: source
then:
- ?: cancel
# Make pets very low-maintenance
- setting: [mobs.wolves-practically-invincible, mobs.anti-wolf-dumbness]
rules:
- when: entity-damage
if:
- ?match-entity: wolf
entity: target
then:
- ?: cancel
- setting: mobs.ocelots-practically-invincible
rules:
- when: entity-damage
if:
- ?match-entity: ocelot
entity: target
then:
- ?: cancel
# Mobs breaking things that they shouldn't
- setting: mobs.block-painting-destroy
rules:
- when: entity-damage
if:
- ?match-entity: painting
entity: target
- ?match-entity: player
negate: true
entity: source
then:
- ?: cancel
- setting: mobs.block-item-frame-destroy
rules:
- when: entity-damage
if:
- ?match-entity: item_frame
entity: target
- ?match-entity: player
negate: true
entity: source
then:
- ?: cancel
# Spawning
- setting: mobs.block-creature-spawn
type: list
parameters:
target: "rules[0].if[0].?match-entity"
rules:
- when: entity-spawn
if:
- ?match-entity: PLACEHOLDER
entity: target
then:
- ?: cancel
- setting: mobs.block-plugin-spawning
rules:
- when: entity-spawn
if:
- ?match-spawn: plugin
entity: target
then:
- ?: cancel
# Withers
- setting: mobs.block-wither-explosions
rules:
- when: entity-damage # Why is this needed?
if:
- ?match-entity: wither
entity: source
then:
- ?: cancel
- when: entity-explode
if:
- ?match-entity: wither
entity: target
then:
- ?: cancel
- setting: mobs.block-wither-block-damage
rules:
- when: block-break
if:
- ?match-entity: wither
entity: source
then:
- ?: cancel
# Wither skulls
- setting: mobs.block-wither-skull-explosions
rules:
- when: entity-damage # Why is this needed?
if:
- ?match-entity: wither_skull
entity: source
then:
- ?: cancel
- when: entity-explode
if:
- ?match-entity: wither_skull
entity: target
then:
- ?: cancel
- setting: mobs.block-wither-skull-block-damage
rules:
- when: block-break
if:
- ?match-entity: wither_skull
entity: source
then:
- ?: cancel
# ----------------------------------------------
# player-damage.*
# ----------------------------------------------
- setting: player-damage.teleport-on-suffocation
rules:
- when: entity-damage
if:
- ?match-damage: suffocation
- ?match-entity: player
entity: target
then:
- ?: update-entity
entity: target
teleport-safely: true
- ?: cancel
- setting: player-damage.teleport-on-void-falling
rules:
- when: entity-damage
if:
- ?match-damage: void
- ?match-entity: player
entity: target
then:
- ?: update-entity
entity: target
teleport-safely: true
- ?: cancel
- setting: player-damage.disable-death-messages
rules:
- when: entity-death
if:
- ?match-entity: player
entity: target
then:
- ?set-message: ""
- setting: player-damage.disable-fall-damage
rules:
- when: entity-damage
if:
- ?match-damage: fall
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-lava-damage
rules:
- when: entity-damage
if:
- ?match-damage: lava
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-fire-damage
rules:
- when: entity-damage
if:
- ?match-damage: [fire, fire_tick]
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-lightning-damage
rules:
- when: entity-damage
if:
- ?match-damage: lightning
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-drowning-damage
rules:
- when: entity-damage
if:
- ?match-damage: drowning
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-suffocation-damage
rules:
- when: entity-damage
if:
- ?match-damage: suffocation
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-contact-damage
rules:
- when: entity-damage
if:
- ?match-damage: contact
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-void-damage
rules:
- when: entity-damage
if:
- ?match-damage: void
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-explosion-damage
rules:
- when: entity-damage
if:
- ?match-damage: [entity_explosion, block_explosion]
- ?match-entity: player
entity: target
then:
- ?: cancel
- setting: player-damage.disable-mob-damage
rules:
- when: entity-damage
if:
- ?match-damage: entity_attack
- ?match-entity: player
entity: target
then:
- ?: cancel
# ----------------------------------------------
# crops.*
# ----------------------------------------------
- setting: crops.disable-creature-trampling
rules:
- when: block-interact
if:
- ?match-block: soil
- ?: match-entity
is-living: true
entity: source
then:
- ?: cancel
- setting: crops.disable-player-trampling
rules:
- when: block-interact
if:
- ?match-block: soil
- ?match-entity: player
entity: source
then:
- ?: cancel
# ----------------------------------------------
# weather.*
# ----------------------------------------------
- setting: weather.prevent-lightning-strike-blocks
type: list
parameters:
target: "rules[0].if[1].?match-block"
rules:
- when: weather-phenomenon
if:
- ?match-phenomenon: lightning
- ?match-block: VARIABLE
block: target
negate: true
then:
- ?: cancel
- setting: weather.disable-thunderstorm
rules:
- when: weather-transition
if:
- ?match-weather: thunderstorm
is-starting: true
then:
- ?: cancel
- when: world-load
then:
- ?: update-world
set-thunderstorm: false
- setting: weather.disable-weather
rules:
- when: weather-transition
if:
- ?match-weather: storm
is-starting: true
then:
- ?: cancel
- when: world-load
then:
- ?: update-world
set-storm: false
- setting: weather.disable-pig-zombification
rules:
- when: entity-strike
if:
- ?match-entity: pig
entity: target
then:
- ?: cancel
- setting: weather.disable-powered-creepers
rules:
- when: entity-strike
if:
- ?match-entity: creeper
entity: target
then:
- ?: cancel
- setting: weather.always-thundering
rules:
- when: weather-transition
if:
- ?match-weather: thunderstorm
is-starting: false
then:
- ?: cancel
- when: world-load
then:
- ?: update-world
set-thunderstorm: true
- setting: weather.always-raining
rules:
- when: weather-transition
if:
- ?match-weather: storm
is-starting: false
then:
- ?: cancel
- when: world-load
then:
- ?: update-world
set-storm: true
# ----------------------------------------------
# dynamics.*
# ----------------------------------------------
- setting: dynamics.disable-mushroom-spread
rules:
- when: block-spread
if:
- ?match-block: [red_mushroom, brown_mushroom]
block: placed
then:
- ?: cancel
- setting: dynamics.disable-ice-melting
rules:
- when: block-fade
if:
- ?match-block: ice
block: target
then:
- ?: cancel
- setting: dynamics.disable-snow-melting
rules:
- when: block-fade
if:
- ?match-block: snow
block: target
then:
- ?: cancel
- setting: dynamics.disable-snow-formation
rules:
- when: block-form
if:
- ?match-block: snow
block: placed
then:
- ?: cancel
- setting: dynamics.disable-ice-formation
rules:
- when: block-form
if:
- ?match-block: ice
block: placed
then:
- ?: cancel
- setting: dynamics.disable-leaf-decay
rules:
- when: block-fade
if:
- ?match-block: leaves
block: target
then:
- ?: cancel
- setting: dynamics.disable-grass-growth
rules:
- when: block-spread
if:
- ?match-block: grass
block: placed
then:
- ?: cancel

View File

@ -1,22 +0,0 @@
#
# WorldGuard's configuration file
#
# About editing this file:
# - DO NOT USE TABS. You MUST use spaces or Bukkit will complain. If
# you use an editor like Notepad++ (recommended for Windows users), you
# must configure it to "replace tabs with spaces." In Notepad++, this can
# be changed in Settings > Preferences > Language Menu.
# - Don't get rid of the indents. They are indented so some entries are
# in categories (like "enforce-single-session" is in the "protection"
# category.
# - If you want to check the format of this file before putting it
# into WorldGuard, paste it into http://yaml-online-parser.appspot.com/
# and see if it gives "ERROR:".
# - Lines starting with # are commentsand so they are ignored.
#
# WARNING:
# Remember to check the compatibility spreadsheet for WorldGuard to see
# if any features are currently broken in your version of Bukkit.
#
# -- This should be automatically replaced by the plugin in-game --

View File

@ -1,21 +0,0 @@
#
# WorldGuard's configuration file.
#
# This is the a per-world configuration file. It only affects one
# corresponding world.
#
# About editing this file:
# - DO NOT USE TABS. You MUST use spaces or Bukkit will complain. If
# you use an editor like Notepad++ (recommended for Windows users), you
# must configure it to "replace tabs with spaces." In Notepad++, this can
# be changed in Settings > Preferences > Language Menu.
# - Don't get rid of the indents. They are indented so some entries are
# in categories (like "enforce-single-session" is in the "protection"
# category.
# - If you want to check the format of this file before putting it
# into WorldGuard, paste it into http://yaml-online-parser.appspot.com/
# and see if it gives "ERROR:".
# - Lines starting with # are comments and so they are ignored.
#
# -- This should be automatically replaced by the plugin in-game --

View File

@ -0,0 +1,74 @@
# RULELIST CONFIGURATION
#
# This file allows you to define rules to handle certain events, allowing you to
# perform actions upon those events.
#
# For example, when a player breaks a pumpkin:
# - event: block break
# - source entity: the player (s/he caused the event)
# - target entity: NOTHING
# - source block: NOTHING (a block didn't break the block)
# - target block: the pumpkin
# - placed/new block: air block (NOTE: as of writing, this is NOTHING due to limitations)
#
# Let's say you don't want players to ever break pumpkins. You'd want to filter it
# using the following conditions:
# - event is block break
# - source entity is a player
# - target block is a pumpkin
#
# As a RuleList rule, it'd be:
# ======= EXAMPLE =======
#- when: block-break
# if:
# - ?match-entity: player
# entity: source
# - ?match-block: pumpkin
# entity: target
# then:
# - ?: cancel
# ======= EXAMPLE =======
#
# To learn more, see http://wiki.sk89q.com/wiki/WorldGuard/RuleLists
# Here's a rule to block physics events on gravel. This makes gravel not fall
# (most of the time...):
#
# ======= EXAMPLE =======
#- when: block-physics
# if:
# - ?match-block: gravel
# block: target
# then:
# - ?: cancel
# ======= EXAMPLE =======
# How about telling players "DENIED." if they try to break iron ore or coal ore?
#
# ======= EXAMPLE =======
#- when: block-break
# if:
# - ?match-block: [iron_ore, coal_ore]
# entity: target
# then:
# - ?: cancel
# - ?tell: DENIED.
# ======= EXAMPLE =======
# How about making ladders not break even if they have nothing behind them, as long
# as there is a ladder above one?
#
# ======= EXAMPLE =======
#- when: block-physics
# if:
# - ?match-block: ladder
# block: target
# relative: above
# - ?match-block: ladder
# block: target
# then:
# - ?: cancel
# ======= EXAMPLE =======