> onTabComplete = (sender, localizer, strings) -> Collections.emptyList();
+
+ /**
+ * Creates a new builder instance for a condition of type {@code clazz}.
+ *
+ * @param clazz the class where the condition is for.
+ * @param scope scope of the condition
+ */
+ private Builder(Class extends DoorCondition> clazz, Scope scope) {
+ this.clazz = clazz;
+ this.scope = scope;
+ }
+
+ /**
+ * This consumer must satisfy these rules:
+ * - If a condition was added to the condition bag, a message must be send to the player via {@link MessageSender#sendMessage(Player, String)}
+ *
- If the condition can't be set, a message must be send to the player via {@link MessageSender#sendError(Player, String)}
+ *
- Do not remove any condition from the bag here.
+ *
- Do not try to save the config.
+ *
- The String[] input is only input for the condition itself. It does not contain anything else and may be empty.
+ *
- Use the message sender to send messages.
+ *
+ * @param create a consumer, which fullfills the rules above.
+ * @return this builder instance
+ */
+ public Builder withFactory(QuadConsumer create) {
+ this.create = create;
+ return this;
+ }
+
+ /**
+ * This quad function should handle the tab completion event like defined in
+ * {@link TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
+ *
+ * @param onTabComplete a quad function which i
+ * @return this builder instance
+ */
+ public Builder onTabComplete(TriFunction> onTabComplete) {
+ this.onTabComplete = onTabComplete;
+ return this;
+ }
+
+ /**
+ * Set the meta for this condition
+ *
+ * @param name name and group of the condition. case sensitive.
+ * @param cost cost of the condition. describes the costs to calculate the condition in the given scope.
+ * @return this builder instance
+ */
+ public Builder withMeta(String name, int cost) {
+ return withMeta(name, name, cost);
+ }
+
+ /**
+ * Set the meta for the condition.
+ *
+ * @param name name of the condition. case sensitive.
+ * @param group group of the condition. case sensitive.
+ * @param cost cost of the condition. describes the costs to calculate the condition in the given scope.
+ * @return this builder instance
+ */
+ public Builder withMeta(String name, String group, int cost) {
+ this.name = name;
+ this.group = group;
+ this.cost = cost;
+ return this;
+ }
+
+ public ConditionContainer build() {
+ return new ConditionContainer(clazz, scope, Objects.requireNonNull(name), group, cost, create, onTabComplete);
+ }
+
+ /**
+ * Provides estimated cost for conditions.
+ */
+ public enum Cost {
+ PLAYER_HIGH(100),
+ PLAYER_MEDIUM(50),
+ PLAYER_LOW(10),
+ WORLD_HIGH(100),
+ WORLD_MEDIUM(50),
+ WORLD_LOW(10);
+ public final int cost;
+
+ Cost(int cost) {
+
+ this.cost = cost;
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/conditions/ConditionGroup.java b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/ConditionGroup.java
new file mode 100644
index 0000000..1af81f6
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/ConditionGroup.java
@@ -0,0 +1,32 @@
+package de.eldoria.bigdoorsopener.core.conditions;
+
+import lombok.Getter;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+public class ConditionGroup {
+ private final Map conditions = new HashMap<>();
+ @Getter
+ private final String name;
+
+ public ConditionGroup(String name) {
+ this.name = name;
+ }
+
+
+ void addCondition(ConditionContainer condition) {
+ conditions.put(condition.getName(), condition);
+ }
+
+ public Set getConditions() {
+ return Collections.unmodifiableSet(conditions.keySet());
+ }
+
+ public Optional getConditionByName(String name) {
+ return Optional.ofNullable(conditions.get(name));
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/conditions/ConditionRegistrar.java b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/ConditionRegistrar.java
new file mode 100644
index 0000000..932fed5
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/ConditionRegistrar.java
@@ -0,0 +1,105 @@
+package de.eldoria.bigdoorsopener.core.conditions;
+
+import de.eldoria.bigdoorsopener.conditions.DoorCondition;
+import de.eldoria.bigdoorsopener.core.conditions.exceptions.ConditionRegistrationException;
+import org.bukkit.configuration.serialization.ConfigurationSerialization;
+import org.bukkit.configuration.serialization.SerializableAs;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+public final class ConditionRegistrar {
+ private static final Map GROUPS = new HashMap<>();
+ private static final Map, ConditionContainer> CONTAINER = new HashMap<>();
+
+ private ConditionRegistrar() {
+ }
+
+ /**
+ * This will register a condition container at the condition registrat.
+ * The provided class in the container requires the {@link SerializableAs} annotation.
+ *
+ * @param conditionContainer condition container to register
+ * @throws ConditionRegistrationException when the condition or its serialized name is already implemented
+ * @throws IllegalStateException when the annotation {@link SerializableAs} is not present
+ */
+ public static void registerCondition(ConditionContainer conditionContainer) throws ConditionRegistrationException, IllegalStateException {
+ GROUPS.computeIfAbsent(conditionContainer.getGroup(), ConditionGroup::new).addCondition(conditionContainer);
+
+ if (CONTAINER.containsKey(conditionContainer.getClazz())) {
+ throw new ConditionRegistrationException(conditionContainer.getClazz());
+ }
+
+ CONTAINER.put(conditionContainer.getClazz(), conditionContainer);
+
+ ConfigurationSerialization.registerClass(conditionContainer.getClazz());
+ }
+
+ /**
+ * Get a condition container by class.
+ * Only registered classes will return a container. Subclasses and interfaces are ambigous and will not return a container.
+ *
+ * @param clazz class to request
+ * @return optional condition container
+ */
+ public static Optional getContainerByClass(Class extends DoorCondition> clazz) {
+ return Optional.ofNullable(CONTAINER.get(clazz));
+ }
+
+ /**
+ * Get the condition group with the provided name.
+ *
+ * @param string name of group
+ * @return optional group with group if present
+ */
+ public static Optional getConditionGroup(String string) {
+ for (Map.Entry entry : GROUPS.entrySet()) {
+ if (entry.getKey().equalsIgnoreCase(string)) {
+ return Optional.ofNullable(entry.getValue());
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Get all registered condition groups
+ *
+ * @return set of groups
+ */
+ public static Set getGroups() {
+ return Collections.unmodifiableSet(GROUPS.keySet());
+ }
+
+ /**
+ * Get all registered conditions
+ *
+ * @return set of conditions.
+ */
+ public static Set getConditions() {
+ Set conditions = new HashSet<>();
+ GROUPS.values().forEach(c -> conditions.addAll(c.getConditions()));
+ return Collections.unmodifiableSet(conditions);
+ }
+
+ /**
+ * Get a condition by name.
+ *
+ * @param name name of condition
+ * @return option condition container
+ */
+ public static Optional getConditionByName(String name) {
+ for (ConditionGroup group : GROUPS.values()) {
+ for (String condition : group.getConditions()) {
+ if (condition.equalsIgnoreCase(name)) {
+ return group.getConditionByName(name);
+ }
+ }
+ }
+ return Optional.empty();
+ }
+
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/conditions/Scope.java b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/Scope.java
new file mode 100644
index 0000000..6726fda
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/Scope.java
@@ -0,0 +1,14 @@
+package de.eldoria.bigdoorsopener.core.conditions;
+
+public enum Scope {
+ /**
+ * This condition requires world evaluation.
+ * It will only be called once in a evaluation cyclus.
+ */
+ WORLD,
+ /**
+ * This condition requires per player evaluation.
+ *
It will be called for each player in a evaluation cyclus.
+ */
+ PLAYER
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/conditions/exceptions/ConditionRegistrationException.java b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/exceptions/ConditionRegistrationException.java
new file mode 100644
index 0000000..9ba93e7
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/conditions/exceptions/ConditionRegistrationException.java
@@ -0,0 +1,7 @@
+package de.eldoria.bigdoorsopener.core.conditions.exceptions;
+
+public class ConditionRegistrationException extends RuntimeException {
+ public ConditionRegistrationException(Class> clazz) {
+ super("Registration of condition " + clazz.getName() + " failed.");
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/events/ConditionBagModifiedEvent.java b/src/main/java/de/eldoria/bigdoorsopener/core/events/ConditionBagModifiedEvent.java
new file mode 100644
index 0000000..d4fad3e
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/events/ConditionBagModifiedEvent.java
@@ -0,0 +1,31 @@
+package de.eldoria.bigdoorsopener.core.events;
+
+import de.eldoria.bigdoorsopener.door.conditioncollections.ConditionBag;
+import lombok.Getter;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+public class ConditionBagModifiedEvent extends Event {
+ private static final HandlerList HANDLERS = new HandlerList();
+ @Getter
+ private final ConditionBag conditionBag;
+
+ /**
+ * Create a new Door Unegistered Event.
+ *
+ * @param conditionBag bag which was modified.
+ */
+ public ConditionBagModifiedEvent(ConditionBag conditionBag) {
+ this.conditionBag = conditionBag;
+ }
+
+ public static HandlerList getHandlerList() {
+ return HANDLERS;
+ }
+
+ @Override
+ public @NotNull HandlerList getHandlers() {
+ return HANDLERS;
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorModifiedEvent.java b/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorModifiedEvent.java
new file mode 100644
index 0000000..8584ecb
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorModifiedEvent.java
@@ -0,0 +1,31 @@
+package de.eldoria.bigdoorsopener.core.events;
+
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
+import lombok.Getter;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+public class DoorModifiedEvent extends Event {
+ private static final HandlerList HANDLERS = new HandlerList();
+ @Getter
+ private final ConditionalDoor door;
+
+ /**
+ * Create a new Door Unegistered Event.
+ *
+ * @param door world where the blood night has ended.
+ */
+ public DoorModifiedEvent(ConditionalDoor door) {
+ this.door = door;
+ }
+
+ public static HandlerList getHandlerList() {
+ return HANDLERS;
+ }
+
+ @Override
+ public @NotNull HandlerList getHandlers() {
+ return HANDLERS;
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorRegisteredEvent.java b/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorRegisteredEvent.java
new file mode 100644
index 0000000..02f2f34
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorRegisteredEvent.java
@@ -0,0 +1,31 @@
+package de.eldoria.bigdoorsopener.core.events;
+
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
+import lombok.Getter;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+public class DoorRegisteredEvent extends Event {
+ private static final HandlerList HANDLERS = new HandlerList();
+ @Getter
+ private final ConditionalDoor door;
+
+ /**
+ * Create a new Door Registered Event.
+ *
+ * @param door world where the blood night has ended.
+ */
+ public DoorRegisteredEvent(ConditionalDoor door) {
+ this.door = door;
+ }
+
+ public static HandlerList getHandlerList() {
+ return HANDLERS;
+ }
+
+ @Override
+ public @NotNull HandlerList getHandlers() {
+ return HANDLERS;
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorUnregisteredEvent.java b/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorUnregisteredEvent.java
new file mode 100644
index 0000000..403aeca
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/events/DoorUnregisteredEvent.java
@@ -0,0 +1,31 @@
+package de.eldoria.bigdoorsopener.core.events;
+
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
+import lombok.Getter;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+public class DoorUnregisteredEvent extends Event {
+ private static final HandlerList HANDLERS = new HandlerList();
+ @Getter
+ private final ConditionalDoor door;
+
+ /**
+ * Create a new Door Unegistered Event.
+ *
+ * @param door world where the blood night has ended.
+ */
+ public DoorUnregisteredEvent(ConditionalDoor door) {
+ this.door = door;
+ }
+
+ public static HandlerList getHandlerList() {
+ return HANDLERS;
+ }
+
+ @Override
+ public @NotNull HandlerList getHandlers() {
+ return HANDLERS;
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/exceptions/ConditionCreationException.java b/src/main/java/de/eldoria/bigdoorsopener/core/exceptions/ConditionCreationException.java
new file mode 100644
index 0000000..faf890b
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/exceptions/ConditionCreationException.java
@@ -0,0 +1,21 @@
+package de.eldoria.bigdoorsopener.core.exceptions;
+
+import de.eldoria.bigdoorsopener.conditions.DoorCondition;
+
+public class ConditionCreationException extends RuntimeException {
+ public ConditionCreationException(Class extends DoorCondition> con) {
+ super("Could not create condition of type " + con.getName() + ".");
+ }
+
+ public ConditionCreationException(Class extends DoorCondition> con, Throwable cause) {
+ super("Could not create condition of type " + con.getName() + ".", cause);
+ }
+
+ public ConditionCreationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ConditionCreationException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/listener/DoorOpenedListener.java b/src/main/java/de/eldoria/bigdoorsopener/core/listener/DoorOpenedListener.java
similarity index 84%
rename from src/main/java/de/eldoria/bigdoorsopener/listener/DoorOpenedListener.java
rename to src/main/java/de/eldoria/bigdoorsopener/core/listener/DoorOpenedListener.java
index 28f529b..ddf876a 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/listener/DoorOpenedListener.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/listener/DoorOpenedListener.java
@@ -1,7 +1,7 @@
-package de.eldoria.bigdoorsopener.listener;
+package de.eldoria.bigdoorsopener.core.listener;
import de.eldoria.bigdoorsopener.config.Config;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
import nl.pim16aap2.bigDoors.Door;
import nl.pim16aap2.bigDoors.events.DoorEventToggle;
import nl.pim16aap2.bigDoors.events.DoorEventToggleEnd;
@@ -18,7 +18,7 @@ public DoorOpenedListener(Config config) {
@EventHandler
public void doorOpened(DoorEventToggleEnd toggleEnd) {
Door toggledDoor = toggleEnd.getDoor();
- ConditionalDoor conDoor = config.getDoors().get(toggledDoor.getDoorUID());
+ ConditionalDoor conDoor = config.getDoor(toggledDoor.getDoorUID());
if (conDoor == null) return;
if (toggleEnd.getToggleType() == DoorEventToggle.ToggleType.STATIC) return;
diff --git a/src/main/java/de/eldoria/bigdoorsopener/core/listener/ModificationListener.java b/src/main/java/de/eldoria/bigdoorsopener/core/listener/ModificationListener.java
new file mode 100644
index 0000000..ade9346
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/listener/ModificationListener.java
@@ -0,0 +1,37 @@
+package de.eldoria.bigdoorsopener.core.listener;
+
+import de.eldoria.bigdoorsopener.config.Config;
+import de.eldoria.bigdoorsopener.core.events.ConditionBagModifiedEvent;
+import de.eldoria.bigdoorsopener.core.events.DoorModifiedEvent;
+import de.eldoria.bigdoorsopener.core.events.DoorRegisteredEvent;
+import de.eldoria.bigdoorsopener.core.events.DoorUnregisteredEvent;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+
+public class ModificationListener implements Listener {
+ private final Config config;
+
+ public ModificationListener(Config config) {
+ this.config = config;
+ }
+
+ @EventHandler
+ public void onConditionBagModification(ConditionBagModifiedEvent event) {
+ config.safeConfig();
+ }
+
+ @EventHandler
+ public void onDoorModifiedEvent(DoorModifiedEvent event) {
+ config.safeConfig();
+ }
+
+ @EventHandler
+ public void onDoorRegisteredEvent(DoorRegisteredEvent event) {
+ config.safeConfig();
+ }
+
+ @EventHandler
+ public void onDoorUnregisteredEvent(DoorUnregisteredEvent event) {
+ config.safeConfig();
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/listener/registration/InteractionRegistrationObject.java b/src/main/java/de/eldoria/bigdoorsopener/core/listener/registration/InteractionRegistrationObject.java
similarity index 68%
rename from src/main/java/de/eldoria/bigdoorsopener/listener/registration/InteractionRegistrationObject.java
rename to src/main/java/de/eldoria/bigdoorsopener/core/listener/registration/InteractionRegistrationObject.java
index 0954225..84827a2 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/listener/registration/InteractionRegistrationObject.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/listener/registration/InteractionRegistrationObject.java
@@ -1,5 +1,6 @@
-package de.eldoria.bigdoorsopener.listener.registration;
+package de.eldoria.bigdoorsopener.core.listener.registration;
+import de.eldoria.eldoutilities.messages.MessageSender;
import org.bukkit.event.player.PlayerInteractEvent;
/**
@@ -12,5 +13,5 @@ public interface InteractionRegistrationObject {
* @param event interaction event of the player.
* @return true if the registration is done and the object can be removed.
*/
- boolean register(PlayerInteractEvent event);
+ boolean invoke(PlayerInteractEvent event, MessageSender messageSender);
}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/listener/registration/RegisterInteraction.java b/src/main/java/de/eldoria/bigdoorsopener/core/listener/registration/RegisterInteraction.java
similarity index 62%
rename from src/main/java/de/eldoria/bigdoorsopener/listener/registration/RegisterInteraction.java
rename to src/main/java/de/eldoria/bigdoorsopener/core/listener/registration/RegisterInteraction.java
index cfe5617..d71ee27 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/listener/registration/RegisterInteraction.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/listener/registration/RegisterInteraction.java
@@ -1,5 +1,7 @@
-package de.eldoria.bigdoorsopener.listener.registration;
+package de.eldoria.bigdoorsopener.core.listener.registration;
+import de.eldoria.bigdoorsopener.config.Config;
+import de.eldoria.eldoutilities.messages.MessageSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -13,15 +15,35 @@
* This listener allows to execute a call on a object which tries further actions though player interactions.
*/
public class RegisterInteraction implements Listener {
+ private static RegisterInteraction instance;
private final Map registerObjects = new HashMap<>();
+ private final MessageSender messageSender;
+ private final Config config;
+
+ public RegisterInteraction(MessageSender messageSender, Config config) {
+ if (instance != null) {
+ throw new ExceptionInInitializerError("Register interaction is already initialized");
+ }
+
+ this.messageSender = messageSender;
+ this.config = config;
+ instance = this;
+ }
+
+ public static RegisterInteraction getInstance() {
+ if (instance == null) {
+ throw new NullPointerException("Register interaction is not initialized");
+ }
+ return instance;
+ }
@EventHandler
public void onPlayerInteraction(PlayerInteractEvent event) {
if (registerObjects.containsKey(event.getPlayer().getUniqueId())) {
InteractionRegistrationObject registrationObject = registerObjects.get(event.getPlayer().getUniqueId());
- boolean register = registrationObject.register(event);
- if (register) {
+ if (registrationObject.invoke(event, messageSender)) {
registerObjects.remove(event.getPlayer().getUniqueId());
+ config.safeConfig();
}
}
}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/scheduler/DoorChecker.java b/src/main/java/de/eldoria/bigdoorsopener/core/scheduler/DoorChecker.java
similarity index 84%
rename from src/main/java/de/eldoria/bigdoorsopener/scheduler/DoorChecker.java
rename to src/main/java/de/eldoria/bigdoorsopener/core/scheduler/DoorChecker.java
index 29e980d..2b85fef 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/scheduler/DoorChecker.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/core/scheduler/DoorChecker.java
@@ -1,10 +1,13 @@
-package de.eldoria.bigdoorsopener.scheduler;
+package de.eldoria.bigdoorsopener.core.scheduler;
import com.google.common.cache.Cache;
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
+import de.eldoria.bigdoorsopener.conditions.location.Proximity;
import de.eldoria.bigdoorsopener.config.Config;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.location.Proximity;
+import de.eldoria.bigdoorsopener.core.BigDoorsOpener;
+import de.eldoria.bigdoorsopener.core.adapter.BigDoorsAdapter;
+import de.eldoria.bigdoorsopener.core.events.DoorRegisteredEvent;
+import de.eldoria.bigdoorsopener.core.events.DoorUnregisteredEvent;
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
import de.eldoria.bigdoorsopener.util.C;
import de.eldoria.eldoutilities.functions.TriFunction;
import de.eldoria.eldoutilities.localization.Localizer;
@@ -13,6 +16,8 @@
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.util.Vector;
import java.util.HashMap;
@@ -25,7 +30,7 @@
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
-public class DoorChecker extends BigDoorsAdapter implements Runnable {
+public class DoorChecker extends BigDoorsAdapter implements Runnable, Listener {
private final Queue doors = new LinkedList<>();
private final Server server = Bukkit.getServer();
@@ -37,35 +42,25 @@ public class DoorChecker extends BigDoorsAdapter implements Runnable {
private final Set evaluated = new HashSet<>();
private final Cache> worldPlayers = C.getShortExpiringCache();
private final Cache chunkStateCache = C.getShortExpiringCache();
- private double doorUpdateInterval;
private final TriFunction proximity = Proximity.ProximityForm.CUBOID.check;
+ private double doorUpdateInterval;
public DoorChecker(Config config, BigDoors bigDoors, Localizer localizer) {
- super(bigDoors, localizer);
+ super(bigDoors);
this.config = config;
- doors.addAll(config.getDoors().values());
+ doors.addAll(config.getDoors());
}
- /**
- * Registers a new door at the door checker.
- * Only registered doors will do anything.
- * The door will only be registered if its not yet registered.
- *
- * @param door door to register.
- */
- public void register(ConditionalDoor door) {
- if (!doors.contains(door)) {
- doors.add(door);
+ @EventHandler
+ public void onDoorRegister(DoorRegisteredEvent event) {
+ if (!doors.contains(event.getDoor())) {
+ doors.add(event.getDoor());
}
}
- /**
- * Unregister a door.
- *
- * @param door door to unregister.
- */
- public void unregister(ConditionalDoor door) {
- doors.remove(door);
+ @EventHandler
+ public void onDoorUnregister(DoorUnregisteredEvent event) {
+ doors.remove(event.getDoor());
}
/**
@@ -75,7 +70,7 @@ public void unregister(ConditionalDoor door) {
public void reload() {
synchronized (doors) {
doors.clear();
- doors.addAll(config.getDoors().values());
+ doors.addAll(config.getDoors());
}
}
@@ -99,9 +94,8 @@ public void run() {
assert door != null : "Door is null. How could this happen?";
if (!doorExists(door)) {
- config.getDoors().remove(door.getDoorUID());
+ config.removeDoor(door.getDoorUID());
BigDoorsOpener.logger().info("Door with id " + door.getDoorUID() + " has been deleted. Removing.");
- config.safeConfig();
continue;
}
@@ -119,12 +113,12 @@ public void run() {
}
} catch (ExecutionException e) {
BigDoorsOpener.logger().log(Level.WARNING,
- "A error occured while calculating the chunk cache state. Please report this.", e);
+ "An error occured while calculating the chunk cache state. Please report this.", e);
continue;
}
// skip busy doors. bcs why should we try to open/close a door we cant open/close
- if (getCommander().isDoorBusy(door.getDoorUID())) {
+ if (getCommander().isDoorBusy(door.getDoorUID()) || !door.isEnabled()) {
continue;
}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/ConditionalDoor.java b/src/main/java/de/eldoria/bigdoorsopener/door/ConditionalDoor.java
similarity index 70%
rename from src/main/java/de/eldoria/bigdoorsopener/doors/ConditionalDoor.java
rename to src/main/java/de/eldoria/bigdoorsopener/door/ConditionalDoor.java
index d07337f..d1de5d1 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/ConditionalDoor.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/door/ConditionalDoor.java
@@ -1,13 +1,15 @@
-package de.eldoria.bigdoorsopener.doors;
+package de.eldoria.bigdoorsopener.door;
import com.google.common.base.Objects;
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionChain;
+import de.eldoria.bigdoorsopener.core.BigDoorsOpener;
+import de.eldoria.bigdoorsopener.core.events.DoorModifiedEvent;
+import de.eldoria.bigdoorsopener.door.conditioncollections.ConditionBag;
+import de.eldoria.bigdoorsopener.door.conditioncollections.ConditionChain;
import de.eldoria.eldoutilities.serialization.SerializationUtil;
import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
import de.eldoria.eldoutilities.utils.EnumUtil;
import lombok.Getter;
-import lombok.Setter;
+import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.SerializableAs;
@@ -45,6 +47,8 @@ public class ConditionalDoor implements ConfigurationSerializable {
*/
private final Vector position;
+ private boolean enabled = true;
+
private Instant openTill;
/**
@@ -55,12 +59,10 @@ public class ConditionalDoor implements ConfigurationSerializable {
/**
* the type the condition chain uses to evaluate the conditions
*/
- private EvaluationType evaluationType = EvaluationType.OR;
+ private EvaluationType evaluationType = EvaluationType.AND;
- @Getter
- @Setter
@Nonnull
- private ConditionChain conditionChain;
+ private ConditionBag conditionBag;
/**
* Amount of time in seconds a door will stay open when opened.
@@ -73,41 +75,36 @@ public class ConditionalDoor implements ConfigurationSerializable {
/**
* True if the door was registered in open state.
*/
- @Setter
- @Getter
private boolean invertOpen = false;
- public ConditionalDoor(long doorUID, String world, Vector position, ConditionChain conditionChain) {
+ public ConditionalDoor(long doorUID, String world, Vector position, ConditionBag conditionChain) {
this.doorUID = doorUID;
this.world = world;
this.position = position;
- this.conditionChain = conditionChain;
+ this.conditionBag = conditionChain;
}
public ConditionalDoor(long doorUID, String world, Vector position) {
- this(doorUID, world, position, new ConditionChain());
- }
-
- public ConditionalDoor(long doorUID, String world, Vector position, boolean invertOpen, String evaluator,
- EvaluationType evaluationType, ConditionChain conditionChain, int stayOpen) {
- this(doorUID, world, position, conditionChain);
- this.invertOpen = invertOpen;
- this.evaluator = evaluator;
- this.evaluationType = evaluationType;
- this.stayOpen = stayOpen;
+ this(doorUID, world, position, new ConditionBag());
}
public ConditionalDoor(Map map) {
TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- int doorUID = resolvingMap.getValue("doorUID");
- this.doorUID = doorUID;
+ doorUID = (int) resolvingMap.getValue("doorUID");
world = resolvingMap.getValue("world");
position = resolvingMap.getValue("position");
+ enabled = resolvingMap.getValueOrDefault("enabled", true);
invertOpen = resolvingMap.getValue("invertOpen");
evaluator = resolvingMap.getValue("evaluator");
evaluationType = EnumUtil.parse(resolvingMap.getValue("evaluationType"), EvaluationType.class);
- conditionChain = resolvingMap.getValue("conditionChain");
+ if (resolvingMap.containsKey("conditionChain")) {
+ ConditionChain conditionChain = resolvingMap.getValue("conditionChain");
+ conditionBag = new ConditionBag();
+ conditionChain.getConditions().stream().filter(java.util.Objects::nonNull).forEach(c -> conditionBag.putCondition(c));
+ } else {
+ conditionBag = resolvingMap.getValue("conditionBag");
+ }
stayOpen = resolvingMap.getValue("stayOpen");
}
@@ -128,12 +125,12 @@ public boolean getState(Player player, World world, boolean currentState) {
switch (evaluationType) {
case CUSTOM:
- String custom = conditionChain.custom(evaluator, player, world, this, currentState);
+ String custom = conditionBag.custom(evaluator, player, world, this, currentState);
return BigDoorsOpener.JS().eval(custom, currentState);
case AND:
- return conditionChain.and(player, world, this, currentState);
+ return conditionBag.and(player, world, this, currentState);
case OR:
- return conditionChain.or(player, world, this, currentState);
+ return conditionBag.or(player, world, this, currentState);
default:
throw new IllegalStateException("Unexpected value: " + evaluationType);
}
@@ -165,7 +162,7 @@ public int hashCode() {
public void opened(@Nullable Player player) {
waitForOpen = true;
if (player == null) return;
- conditionChain.opened(player);
+ conditionBag.opened(player);
}
/**
@@ -177,11 +174,11 @@ public void opened() {
}
public void evaluated() {
- conditionChain.evaluated();
+ conditionBag.evaluated();
}
public boolean requiresPlayerEvaluation() {
- return conditionChain.requiresPlayerEvaluation();
+ return conditionBag.requiresPlayerEvaluation();
}
public void setEvaluator(EvaluationType evaluationType) {
@@ -189,11 +186,13 @@ public void setEvaluator(EvaluationType evaluationType) {
if (evaluationType == EvaluationType.OR || evaluationType == EvaluationType.AND) {
evaluator = "";
}
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
}
public void setEvaluator(String evaluator) {
this.evaluator = evaluator;
evaluationType = EvaluationType.CUSTOM;
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
}
/**
@@ -204,6 +203,7 @@ public void setEvaluator(String evaluator) {
*/
public void setStayOpen(int stayOpen) {
this.stayOpen = stayOpen;
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
}
/**
@@ -211,6 +211,7 @@ public void setStayOpen(int stayOpen) {
*/
public void invertOpen() {
invertOpen = !invertOpen;
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
}
@Override
@@ -219,15 +220,29 @@ public void invertOpen() {
.add("doorUID", doorUID)
.add("world", world)
.add("position", position)
+ .add("enabled", enabled)
.add("invertOpen", invertOpen)
.add("evaluator", evaluator)
.add("evaluationType", evaluationType)
.add("stayOpen", stayOpen)
- .add("conditionChain", conditionChain)
+ .add("conditionBag", conditionBag)
.build();
}
+ public void setConditionBag(@Nonnull ConditionBag conditionBag) {
+ this.conditionBag = conditionBag;
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
+ }
+ public void setInvertOpen(boolean invertOpen) {
+ this.invertOpen = invertOpen;
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
+ }
+
+ public void setEnabled(Boolean state) {
+ enabled = state;
+ Bukkit.getPluginManager().callEvent(new DoorModifiedEvent(this));
+ }
public enum EvaluationType {
CUSTOM, AND, OR
diff --git a/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionBag.java b/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionBag.java
new file mode 100644
index 0000000..a6b2afd
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionBag.java
@@ -0,0 +1,158 @@
+package de.eldoria.bigdoorsopener.door.conditioncollections;
+
+import de.eldoria.bigdoorsopener.conditions.DoorCondition;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionContainer;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionGroup;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionRegistrar;
+import de.eldoria.bigdoorsopener.core.conditions.Scope;
+import de.eldoria.bigdoorsopener.core.events.ConditionBagModifiedEvent;
+import de.eldoria.bigdoorsopener.core.exceptions.ConditionCreationException;
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
+import de.eldoria.eldoutilities.serialization.SerializationUtil;
+import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.configuration.serialization.SerializableAs;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+@SerializableAs("bdoConditionBag")
+public class ConditionBag implements ConditionCollection {
+ private final Map playerScope = new TreeMap<>();
+ private final Map worldScope = new TreeMap<>();
+
+ private ConditionBag(Collection playerScope, Collection worldScope) {
+ playerScope.forEach(c -> {
+ ConditionRegistrar.getContainerByClass(c.getClass()).ifPresent(g -> this.playerScope.put(g.getGroup(), c));
+ });
+ worldScope.forEach(c -> {
+ ConditionRegistrar.getContainerByClass(c.getClass()).ifPresent(g -> this.worldScope.put(g.getGroup(), c));
+ });
+ }
+
+ public ConditionBag() {
+
+ }
+
+ public ConditionBag(Map map) {
+ TypeResolvingMap typeResolvingMap = SerializationUtil.mapOf(map);
+ List conditions = (List) typeResolvingMap.get("conditions");
+ conditions.forEach(this::putCondition);
+ }
+
+ @Override
+ public @NotNull Map serialize() {
+ Collection values = playerScope.values();
+ values.addAll(worldScope.values());
+ return SerializationUtil.newBuilder().add("conditions", values).build();
+ }
+
+ public void putCondition(DoorCondition condition) {
+ Optional containerByClass = ConditionRegistrar.getContainerByClass(condition.getClass());
+ if (!containerByClass.isPresent()) {
+ throw new ConditionCreationException("The requested condition " + condition.getClass().getName() + "is not registered");
+ }
+ ConditionContainer container = containerByClass.get();
+ if (container.getScope() == Scope.PLAYER) {
+ playerScope.put(container.getGroup(), condition);
+ } else {
+ worldScope.put(container.getGroup(), condition);
+ }
+ Bukkit.getPluginManager().callEvent(new ConditionBagModifiedEvent(this));
+ }
+
+ public boolean removeCondition(ConditionGroup container) {
+ boolean result = playerScope.remove(container.getName()) != null || worldScope.remove(container.getName()) != null;
+ Bukkit.getPluginManager().callEvent(new ConditionBagModifiedEvent(this));
+ return result;
+ }
+
+ public Optional getCondition(ConditionGroup container) {
+ return getCondition(container.getName());
+ }
+
+ public Optional getCondition(String group) {
+ Optional worldCon = Optional.ofNullable(worldScope.get(group));
+ if (worldCon.isPresent()) return worldCon;
+ return Optional.ofNullable(playerScope.get(group));
+ }
+
+ public boolean isConditionSet(ConditionGroup container) {
+ return getCondition(container).isPresent();
+ }
+
+ @Override
+ public String custom(String string, Player player, World world, ConditionalDoor door, boolean currentState) {
+ String evaluationString = string;
+
+ for (DoorCondition condition : getConditions()) {
+ Boolean state;
+
+ Optional containerByClass = ConditionRegistrar.getContainerByClass(condition.getClass());
+ if (!containerByClass.isPresent()) {
+ throw new ConditionCreationException("The requested condition is not registered");
+ }
+ ConditionContainer container = containerByClass.get();
+
+ if (container.getScope() == Scope.PLAYER && player == null) {
+ state = false;
+ } else {
+ state = condition.isOpen(player, world, door, currentState);
+ }
+ evaluationString = evaluationString.replaceAll("(?i)" + container.getGroup(),
+ String.valueOf(state));
+ }
+
+ evaluationString = evaluationString.replaceAll("(?i)currentState",
+ String.valueOf(currentState));
+
+ // make sure that calculation does not fail even when the condition is not set.
+ for (String value : ConditionRegistrar.getGroups()) {
+ evaluationString = evaluationString.replaceAll("(?i)" + value, "null");
+ }
+
+ return evaluationString;
+ }
+
+ @Override
+ public void evaluated() {
+ playerScope.values().forEach(DoorCondition::evaluated);
+ worldScope.values().forEach(DoorCondition::evaluated);
+ }
+
+ @Override
+ public void opened(Player player) {
+ playerScope.values().forEach(c -> c.opened(player));
+ }
+
+ @Override
+ public boolean requiresPlayerEvaluation() {
+ return !playerScope.isEmpty();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return worldScope.isEmpty() && playerScope.isEmpty();
+ }
+
+ @Override
+ public ConditionBag copy() {
+ return new ConditionBag(
+ playerScope.values().stream().map(DoorCondition::clone).collect(Collectors.toList()),
+ worldScope.values().stream().map(DoorCondition::clone).collect(Collectors.toList()));
+ }
+
+ @Override
+ public Collection getConditions() {
+ Collection values = playerScope.values();
+ values.addAll(worldScope.values());
+ return values;
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionChain.java b/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionChain.java
new file mode 100644
index 0000000..408cbbb
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionChain.java
@@ -0,0 +1,207 @@
+package de.eldoria.bigdoorsopener.door.conditioncollections;
+
+import de.eldoria.bigdoorsopener.conditions.DoorCondition;
+import de.eldoria.bigdoorsopener.conditions.item.Item;
+import de.eldoria.bigdoorsopener.conditions.location.Location;
+import de.eldoria.bigdoorsopener.conditions.permission.Permission;
+import de.eldoria.bigdoorsopener.conditions.standalone.Placeholder;
+import de.eldoria.bigdoorsopener.conditions.standalone.Time;
+import de.eldoria.bigdoorsopener.conditions.standalone.mythicmobs.MythicMob;
+import de.eldoria.bigdoorsopener.conditions.standalone.weather.Weather;
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
+import de.eldoria.bigdoorsopener.util.C;
+import de.eldoria.bigdoorsopener.util.ConditionChainEvaluator;
+import de.eldoria.eldoutilities.serialization.SerializationUtil;
+import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
+import lombok.Getter;
+import lombok.Setter;
+import org.bukkit.World;
+import org.bukkit.configuration.serialization.SerializableAs;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * A condition chain represents a set of multiple conditions.
+ *
+ * @deprecated This class is only present for serialization reasons and will be removed in the next major release.
+ * Use {@link ConditionBag} instead
+ */
+@Setter
+@Getter
+@SerializableAs("conditionChain")
+@Deprecated
+public class ConditionChain implements ConditionCollection {
+ private Item item = null;
+ private Location location = null;
+ private Permission permission = null;
+ private Time time = null;
+ private Weather weather = null;
+ private Placeholder placeholder = null;
+ private MythicMob mythicMob = null;
+
+ public ConditionChain() {
+ }
+
+ private ConditionChain(Item item, Location location, Permission permission, Time time, Weather weather, Placeholder placeholder, MythicMob mythicMob) {
+ this.item = item;
+ this.location = location;
+ this.permission = permission;
+ this.time = time;
+ this.weather = weather;
+ this.mythicMob = mythicMob;
+ }
+
+ public static ConditionChain deserialize(Map map) {
+ TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
+ Item item = resolvingMap.getValue("item");
+ Location location = resolvingMap.getValue("location");
+ Permission permission = resolvingMap.getValue("permission");
+ Time time = resolvingMap.getValue("time");
+ Weather weather = resolvingMap.getValue("weather");
+ Placeholder placeholder = resolvingMap.getValueOrDefault("placeholder", null);
+ MythicMob mythicMob = resolvingMap.getValueOrDefault("mythicMob", null);
+ return new ConditionChain(item, location, permission, time, weather, placeholder, mythicMob);
+ }
+
+ /**
+ * Evaluates the conditions with an or operator.
+ *
+ * @param player player which should be checked
+ * @param world world of the door
+ * @param door door which is checked
+ * @param currentState the current state of the door
+ * @return result of the conditions.
+ */
+ @Override
+ public boolean or(Player player, World world, ConditionalDoor door, boolean currentState) {
+ // the conditions should be evaluated from the simpelest to the most expensive computation.
+ return ConditionChainEvaluator.or(player, world, door, currentState,
+ getConditions());
+ }
+
+ /**
+ * Evaluates the conditions with an and operator.
+ *
+ * @param player player which should be checked
+ * @param world world of the door
+ * @param door door which is checked
+ * @param currentState the current state of the door
+ * @return result of the conditions.
+ */
+ @Override
+
+ public boolean and(Player player, World world, ConditionalDoor door, boolean currentState) {
+ // the conditions should be evaluated from the simpelest to the most expensive computation.
+ return ConditionChainEvaluator.and(player, world, door, currentState,
+ getConditions());
+ }
+
+ /**
+ * Evaluates the chain with a custom evaluation string.
+ *
+ * @param string evaluator.
+ * @param player player which should be checked
+ * @param world world of the door
+ * @param door door which is checked
+ * @param currentState the current state of the door
+ * @return string with the values replaced.
+ */
+ @Override
+
+ public String custom(String string, Player player, World world, ConditionalDoor door, boolean currentState) {
+ return "null";
+ }
+
+ /**
+ * Checks if a key is present which needs a player lookup.
+ *
+ * @return true if a player key is present.
+ */
+ @Override
+
+ public boolean requiresPlayerEvaluation() {
+ return item != null || permission != null || location != null || placeholder != null;
+ }
+
+ /**
+ * Called when the door was evaluated and a new evaluation cycle begins.
+ */
+ @Override
+
+ public void evaluated() {
+ if (item != null) {
+ item.evaluated();
+ }
+ }
+
+ /**
+ * Called when the chain was true and the door was opened.
+ *
+ * @param player player which opened the door.
+ */
+ @Override
+
+ public void opened(Player player) {
+ if (item != null) {
+ item.opened(player);
+ }
+ }
+
+ @Override
+ public @NotNull Map serialize() {
+ return SerializationUtil.newBuilder()
+ .add("item", item)
+ .add("permission", permission)
+ .add("location", location)
+ .add("time", time)
+ .add("weather", weather)
+ .add("placeholder", placeholder)
+ .add("mythicMob", mythicMob)
+ .build();
+
+ }
+
+ /**
+ * Checks if all conditions are null.
+ *
+ * @return true if all conditions are nulkl
+ */
+ @Override
+
+ public boolean isEmpty() {
+ for (DoorCondition condition : getConditions()) {
+ if (condition != null) return false;
+ }
+ return true;
+ }
+
+ /**
+ * Get a mutable new condition chain with the same conditions like this condition chain.
+ *
+ * @return new condition chain.
+ */
+ @Override
+
+ public ConditionChain copy() {
+ return new ConditionChain(C.nonNullOrElse(item, Item::clone, null), C.nonNullOrElse(location, Location::clone, null),
+ C.nonNullOrElse(permission, Permission::clone, null), C.nonNullOrElse(time, Time::clone, null),
+ C.nonNullOrElse(weather, Weather::clone, null), C.nonNullOrElse(placeholder, Placeholder::clone, null),
+ C.nonNullOrElse(mythicMob, MythicMob::clone, null)
+ );
+ }
+
+ /**
+ * Get the conditions in a order from the less expensive to the most expensive computation time
+ *
+ * @return array of conditions. May contain null values.
+ */
+ @Override
+
+ public Collection getConditions() {
+ return Arrays.asList(location, time, weather, mythicMob, permission, item, placeholder);
+ }
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionCollection.java b/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionCollection.java
new file mode 100644
index 0000000..cd8a46e
--- /dev/null
+++ b/src/main/java/de/eldoria/bigdoorsopener/door/conditioncollections/ConditionCollection.java
@@ -0,0 +1,90 @@
+package de.eldoria.bigdoorsopener.door.conditioncollections;
+
+import de.eldoria.bigdoorsopener.conditions.DoorCondition;
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
+import de.eldoria.bigdoorsopener.util.ConditionChainEvaluator;
+import org.bukkit.World;
+import org.bukkit.configuration.serialization.ConfigurationSerializable;
+import org.bukkit.entity.Player;
+
+import java.util.Collection;
+
+public interface ConditionCollection extends ConfigurationSerializable, Cloneable {
+ /**
+ * Evaluates the conditions with an or operator.
+ *
+ * @param player player which should be checked
+ * @param world world of the door
+ * @param door door which is checked
+ * @param currentState the current state of the door
+ * @return result of the conditions.
+ */
+ default boolean or(Player player, World world, ConditionalDoor door, boolean currentState) {
+ return ConditionChainEvaluator.or(player, world, door, currentState, getConditions());
+ }
+
+ /**
+ * Evaluates the conditions with an and operator.
+ *
+ * @param player player which should be checked
+ * @param world world of the door
+ * @param door door which is checked
+ * @param currentState the current state of the door
+ * @return result of the conditions.
+ */
+ default boolean and(Player player, World world, ConditionalDoor door, boolean currentState) {
+ return ConditionChainEvaluator.and(player, world, door, currentState, getConditions());
+ }
+
+ /**
+ * Evaluates the chain with a custom evaluation string.
+ *
+ * @param string evaluator.
+ * @param player player which should be checked
+ * @param world world of the door
+ * @param door door which is checked
+ * @param currentState the current state of the door
+ * @return string with the values replaced.
+ */
+ public String custom(String string, Player player, World world, ConditionalDoor door, boolean currentState);
+
+ /**
+ * Called when the door was evaluated and a new evaluation cycle begins.
+ */
+ public void evaluated();
+
+ /**
+ * Called when the chain was true and the door was opened.
+ *
+ * @param player player which opened the door.
+ */
+ public void opened(Player player);
+
+ /**
+ * Checks if a key is present which needs a player lookup.
+ *
+ * @return true if a player key is present.
+ */
+ public boolean requiresPlayerEvaluation();
+
+ /**
+ * Checks if all conditions are null.
+ *
+ * @return true if all conditions are nulkl
+ */
+ public boolean isEmpty();
+
+ /**
+ * Get a mutable new condition chain with the same conditions like this condition chain.
+ *
+ * @return new condition chain.
+ */
+ public ConditionCollection copy();
+
+ /**
+ * Get the conditions in a order from the less expensive to the most expensive computation time
+ *
+ * @return array of conditions. May contain null values.
+ */
+ public Collection getConditions();
+}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/ConditionScope.java b/src/main/java/de/eldoria/bigdoorsopener/doors/ConditionScope.java
deleted file mode 100644
index 8ed88c3..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/ConditionScope.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.eldoria.bigdoorsopener.doors;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface ConditionScope {
-
- Scope value();
-
- public enum Scope {
- WORLD, PLAYER
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/ConditionChain.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/ConditionChain.java
deleted file mode 100644
index cf41ebd..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/ConditionChain.java
+++ /dev/null
@@ -1,340 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions;
-
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.item.Item;
-import de.eldoria.bigdoorsopener.doors.conditions.location.Location;
-import de.eldoria.bigdoorsopener.doors.conditions.permission.Permission;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.MythicMob;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.Placeholder;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.Time;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.Weather;
-import de.eldoria.bigdoorsopener.util.C;
-import de.eldoria.bigdoorsopener.util.ConditionChainEvaluator;
-import de.eldoria.eldoutilities.container.Pair;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import lombok.Getter;
-import lombok.Setter;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.ConfigurationSerializable;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A condition chain represents a set of multiple conditions.
- */
-@Setter
-@Getter
-@SerializableAs("conditionChain")
-public class ConditionChain implements ConfigurationSerializable, Cloneable {
- private Item item = null;
- private Location location = null;
- private Permission permission = null;
- private Time time = null;
- private Weather weather = null;
- private Placeholder placeholder = null;
- private MythicMob mythicMob = null;
-
- public ConditionChain() {
- }
-
- private ConditionChain(Item item, Location location, Permission permission, Time time, Weather weather, Placeholder placeholder, MythicMob mythicMob) {
- this.item = item;
- this.location = location;
- this.permission = permission;
- this.time = time;
- this.weather = weather;
- this.mythicMob = mythicMob;
- }
-
- public static ConditionChain deserialize(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- Item item = resolvingMap.getValue("item");
- Location location = resolvingMap.getValue("location");
- Permission permission = resolvingMap.getValue("permission");
- Time time = resolvingMap.getValue("time");
- Weather weather = resolvingMap.getValue("weather");
- Placeholder placeholder = resolvingMap.getValueOrDefault("placeholder", null);
- MythicMob mythicMob = resolvingMap.getValueOrDefault("mythicMob", null);
- return new ConditionChain(item, location, permission, time, weather, placeholder, mythicMob);
- }
-
- /**
- * Evaluates the conditions with an or operator.
- *
- * @param player player which should be checked
- * @param world world of the door
- * @param door door which is checked
- * @param currentState the current state of the door
- * @return result of the conditions.
- */
- public boolean or(Player player, World world, ConditionalDoor door, boolean currentState) {
- // the conditions should be evaluated from the simpelest to the most expensive computation.
- return ConditionChainEvaluator.or(player, world, door, currentState,
- this);
- }
-
- /**
- * Evaluates the conditions with an and operator.
- *
- * @param player player which should be checked
- * @param world world of the door
- * @param door door which is checked
- * @param currentState the current state of the door
- * @return result of the conditions.
- */
- public boolean and(Player player, World world, ConditionalDoor door, boolean currentState) {
- // the conditions should be evaluated from the simpelest to the most expensive computation.
- return ConditionChainEvaluator.and(player, world, door, currentState,
- this);
- }
-
- /**
- * Evaluates the chain with a custom evaluation string.
- *
- * @param string evaluator.
- * @param player player which should be checked
- * @param world world of the door
- * @param door door which is checked
- * @param currentState the current state of the door
- * @return string with the values replaced.
- */
- public String custom(String string, Player player, World world, ConditionalDoor door, boolean currentState) {
- String evaluationString = string;
-
- for (DoorCondition doorCondition : getConditions()) {
- if (doorCondition == null) {
- continue;
- }
- ConditionType.ConditionGroup condition = ConditionType.getType(doorCondition.getClass());
- if (condition == null) {
- BigDoorsOpener.logger().warning("Class " + doorCondition.getClass().getSimpleName() + " is not registered as condition type."
- + doorCondition.getClass().getSimpleName());
- continue;
- }
- Boolean state;
-
- if (doorCondition.getScope() == ConditionScope.Scope.PLAYER
- && player == null) {
- state = false;
- } else {
- state = doorCondition.isOpen(player, world, door, currentState);
- }
- evaluationString = evaluationString.replaceAll("(?i)" + condition.conditionParameter,
- String.valueOf(state));
- }
-
- evaluationString = evaluationString.replaceAll("(?i)currentState",
- String.valueOf(currentState));
-
- // make sure that calculation does not fail even when the condition is not set.
- for (ConditionType.ConditionGroup value : ConditionType.ConditionGroup.values()) {
- evaluationString = evaluationString.replaceAll("(?i)" + value.conditionParameter,
- "null");
- }
-
- return evaluationString;
- }
-
- /**
- * Checks if a key is present which needs a player lookup.
- *
- * @return true if a player key is present.
- */
- public boolean requiresPlayerEvaluation() {
- return item != null || permission != null || location != null || placeholder != null;
- }
-
- /**
- * Called when the door was evaluated and a new evaluation cycle begins.
- */
- public void evaluated() {
- if (item != null) {
- item.evaluated();
- }
- }
-
- /**
- * Called when the chain was true and the door was opened.
- *
- * @param player player which opened the door.
- */
- public void opened(Player player) {
- if (item != null) {
- item.used(player);
- }
- }
-
- @Override
- public @NotNull Map serialize() {
- return SerializationUtil.newBuilder()
- .add("item", item)
- .add("permission", permission)
- .add("location", location)
- .add("time", time)
- .add("weather", weather)
- .add("placeholder", placeholder)
- .add("mythicMob", mythicMob)
- .build();
-
- }
-
- /**
- * Checks if all conditions are null.
- *
- * @return true if all conditions are nulkl
- */
- public boolean isEmpty() {
- for (DoorCondition condition : getConditions()) {
- if (condition != null) return false;
- }
- return true;
- }
-
- /**
- * Get a mutable new condition chain with the same conditions like this condition chain.
- *
- * @return new condition chain.
- */
- public ConditionChain copy() {
- return new ConditionChain(C.nonNullOrElse(item, Item::clone, null), C.nonNullOrElse(location, Location::clone, null),
- C.nonNullOrElse(permission, Permission::clone, null), C.nonNullOrElse(time, Time::clone, null),
- C.nonNullOrElse(weather, Weather::clone, null), C.nonNullOrElse(placeholder, Placeholder::clone, null),
- C.nonNullOrElse(mythicMob, MythicMob::clone, null)
- );
- }
-
- /**
- * Get the conditions in a order from the less expensive to the most expensive computation time
- *
- * @return array of conditions. May contain null values.
- */
- public DoorCondition[] getConditions() {
- return new DoorCondition[] {location, time, weather, mythicMob, permission, item, placeholder};
- }
-
- /**
- * Get the conditions wrapped to identify them.
- *
- * @return List of wrappet conditions. conditions may be null.
- */
- public List> getConditionsWrapped() {
- return Arrays.asList(
- new Pair<>(location, ConditionType.ConditionGroup.LOCATION),
- new Pair<>(permission, ConditionType.ConditionGroup.PERMISSION),
- new Pair<>(time, ConditionType.ConditionGroup.TIME),
- new Pair<>(weather, ConditionType.ConditionGroup.WEATHER),
- new Pair<>(item, ConditionType.ConditionGroup.ITEM),
- new Pair<>(placeholder, ConditionType.ConditionGroup.PLACEHOLDER),
- new Pair<>(mythicMob, ConditionType.ConditionGroup.MYTHIC_MOB));
- }
-
- /**
- * Get a condition via enum value
- *
- * @param group group to get
- * @return condition
- */
- public DoorCondition getCondition(ConditionType.ConditionGroup group) {
- switch (group) {
- case ITEM:
- return item;
- case LOCATION:
- return location;
- case PERMISSION:
- return permission;
- case TIME:
- return time;
- case WEATHER:
- return weather;
- case PLACEHOLDER:
- return placeholder;
- case MYTHIC_MOB:
- return mythicMob;
- default:
- throw new IllegalStateException("Unexpected value: " + group);
- }
- }
-
- /**
- * Set a condition via enum value.
- *
- * @param group group to set
- * @param condition condition to set
- */
- public void setCondition(ConditionType.ConditionGroup group, @Nullable DoorCondition condition) {
- if (condition == null) {
- removeCondition(group);
- return;
- }
-
- switch (group) {
- case ITEM:
- item = (Item) condition;
- break;
- case LOCATION:
- location = (Location) condition;
- break;
- case PERMISSION:
- permission = (Permission) condition;
- break;
- case TIME:
- time = (Time) condition;
- break;
- case WEATHER:
- weather = (Weather) condition;
- break;
- case PLACEHOLDER:
- placeholder = (Placeholder) condition;
- break;
- case MYTHIC_MOB:
- mythicMob = (MythicMob) condition;
- break;
- default:
- throw new IllegalStateException("Unexpected value: " + group);
- }
- }
-
- /**
- * Remove a condition by enum value.
- *
- * @param group condition group to remove
- */
- public void removeCondition(ConditionType.ConditionGroup group) {
- switch (group) {
- case ITEM:
- item = null;
- break;
- case LOCATION:
- location = null;
- break;
- case PERMISSION:
- permission = null;
- break;
- case TIME:
- time = null;
- break;
- case WEATHER:
- weather = null;
- break;
- case PLACEHOLDER:
- placeholder = null;
- break;
- case MYTHIC_MOB:
- mythicMob = null;
- break;
- default:
- throw new IllegalStateException("Unexpected value: " + group);
- }
- }
-
-
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/ConditionType.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/ConditionType.java
deleted file mode 100644
index 1513938..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/ConditionType.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions;
-
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.item.Item;
-import de.eldoria.bigdoorsopener.doors.conditions.location.Location;
-import de.eldoria.bigdoorsopener.doors.conditions.permission.Permission;
-import de.eldoria.bigdoorsopener.doors.conditions.permission.PermissionNode;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.MythicMob;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.Placeholder;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.Time;
-import de.eldoria.bigdoorsopener.doors.conditions.standalone.Weather;
-import de.eldoria.bigdoorsopener.util.Permissions;
-
-public enum ConditionType {
- ITEM_CLICK(ConditionGroup.ITEM),
- ITEM_BLOCK(ConditionGroup.ITEM),
- ITEM_HOLDING(ConditionGroup.ITEM),
- ITEM_OWNING(ConditionGroup.ITEM),
- PROXIMITY(ConditionGroup.LOCATION),
- REGION(ConditionGroup.LOCATION),
- SIMPLE_REGION(ConditionGroup.LOCATION),
- PERMISSION_NODE(ConditionGroup.PERMISSION),
- DOOR_PERMISSION(ConditionGroup.PERMISSION),
- TIME(ConditionGroup.TIME),
- WEATHER(ConditionGroup.WEATHER),
- PLACEHOLDER(ConditionGroup.PLACEHOLDER),
- MYTHIC_MOBS(ConditionGroup.MYTHIC_MOB);
-
- public final ConditionGroup conditionGroup;
- public final String conditionName;
-
- ConditionType(ConditionGroup keyParameter) {
- this.conditionGroup = keyParameter;
- this.conditionName = name().replace("_", "").toLowerCase();
- }
-
- /**
- * Get the type from a string
- *
- * @param keyType string as type
- * @return
- */
- public static ConditionType getType(String keyType) {
- for (ConditionType value : values()) {
- if (value.conditionName.equalsIgnoreCase(keyType)) {
- return value;
- }
- }
- return null;
- }
-
- public static ConditionGroup getType(Class keyClass) {
- for (ConditionGroup value : ConditionGroup.values()) {
- if (value.keyClass.isAssignableFrom(keyClass)) {
- return value;
- }
- }
- return null;
- }
-
- public enum ConditionGroup {
- ITEM("item", "item", "info.item", Item.class, Permissions.ITEM_CONDITION),
- LOCATION("location", "", "info.location", Location.class, Permissions.LOCATION_CONDITION),
- PERMISSION("permission", "permission", "info.permission", Permission.class, Permissions.PERMISSION_CONDITION),
- TIME("time", "time", "info.time", Time.class, Permissions.TIME_CONDITION),
- WEATHER("weather", "weather", "info.weather", Weather.class, Permissions.WEATHER_CONDITION),
- PLACEHOLDER("placeholder", "placeholder", "info.placeholder", Placeholder.class, Permissions.PLACEHOLDER_CONDITION),
- MYTHIC_MOB("mythicMobs", "mythicMobs", "info.mythicmob", MythicMob.class, Permissions.MYTHIC_MOBS);
-
- public final String conditionParameter;
- public final String infoKey;
- public final Class extends DoorCondition> keyClass;
- public final String permission;
- private final String baseSetCommand;
-
- ConditionGroup(String conditionParameter, String baseSetCommand, String infoKey, Class keyClass, String permission) {
- this.conditionParameter = conditionParameter;
- this.baseSetCommand = baseSetCommand;
- this.infoKey = infoKey;
- this.keyClass = keyClass;
- this.permission = permission;
- }
-
- public String getBaseSetCommand(ConditionalDoor door) {
- return "/bdo setCondition " + door.getDoorUID() + " " + baseSetCommand + " ";
- }
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/DoorState.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/DoorState.java
deleted file mode 100644
index 26362b0..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/DoorState.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions;
-
-public enum DoorState {OPEN, CLOSED}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/ItemHolding.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/ItemHolding.java
deleted file mode 100644
index 44e5430..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/ItemHolding.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.item;
-
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.Map;
-
-/**
- * A key which will be open when the player is holding a key in his hand.
- */
-@SerializableAs("itemHoldingCondition")
-@ConditionScope(ConditionScope.Scope.PLAYER)
-public class ItemHolding extends Item {
- public ItemHolding(ItemStack item, boolean consumed) {
- super(item, consumed);
- }
-
- public static ItemHolding deserialize(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- ItemStack stack = resolvingMap.getValue("item");
- boolean consumed = resolvingMap.getValue("consumed");
- return new ItemHolding(stack, consumed);
- }
-
- @Override
- public void used(Player player) {
- if (!isConsumed()) return;
- tryTakeFromHands(player);
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- return hasPlayerItemInHand(player);
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.itemHolding",
- Replacement.create("NAME", ConditionType.ITEM_HOLDING.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(super.getDescription(localizer))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " itemHolding " + getItem().getAmount() + " " + isConsumed();
- }
-
- @Override
- public void evaluated() {
-
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/ItemOwning.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/ItemOwning.java
deleted file mode 100644
index 73e624f..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/ItemOwning.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.item;
-
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.Map;
-
-/**
- * A key which opens a doow, when the player has it in his inventory.
- */
-@SerializableAs("itemOwningCondition")
-@ConditionScope(ConditionScope.Scope.PLAYER)
-public class ItemOwning extends Item {
- public ItemOwning(ItemStack item, boolean consumed) {
- super(item, consumed);
- }
-
- @Override
- public void used(Player player) {
- if (!isConsumed()) return;
- takeFromInventory(player);
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- return hasPlayerItemInInventory(player);
- }
-
- public ItemOwning deserialize(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- ItemStack stack = resolvingMap.getValue("item");
- boolean consumed = resolvingMap.getValue("consumed");
- return new ItemOwning(stack, consumed);
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.itemOwning",
- Replacement.create("NAME", ConditionType.ITEM_OWNING.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(super.getDescription(localizer))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " itemOwning " + getItem().getAmount() + " " + isConsumed();
- }
-
- @Override
- public void evaluated() {
-
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/interacting/ItemBlock.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/interacting/ItemBlock.java
deleted file mode 100644
index aed664b..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/interacting/ItemBlock.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.item.interacting;
-
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.util.C;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import lombok.Setter;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.bukkit.event.block.Action;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-
-/**
- * A key which opens a door, when the player is clicking at a specific block
- */
-@SerializableAs("itemBlockCondition")
-@ConditionScope(ConditionScope.Scope.PLAYER)
-public class ItemBlock extends ItemInteraction {
-
- @Setter
- private BlockVector position;
-
- /**
- * Creates a new item block condition without a set position.
- * This object is incomplete and has to be initialized with the {@link #setPosition(BlockVector)} method before using.
- *
- * @param item
- * @param consumed
- */
- public ItemBlock(ItemStack item, boolean consumed) {
- super(item, consumed);
- }
-
- /**
- * Constructor used for serialization.
- *
- * @param position position of block
- * @param stack item stack of block
- * @param consumed true if item should be consumed.
- */
- private ItemBlock(BlockVector position, ItemStack stack, boolean consumed) {
- super(stack, consumed);
- this.position = position;
- }
-
- public static ItemBlock deserialize(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- BlockVector position = resolvingMap.getValue("position");
- ItemStack stack = resolvingMap.getValue("item");
- boolean consumed = resolvingMap.getValue("consumed");
- return new ItemBlock(position, stack, consumed);
- }
-
- @Override
- public void used(Player player) {
- if (!isConsumed()) return;
- takeFromInventory(player);
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- if (hasPlayerItemInHand(player)) {
- return super.isOpen(player, world, door, currentState);
- }
- return false;
- }
-
- @Override
- public void clicked(PlayerInteractEvent event, boolean available) {
- if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
- if (event.getClickedBlock().getLocation().toVector().toBlockVector().equals(position)) {
- event.setCancelled(true);
-
- super.clicked(event, available);
- }
- }
-
- @Override
- public @NotNull Map serialize() {
- return SerializationUtil.newBuilder(super.serialize())
- .add("position", position)
- .build();
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.itemBlock",
- Replacement.create("NAME", ConditionType.ITEM_BLOCK.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(TextComponent.builder(localizer.getMessage("conditionDesc.keyhole") + " ").color(C.baseColor))
- .append(TextComponent.builder(position.toString()).color(C.highlightColor))
- .append(TextComponent.newline())
- .append(super.getDescription(localizer))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " itemBlock " + getItem().getAmount() + " " + isConsumed();
- }
-
- @Override
- public ItemBlock clone() {
- return new ItemBlock(position, getItem(), isConsumed());
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/interacting/ItemClick.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/interacting/ItemClick.java
deleted file mode 100644
index f4a4b84..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/item/interacting/ItemClick.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.item.interacting;
-
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.Map;
-
-/**
- * A key which open the door, when right clicked.
- */
-@SerializableAs("itemClickCondition")
-@ConditionScope(ConditionScope.Scope.PLAYER)
-public class ItemClick extends ItemInteraction {
- public ItemClick(ItemStack item, boolean consumed) {
- super(item, consumed);
- }
-
- public static ItemClick deserialize(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- ItemStack stack = resolvingMap.getValue("item");
- boolean consumed = resolvingMap.getValue("consumed");
- return new ItemClick(stack, consumed);
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- if (hasPlayerItemInHand(player)) {
- return super.isOpen(player, world, door, currentState);
- }
- return false;
- }
-
- @Override
- public void used(Player player) {
- if (!isConsumed()) return;
- tryTakeFromHands(player);
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.itemClick",
- Replacement.create("NAME", ConditionType.ITEM_CLICK.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(super.getDescription(localizer))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " itemClick " + getItem().getAmount() + " " + isConsumed();
- }
-
-
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/location/Proximity.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/location/Proximity.java
deleted file mode 100644
index 14e02ab..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/location/Proximity.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.location;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.util.C;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.functions.TriFunction;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import de.eldoria.eldoutilities.utils.EnumUtil;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.bukkit.util.Vector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A condition which opens the door when the player is within a specific range of defined by geometric form
- */
-@SerializableAs("proximityCondition")
-@ConditionScope(ConditionScope.Scope.PLAYER)
-public class Proximity implements Location {
- private final Vector dimensions;
- private final ProximityForm proximityForm;
-
- public Proximity(Vector dimensions, ProximityForm proximityForm) {
- this.dimensions = dimensions;
- this.proximityForm = proximityForm;
- }
-
- public Proximity(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- dimensions = resolvingMap.getValue("dimensions");
- String formString = resolvingMap.getValue("proximityForm");
- formString = formString.replaceAll("(?i)elipsoid", "ellipsoid");
- proximityForm = EnumUtil.parse(formString, ProximityForm.class);
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- Vector vector = player.getLocation().toVector();
- return proximityForm.check.apply(door.getPosition(),
- new Vector(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()),
- dimensions);
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.proximity",
- Replacement.create("NAME", ConditionType.PROXIMITY.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(TextComponent.builder(localizer.getMessage("conditionDesc.size") + " ").color(C.baseColor))
- .append(TextComponent.builder(dimensions.toString()).color(C.highlightColor))
- .append(TextComponent.newline())
- .append(TextComponent.builder(localizer.getMessage("conditionDesc.proximityForm") + " ").color(C.baseColor))
- .append(TextComponent.builder(localizer.getMessage(proximityForm.localKey)).color(C.highlightColor))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " proximity "
- + dimensions.getX() + "," + dimensions.getY() + "," + dimensions.getZ()
- + " " + proximityForm.name().toLowerCase();
- }
-
- @Override
- public void evaluated() {
- }
-
- @Override
- public Proximity clone() {
- return new Proximity(dimensions, proximityForm);
- }
-
- @Override
- public @NotNull Map serialize() {
- return SerializationUtil.newBuilder()
- .add("dimensions", dimensions)
- .add("proximityForm", proximityForm)
- .build();
- }
-
- public enum ProximityForm {
- CUBOID("conditionDesc.proximityForm.cuboid",
- (point, target, dimensions) -> {
- if (Math.abs(point.getX() - target.getX()) > dimensions.getX()) return false;
- if (Math.abs(point.getY() - target.getY()) > dimensions.getY()) return false;
- return !(Math.abs(point.getZ() - target.getZ()) > dimensions.getZ());
- }),
- ELLIPSOID("conditionDesc.proximityForm.ellipsoid",
- (point, target, dimensions) ->
- Math.pow((target.getX() - point.getX()) / dimensions.getX(), 2)
- + Math.pow((target.getY() - point.getY()) / dimensions.getY(), 2)
- + Math.pow((target.getZ() - point.getZ()) / dimensions.getZ(), 2) <= 1),
- CYLINDER("conditionDesc.proximityForm.cylinder",
- (point, target, dimensions) -> {
- if (Math.abs(point.getY() - target.getY()) > dimensions.getY()) return false;
- return Math.pow(target.getX() - point.getX(), 2) / Math.pow(dimensions.getX(), 2)
- + Math.pow(target.getZ() - point.getZ(), 2) / Math.pow(dimensions.getZ(), 2) <= 1;
- });
-
- /**
- * point, target, dimension
- */
- public TriFunction check;
- public final String localKey;
-
- ProximityForm(String localKey, TriFunction check) {
- this.localKey = localKey;
- this.check = check;
- }
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/standalone/MythicMob.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/standalone/MythicMob.java
deleted file mode 100644
index 155f3fb..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/standalone/MythicMob.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.standalone;
-
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.doors.conditions.DoorCondition;
-import de.eldoria.bigdoorsopener.util.C;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-
-@ConditionScope(ConditionScope.Scope.WORLD)
-public class MythicMob implements DoorCondition {
- private final String mobType;
- private boolean state;
-
- public MythicMob(String mobType) {
- this.mobType = mobType;
- }
-
- public MythicMob(Map map) {
- mobType = SerializationUtil.mapOf(map).getValue("mobType");
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- if (BigDoorsOpener.isPlaceholderEnabled()) {
- return state;
- }
- BigDoorsOpener.logger().warning("A mythic mobs condition on door " + door.getDoorUID() + " was called but MythicMobs is not active.");
- return null;
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.mythicMob",
- Replacement.create("NAME", ConditionType.MYTHIC_MOBS.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(TextComponent.builder(localizer.getMessage("conditionDesc.mythicMob") + " ").color(C.baseColor))
- .append(TextComponent.builder(mobType).color(C.highlightColor))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " mythicMobs " + mobType;
- }
-
- @Override
- public String getRemoveCommand(ConditionalDoor door) {
- return REMOVE_COMMAND + door.getDoorUID() + " mythicMob";
- }
-
- @Override
- public void evaluated() {
- state = false;
- }
-
- @Override
- public MythicMob clone() {
- return new MythicMob(mobType);
- }
-
- @Override
- public @NotNull Map serialize() {
- return SerializationUtil.newBuilder()
- .add("mobType", mobType)
- .build();
- }
-
- public void killed(MythicMobDeathEvent event, boolean availableToOpen) {
- if (event.getMob().getType().getInternalName().equalsIgnoreCase(mobType)) {
- state = true;
- }
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/standalone/Placeholder.java b/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/standalone/Placeholder.java
deleted file mode 100644
index 9d7a67c..0000000
--- a/src/main/java/de/eldoria/bigdoorsopener/doors/conditions/standalone/Placeholder.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package de.eldoria.bigdoorsopener.doors.conditions.standalone;
-
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
-import de.eldoria.bigdoorsopener.doors.conditions.DoorCondition;
-import de.eldoria.bigdoorsopener.util.C;
-import de.eldoria.bigdoorsopener.util.TextColors;
-import de.eldoria.eldoutilities.localization.Localizer;
-import de.eldoria.eldoutilities.localization.Replacement;
-import de.eldoria.eldoutilities.serialization.SerializationUtil;
-import de.eldoria.eldoutilities.serialization.TypeResolvingMap;
-import me.clip.placeholderapi.PlaceholderAPI;
-import net.kyori.adventure.text.TextComponent;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-
-/**
- * A condition which uses the placeholder api.
- */
-@SerializableAs("placeholderCondition")
-@ConditionScope(ConditionScope.Scope.PLAYER)
-public class Placeholder implements DoorCondition {
-
- private final String evaluator;
-
- public Placeholder(String evaluator) {
- this.evaluator = evaluator;
- }
-
- public Placeholder(Map map) {
- TypeResolvingMap resolvingMap = SerializationUtil.mapOf(map);
- evaluator = resolvingMap.getValue("evaluator");
- }
-
- @Override
- public Boolean isOpen(Player player, World world, ConditionalDoor door, boolean currentState) {
- if (BigDoorsOpener.isPlaceholderEnabled()) {
- PlaceholderAPI.setPlaceholders(player, evaluator);
- return BigDoorsOpener.JS().eval(PlaceholderAPI.setPlaceholders(player, evaluator), null);
- }
- BigDoorsOpener.logger().warning("A placeholder condition on door " + door.getDoorUID() + " was called but PlaceholderAPI is not active.");
- return null;
- }
-
- @Override
- public TextComponent getDescription(Localizer localizer) {
- return TextComponent.builder(
- localizer.getMessage("conditionDesc.type.placeholder",
- Replacement.create("NAME", ConditionType.PLACEHOLDER.conditionName))).color(TextColors.AQUA)
- .append(TextComponent.newline())
- .append(TextComponent.builder(localizer.getMessage("conditionDesc.evaluator") + " ").color(C.baseColor))
- .append(TextComponent.builder(evaluator).color(C.highlightColor))
- .build();
- }
-
- @Override
- public String getCreationCommand(ConditionalDoor door) {
- return SET_COMMAND + door.getDoorUID() + " placeholder " + evaluator;
- }
-
- @Override
- public String getRemoveCommand(ConditionalDoor door) {
- return REMOVE_COMMAND + door.getDoorUID() + " placeholder";
- }
-
- @Override
- public void evaluated() {
-
- }
-
- @Override
- public Placeholder clone() {
- return new Placeholder(evaluator);
- }
-
- @Override
- public @NotNull Map serialize() {
- return SerializationUtil.newBuilder()
- .add("evaluator", evaluator)
- .build();
- }
-}
diff --git a/src/main/java/de/eldoria/bigdoorsopener/util/C.java b/src/main/java/de/eldoria/bigdoorsopener/util/C.java
index ec61f00..8ecf86a 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/util/C.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/util/C.java
@@ -6,6 +6,7 @@
import com.google.common.cache.LoadingCache;
import net.kyori.adventure.text.format.TextColor;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
@@ -13,6 +14,10 @@
* Pure utility class to save some global constants.
*/
public final class C {
+ /**
+ * A chaotic cache. Handle with care. ANARCHY!
+ */
+ public static final Cache> PLUGIN_CACHE = C.getExpiringCache(30, TimeUnit.SECONDS);
public static TextColor baseColor = TextColor.of(0, 170, 0);
public static TextColor highlightColor = TextColor.of(255, 170, 0);
diff --git a/src/main/java/de/eldoria/bigdoorsopener/util/CachingJSEngine.java b/src/main/java/de/eldoria/bigdoorsopener/util/CachingJSEngine.java
index 26a112f..3a2eda9 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/util/CachingJSEngine.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/util/CachingJSEngine.java
@@ -2,7 +2,7 @@
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
+import de.eldoria.bigdoorsopener.core.BigDoorsOpener;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
import javax.script.ScriptEngine;
diff --git a/src/main/java/de/eldoria/bigdoorsopener/util/ConditionChainEvaluator.java b/src/main/java/de/eldoria/bigdoorsopener/util/ConditionChainEvaluator.java
index adb6c5f..2c01c23 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/util/ConditionChainEvaluator.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/util/ConditionChainEvaluator.java
@@ -1,12 +1,18 @@
package de.eldoria.bigdoorsopener.util;
-import de.eldoria.bigdoorsopener.doors.ConditionScope;
-import de.eldoria.bigdoorsopener.doors.ConditionalDoor;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionChain;
-import de.eldoria.bigdoorsopener.doors.conditions.DoorCondition;
+import de.eldoria.bigdoorsopener.conditions.DoorCondition;
+import de.eldoria.bigdoorsopener.core.BigDoorsOpener;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionContainer;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionRegistrar;
+import de.eldoria.bigdoorsopener.core.conditions.Scope;
+import de.eldoria.bigdoorsopener.door.ConditionalDoor;
import org.bukkit.World;
import org.bukkit.entity.Player;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.logging.Level;
+
public class ConditionChainEvaluator {
private Boolean current;
@@ -20,9 +26,9 @@ public class ConditionChainEvaluator {
* @param conditions conditions to evaluate
* @return the result of the chain evaluator
*/
- public static boolean or(Player player, World world, ConditionalDoor door, boolean currentState, ConditionChain conditions) {
+ public static boolean or(Player player, World world, ConditionalDoor door, boolean currentState, Collection conditions) {
ConditionChainEvaluator evaluator = new ConditionChainEvaluator();
- for (DoorCondition doorCondition : conditions.getConditions()) {
+ for (DoorCondition doorCondition : conditions) {
evaluator.or(doorCondition, player, world, door, currentState);
}
@@ -39,9 +45,9 @@ public static boolean or(Player player, World world, ConditionalDoor door, boole
* @param conditions conditions to evaluate
* @return the result of the chain evaluator
*/
- public static boolean and(Player player, World world, ConditionalDoor door, boolean currentState, ConditionChain conditions) {
+ public static boolean and(Player player, World world, ConditionalDoor door, boolean currentState, Collection conditions) {
ConditionChainEvaluator evaluator = new ConditionChainEvaluator();
- for (DoorCondition doorCondition : conditions.getConditions()) {
+ for (DoorCondition doorCondition : conditions) {
evaluator.and(doorCondition, player, world, door, currentState);
}
@@ -63,9 +69,16 @@ public ConditionChainEvaluator or(DoorCondition doorCondition, Player player, Wo
if (current != null && current) return this;
+ Optional containerByClass = ConditionRegistrar.getContainerByClass(doorCondition.getClass());
+ if (!containerByClass.isPresent()) {
+ BigDoorsOpener.logger().log(Level.WARNING, "Condition " + doorCondition.getClass() + " is requested but not registered.");
+ return this;
+ }
+ ConditionContainer container = containerByClass.get();
+
Boolean open;
- if (doorCondition.getScope() == ConditionScope.Scope.PLAYER && player == null) {
+ if (container.getScope() == Scope.PLAYER && player == null) {
open = false;
} else {
open = doorCondition.isOpen(player, world, door, currentState);
@@ -101,9 +114,16 @@ public ConditionChainEvaluator and(DoorCondition doorCondition, Player player, W
if (current != null && !current) return this;
+ Optional containerByClass = ConditionRegistrar.getContainerByClass(doorCondition.getClass());
+ if (!containerByClass.isPresent()) {
+ BigDoorsOpener.logger().log(Level.WARNING, "Condition " + doorCondition.getClass() + " is requested but not registered.");
+ return this;
+ }
+ ConditionContainer container = containerByClass.get();
+
Boolean open;
- if (doorCondition.getScope() == ConditionScope.Scope.PLAYER && player == null) {
+ if (container.getScope() == Scope.PLAYER && player == null) {
open = false;
} else {
open = doorCondition.isOpen(player, world, door, currentState);
diff --git a/src/main/java/de/eldoria/bigdoorsopener/util/JsSyntaxHelper.java b/src/main/java/de/eldoria/bigdoorsopener/util/JsSyntaxHelper.java
index 70423f0..439a6d1 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/util/JsSyntaxHelper.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/util/JsSyntaxHelper.java
@@ -1,18 +1,16 @@
package de.eldoria.bigdoorsopener.util;
-import de.eldoria.bigdoorsopener.BigDoorsOpener;
-import de.eldoria.bigdoorsopener.doors.conditions.ConditionType;
+import de.eldoria.bigdoorsopener.core.BigDoorsOpener;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionRegistrar;
import de.eldoria.eldoutilities.container.Pair;
import de.eldoria.eldoutilities.utils.TextUtil;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.entity.Player;
import javax.script.ScriptException;
-import java.util.Arrays;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import java.util.stream.Collectors;
public final class JsSyntaxHelper {
@@ -20,9 +18,6 @@ public final class JsSyntaxHelper {
private static final Pattern ALLOWED_OPERATORS = Pattern.compile("&&|\\|\\||!=|==|!");
private static final Pattern UNALLOWED_OPERATORS = Pattern.compile("&|\\||=");
private static final Pattern SYNTAX = Pattern.compile("(\\||&|!|=|\\(|\\)|\\s|\\{|}|;)*");
- private static final String PLACEHOLDER = Arrays.stream(ConditionType.ConditionGroup.values())
- .map(ConditionType.ConditionGroup::name)
- .collect(Collectors.joining("|"));
private JsSyntaxHelper() {
@@ -65,7 +60,7 @@ public static Pair validateEvaluator(String evaluator,
}
- String cleaned = evaluator.replaceAll("(?i)if|true|false|" + PLACEHOLDER + "|currentState|null|else", "");
+ String cleaned = evaluator.replaceAll("(?i)if|true|false|" + getPlaceholder() + "|currentState|null|else", "");
Matcher matcher = VARIABLE.matcher(cleaned);
if (matcher.find()) {
return new Pair<>(ValidatorResult.INVALID_VARIABLE, matcher.group());
@@ -98,7 +93,7 @@ public static Pair validateEvaluator(String evaluator,
public static Pair checkExecution(String evaluator, CachingJSEngine engine, Player player, boolean vanilla) {
evaluator = translateEvaluator(evaluator);
- evaluator = evaluator.replaceAll("(?i)currentState|" + PLACEHOLDER, "true");
+ evaluator = evaluator.replaceAll("(?i)currentState|" + getPlaceholder(), "true");
if (BigDoorsOpener.isPlaceholderEnabled() && player != null && !vanilla) {
evaluator = PlaceholderAPI.setPlaceholders(player, evaluator);
@@ -115,6 +110,11 @@ public static Pair checkExecution(String evaluator, Cac
return new Pair<>(ValidatorResult.FINE, evaluator);
}
+ private static String getPlaceholder() {
+ return String.join("|", ConditionRegistrar.getGroups());
+
+ }
+
public enum ValidatorResult {
/**
* Indicates that the parenthesis on the string are not balanced
diff --git a/src/main/java/de/eldoria/bigdoorsopener/util/Permissions.java b/src/main/java/de/eldoria/bigdoorsopener/util/Permissions.java
index 3e13a22..af58006 100644
--- a/src/main/java/de/eldoria/bigdoorsopener/util/Permissions.java
+++ b/src/main/java/de/eldoria/bigdoorsopener/util/Permissions.java
@@ -1,5 +1,7 @@
package de.eldoria.bigdoorsopener.util;
+import de.eldoria.bigdoorsopener.core.conditions.ConditionContainer;
+
/**
* Class to store permission values.
* We dont like to store permissions where we need it. Otheriwse changing them would be a real pain.
@@ -31,7 +33,14 @@ public final class Permissions {
// permission to access all conditions
public static final String ALL_CONDITION = "bdo.condition.all";
-
private Permissions() {
}
+
+ public static String getConditionPermission(ConditionContainer container) {
+ return getConditionPermission(container.getGroup());
+ }
+
+ public static String getConditionPermission(String group) {
+ return "bdo.condition." + group;
+ }
}
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
index bb98881..4ddddf5 100644
--- a/src/main/resources/messages.properties
+++ b/src/main/resources/messages.properties
@@ -3,7 +3,9 @@ cloneDoor.message=Cloned door %SOURCE% to %TARGET%.
conditionDesc.clear=Clear
conditionDesc.close=Close at:
conditionDesc.consumed=Items consumed:
+conditionDesc.doorPermission=Access Level:
conditionDesc.downfall=Downfall
+conditionDesc.editor=Editor
conditionDesc.evaluator=Evaluator
conditionDesc.forceState=Force State:
conditionDesc.item=Item:
@@ -13,6 +15,7 @@ conditionDesc.minPoint=Min Point:
conditionDesc.mythicMob=Mythic Mob:
conditionDesc.open=Open at:
conditionDesc.openWhen=Open when:
+conditionDesc.owner=Owner
conditionDesc.permissionNode=Permission:
conditionDesc.proximityForm=Form:
conditionDesc.proximityForm.cuboid=Cuboid
@@ -32,6 +35,7 @@ conditionDesc.type.region=Region (%NAME%)
conditionDesc.type.simpleRegion=Simple Region (%NAME%)
conditionDesc.type.time=Time (%NAME%)
conditionDesc.type.weather=Weather (%NAME%)
+conditionDesc.user=User
conditionDesc.world=World:
copyCondition.copiedAll=Copied all conditions from %SOURCE% to %TARGET%.
copyCondition.copiedSingle=Copied condition %CONDITION% from %SOURCE% to %TARGET%.
@@ -40,6 +44,7 @@ error.conditionNotSet=This condition is not set.
error.doorNotFound=Door not found.
error.doorNotRegistered=This door is not registered.
error.executionFailed=Could not execute evaluator "%ERROR%".
+error.invalidAccessLevel=The entered access level is invalid.
error.invalidAmount=Invalid amount.
error.invalidArguments=Invalid arguments.\nSyntax: %SYNTAX%
error.invalidBoolean=Invalid boolean value.
@@ -48,19 +53,23 @@ error.invalidCommand=This command does not exist.
error.invalidConditionType=Invalid condition type.
error.invalidEvaluationType=This is not a valid evaluation type.
error.invalidForm=Invalid form.
+error.invalidMob=Invalid mob type
error.invalidNumber=Invalid number.
error.invalidOpenTime=Invalid open time.
error.invalidOperator="%ERROR%" is not a valid operator.
error.invalidRange=The entered value is invalid. Value must be between %MIN% and %MAX%.
+error.invalidState=Invalid State
error.invalidSyntax="%ERROR%" is not valid syntax.
error.invalidVariable="%ERROR%" is not a valid variable.
error.invalidVector=Invalid Vector.
error.invalidWeatherType=Invalid weather type.
+error.mythicMob=MythicMobs is currently not active.
error.noEvaluatorFound=No evaluator was found. Please enter one.
error.noItemConditionSet=No item condition is set for this door.
error.nonBooleanResult=Result is not a boolean "%ERROR%".
error.notAllowedFromConsole=This command can not be executed via console.
-error.permissionNode=You do not have the permissionNode to do this. (%PERMISSION%)
+error.notYourDoor=This is not your door.
+error.permission=You do not have the permission to do this. (%PERMISSION%)
error.placeholderNotFound=Placeholder API is currently not active.
error.playerNotFound=Player not found.
error.regionNotFound=Region not found.
@@ -94,9 +103,12 @@ info.info=Info:
info.item=Item:
info.location=Location:
info.mythicmob=Mythic Mobs:
-info.permissionNode=Permission:
+info.permission=Permission:
info.placeholder=Placeholder:
info.remove=remove
+info.state=State:
+info.state.disabled=disabled
+info.state.enabled=enabled
info.stayOpen=Stay open:
info.time=Time:
info.weather=Weather:
@@ -107,19 +119,20 @@ reload.completed=Reload complete.
removeCondition.item=Item condition removed.
removeCondition.location=Location condition removed.
removeCondition.mythicMob=Mythic Mobs condition removed.
-removeCondition.permissionNode=Permission condition removed.
+removeCondition.permission=Permission condition removed.
removeCondition.placeholder=Placeholder condition removed.
removeCondition.time=Time condition removed.
removeCondition.weather=Weather condition removed.
+setCondition.doorPermission=Permission set to Door Permission.
setCondition.firstPoint=Please click on the first point.
setCondition.itemBlockRegistered=Item condition set to Item Block.
setCondition.itemClick=Item condition set to Item Click.
setCondition.itemHolding=Item condition set to Item Holding.
setCondition.itemOwning=Item condition set to Item Owning.
setCondition.itemblock=Please click on a block which should be the keyhole.
+setCondition.mythicMob=MythicMob condition set.
setCondition.permissionNode=Permission condition set.
setCondition.placeholder=Placeholder condition set.
-setCondition.mythicMob=MythicMob condition set.
setCondition.proximity=Location condition set to Proximity.
setCondition.region=Location condition set to Region.
setCondition.secondPoint=Please click on the second point.
@@ -129,6 +142,8 @@ setCondition.weather=Weather condition set.\nOpen at: %OPEN%
setEvaluator.and=Using AND operator. Door will open if all conditions are true.
setEvaluator.custom=Using custom evaluator "%EVALUATOR%".
setEvaluator.or=Using OR operator. Door will open if one condition is true.
+setState.disabled=Door is currently not managed by Big Doors Opener.
+setState.enabled=Door is now managed by Big Doors Opener.
stayOpen.message=The door will stay open for at least %SECONDS% seconds when opened.
syntax.amount=amount
syntax.closeTime=closeTime
@@ -137,16 +152,19 @@ syntax.conditionValues=conditionValues
syntax.customEvaluator=customEvaluator
syntax.doorId=doorId
syntax.evaluationType=evaluationType
+syntax.mobType=mob type
syntax.openTime=openTime
syntax.player=player
syntax.proximityForm=proximityForm
syntax.seconds=seconds
syntax.sourceDoor=sourceDoorId
+syntax.state=state
syntax.targetDoor=targetDoorId
syntax.weatherType=weatherType
tabcomplete.consumed=consumed
tabcomplete.dimensions=dimensions
tabcomplete.doorId=doorId
+tabcomplete.doorPermission=doorPermission
tabcomplete.forceState=forceState
tabcomplete.permissionNode=own.permissionNode.node
tabcomplete.regionName=region name
@@ -157,13 +175,3 @@ unregister.message=Door %DOOR_NAME% unregistered.
warning.chainIsEmpty=The door has no conditions set. The door will not change its state. Maybe you want to unregister it instead.
warning.valueNotInEvaluator=The condition %VALUE% is missing in the evaluator. It will not have any influence on the door state yet.
warning.valueStillUsed=The condition %VALUE% is still present in the evaluator. The evaluation will probably not work till it is removed.
-error.mythicMob=MythicMobs is currently not active.
-syntax.mobType=mob type
-error.invalidMob=Invalid mob type
-conditionDesc.owner=Owner
-conditionDesc.user=User
-conditionDesc.editor=Editor
-conditionDesc.doorPermission=Access Level:
-tabcomplete.doorPermission=doorPermission
-error.invalidAccessLevel=The entered access level is invalid.
-setCondition.doorPermission=Permission set to Door Permission.
diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties
index 49b364d..9108a49 100644
--- a/src/main/resources/messages_de_DE.properties
+++ b/src/main/resources/messages_de_DE.properties
@@ -3,7 +3,9 @@ cloneDoor.message=Einstellungen von %SOURCE% auf %TARGET% kopiert.
conditionDesc.clear=Sonnig
conditionDesc.close=Schließt um:
conditionDesc.consumed=Items verbauchen:
+conditionDesc.doorPermission=Zugriffslevel:
conditionDesc.downfall=Regen
+conditionDesc.editor=Editor
conditionDesc.evaluator=Evaluator
conditionDesc.forceState=Erzwinge Zustand:
conditionDesc.item=Item:
@@ -13,6 +15,7 @@ conditionDesc.minPoint=Kleinster Punkt:
conditionDesc.mythicMob=Mythic Mob:
conditionDesc.open=Öffnet um:
conditionDesc.openWhen=Öffnet wenn:
+conditionDesc.owner=Owner
conditionDesc.permissionNode=Berechtigung:
conditionDesc.proximityForm=Annährungsregion:
conditionDesc.proximityForm.cuboid=Würfel
@@ -32,6 +35,7 @@ conditionDesc.type.region=Region (%NAME%)
conditionDesc.type.simpleRegion=Einfache Region (%NAME%)
conditionDesc.type.time=Zeit (%NAME%)
conditionDesc.type.weather=Wetter (%NAME%)
+conditionDesc.user=User
conditionDesc.world=Welt:
copyCondition.copiedAll=Alle Bedingungen von %SOURCE% wurden auf %TARGET% kopiert.
copyCondition.copiedSingle=%CONDITION% wurde von %SOURCE% auf %TARGET% kopiert.
@@ -40,6 +44,7 @@ error.conditionNotSet=Diese Bedingung ist nicht gesetzt.
error.doorNotFound=Tor nicht gefunden.
error.doorNotRegistered=Dieses Tor ist nicht registriert.
error.executionFailed=Formel konnte nicht ausgeführt werden "%ERROR%".
+error.invalidAccessLevel=Das eingegebene Zugriffslevel ist ungültig.
error.invalidAmount=Ungültige Anzahl.
error.invalidArguments=Ungültige Argumente.\nSyntax: %SYNTAX%
error.invalidBoolean=Ungültiger boolsche Wert.
@@ -48,19 +53,23 @@ error.invalidCommand=Dieser Befehl existiert nicht.
error.invalidConditionType=Ungültige Bedingung
error.invalidEvaluationType=Das ist kein gültiger Formel Typ.
error.invalidForm=Ungültige Form.
+error.invalidMob=Ungütliger Mob Typ
error.invalidNumber=Ungültige Nummer.
error.invalidOpenTime=Ungültige Öffnungszeit.
error.invalidOperator="%ERROR%" ist kein gültiger Operator.
error.invalidRange=Der eingegebene Wert ist ungültig. Er muss zwischen %MIN% und %MAX% liegen.
+error.invalidState=Ungültiger Status
error.invalidSyntax="%ERROR%" ist kein gültiger Syntax.
error.invalidVariable="%ERROR%" ist keine gültige Variable.
error.invalidVector=Ungültiger Vektor.
error.invalidWeatherType=Ungültiger Wettertyp.
+error.mythicMob=MythicMobs ist aktuell nicht aktiv.
error.noEvaluatorFound=Keine formal gefunden. Bitte gib eine Formel ein.
error.noItemConditionSet=Für dieses Tor ist keine Item Bedingung gesetzt.
error.nonBooleanResult=Ergebnis ist kein boolscher Wert "%ERROR%".
error.notAllowedFromConsole=Dieser Befehl kann nicht über die Konsole ausgeführt werden.
-error.permissionNode=Du hast nicht die Erlaubnis, dies zu tun. (%PERMISSION%)
+error.notYourDoor=Dies ist nicht dein Tor.
+error.permission=Du hast nicht die Erlaubnis, dies zu tun. (%PERMISSION%)
error.placeholderNotFound=Placeholder API ist aktuell nicht aktiv.
error.playerNotFound=Spieler nicht gefunden.
error.regionNotFound=Region nicht gefunden.
@@ -94,9 +103,12 @@ info.info=Info:
info.item=Item:
info.location=Ort:
info.mythicmob=Mythic Mobs:
-info.permissionNode=Berechtigung:
+info.permission=Berechtigung:
info.placeholder=Placeholder:
info.remove=entfernen
+info.state=Status:
+info.state.disabled=deaktiviert
+info.state.enabled=aktiviert
info.stayOpen=Offen bleiben:
info.time=Zeit:
info.weather=Wetter:
@@ -111,12 +123,14 @@ removeCondition.permission=Berechtigungs Bedingung entfernt.
removeCondition.placeholder=Placeholder Bedingung entfernt.
removeCondition.time=Zeit Bedingung entfernt.
removeCondition.weather=Wetter Bedingung entfernt.
+setCondition.doorPermission=Permission wurde auf DoorPermission gesetzt.
setCondition.firstPoint=Bitte klicke auf den ersten Punkt.
setCondition.itemBlockRegistered=Item Bedingung gesetzt auf Item Block.
setCondition.itemClick=Item Bedingung gesetzt auf Item Klick.
setCondition.itemHolding=Item Bedingung gesetzt auf Item Halten.
setCondition.itemOwning=Item Bedingung gesetzt auf Item Besitzen.
setCondition.itemblock=Bitte klicke auf einen Block um ihn als Schlüsselloch zu definieren.
+setCondition.mythicMob=MythicMob Bedingung gesetzt.
setCondition.permissionNode=Berechtigungs Bedingungen gesetzt.
setCondition.placeholder=Placeholder Bedingung aktiviert.
setCondition.proximity=Ortsbedinung gesetzt zu Umgebung.
@@ -128,6 +142,8 @@ setCondition.weather=Wetter Bedingung gesetzt.\nÖffnet bei: %OPEN%
setEvaluator.and=Nutze UND Operator. Tor wird sich öffnen, wenn alle Bedingungen zutreffen.
setEvaluator.custom=Nutze Formel "%EVALUATOR%".
setEvaluator.or=Nutze ODER Operator. Tor wird sich öffnen, wenn eine Bedingung zutrifft.
+setState.disabled=Dieses Tor wird derzeit nicht von Big Doors Opener verwaltet.
+setState.enabled=Dieses Tor wird nunr von Big Doors Opener verwaltet.
stayOpen.message=Das Tor wird für mindestens %SECONDS% sekunden offen sein, wenn es geöffnet wurde.
syntax.amount=Anzahl
syntax.closeTime=Schließzeit
@@ -136,16 +152,19 @@ syntax.conditionValues=Bedingungs Argumente
syntax.customEvaluator=Evaluierungs Formel
syntax.doorId=TorId
syntax.evaluationType=Evaluatierungs Form
+syntax.mobType=mob typ
syntax.openTime=Öffnungszeit
syntax.player=Spieler
syntax.proximityForm=AnnäherungsForm
syntax.seconds=Sekunden
syntax.sourceDoor=HerkunftsTorId
+syntax.state=status
syntax.targetDoor=ZielTorId
syntax.weatherType=WetterTyp
tabcomplete.consumed=Verbraucht
tabcomplete.dimensions=Größe
tabcomplete.doorId=
+tabcomplete.doorPermission=torBerechtigung
tabcomplete.forceState=Erzwinge Zustand
tabcomplete.permissionNode=eigene.permissionNode.node
tabcomplete.regionName=Region Name
@@ -156,11 +175,3 @@ unregister.message=Tor %DOOR_NAME% wurde entfernt.
warning.chainIsEmpty=Dieses Tor hat derzeit keine Bedingungen. Der Zustand wird sich nicht verändern. Vielleicht möchtest du sie lieber entfernen.
warning.valueNotInEvaluator=Der Bedingung %VALUE% fehlt in der aktuellen Formel. Sie wird derzeit keinerlei Auswirkungen haben.
warning.valueStillUsed=Die Bedingung %VALUE% wird noch in der Formel benutzt. Der berechnete Zustand wird eventuell nicht korrekt sein.
-setCondition.mythicMob=MythicMob Bedingung gesetzt.
-conditionDesc.owner=Owner
-conditionDesc.user=User
-conditionDesc.editor=Editor
-conditionDesc.doorPermission=Zugriffslevel:
-tabcomplete.doorPermission=torBerechtigung
-error.invalidAccessLevel=Das eingegebene Zugriffslevel ist ungültig.
-setCondition.doorPermission=Permission wurde auf DoorPermission gesetzt.
diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties
index 79854b4..4ddddf5 100644
--- a/src/main/resources/messages_en_US.properties
+++ b/src/main/resources/messages_en_US.properties
@@ -3,7 +3,9 @@ cloneDoor.message=Cloned door %SOURCE% to %TARGET%.
conditionDesc.clear=Clear
conditionDesc.close=Close at:
conditionDesc.consumed=Items consumed:
+conditionDesc.doorPermission=Access Level:
conditionDesc.downfall=Downfall
+conditionDesc.editor=Editor
conditionDesc.evaluator=Evaluator
conditionDesc.forceState=Force State:
conditionDesc.item=Item:
@@ -13,6 +15,7 @@ conditionDesc.minPoint=Min Point:
conditionDesc.mythicMob=Mythic Mob:
conditionDesc.open=Open at:
conditionDesc.openWhen=Open when:
+conditionDesc.owner=Owner
conditionDesc.permissionNode=Permission:
conditionDesc.proximityForm=Form:
conditionDesc.proximityForm.cuboid=Cuboid
@@ -32,6 +35,7 @@ conditionDesc.type.region=Region (%NAME%)
conditionDesc.type.simpleRegion=Simple Region (%NAME%)
conditionDesc.type.time=Time (%NAME%)
conditionDesc.type.weather=Weather (%NAME%)
+conditionDesc.user=User
conditionDesc.world=World:
copyCondition.copiedAll=Copied all conditions from %SOURCE% to %TARGET%.
copyCondition.copiedSingle=Copied condition %CONDITION% from %SOURCE% to %TARGET%.
@@ -40,6 +44,7 @@ error.conditionNotSet=This condition is not set.
error.doorNotFound=Door not found.
error.doorNotRegistered=This door is not registered.
error.executionFailed=Could not execute evaluator "%ERROR%".
+error.invalidAccessLevel=The entered access level is invalid.
error.invalidAmount=Invalid amount.
error.invalidArguments=Invalid arguments.\nSyntax: %SYNTAX%
error.invalidBoolean=Invalid boolean value.
@@ -48,19 +53,23 @@ error.invalidCommand=This command does not exist.
error.invalidConditionType=Invalid condition type.
error.invalidEvaluationType=This is not a valid evaluation type.
error.invalidForm=Invalid form.
+error.invalidMob=Invalid mob type
error.invalidNumber=Invalid number.
error.invalidOpenTime=Invalid open time.
error.invalidOperator="%ERROR%" is not a valid operator.
error.invalidRange=The entered value is invalid. Value must be between %MIN% and %MAX%.
+error.invalidState=Invalid State
error.invalidSyntax="%ERROR%" is not valid syntax.
error.invalidVariable="%ERROR%" is not a valid variable.
error.invalidVector=Invalid Vector.
error.invalidWeatherType=Invalid weather type.
+error.mythicMob=MythicMobs is currently not active.
error.noEvaluatorFound=No evaluator was found. Please enter one.
error.noItemConditionSet=No item condition is set for this door.
error.nonBooleanResult=Result is not a boolean "%ERROR%".
error.notAllowedFromConsole=This command can not be executed via console.
-error.permissionNode=You do not have the permissionNode to do this. (%PERMISSION%)
+error.notYourDoor=This is not your door.
+error.permission=You do not have the permission to do this. (%PERMISSION%)
error.placeholderNotFound=Placeholder API is currently not active.
error.playerNotFound=Player not found.
error.regionNotFound=Region not found.
@@ -94,9 +103,12 @@ info.info=Info:
info.item=Item:
info.location=Location:
info.mythicmob=Mythic Mobs:
-info.permissionNode=Permission:
+info.permission=Permission:
info.placeholder=Placeholder:
info.remove=remove
+info.state=State:
+info.state.disabled=disabled
+info.state.enabled=enabled
info.stayOpen=Stay open:
info.time=Time:
info.weather=Weather:
@@ -107,16 +119,18 @@ reload.completed=Reload complete.
removeCondition.item=Item condition removed.
removeCondition.location=Location condition removed.
removeCondition.mythicMob=Mythic Mobs condition removed.
-removeCondition.permissionNode=Permission condition removed.
+removeCondition.permission=Permission condition removed.
removeCondition.placeholder=Placeholder condition removed.
removeCondition.time=Time condition removed.
removeCondition.weather=Weather condition removed.
+setCondition.doorPermission=Permission set to Door Permission.
setCondition.firstPoint=Please click on the first point.
setCondition.itemBlockRegistered=Item condition set to Item Block.
setCondition.itemClick=Item condition set to Item Click.
setCondition.itemHolding=Item condition set to Item Holding.
setCondition.itemOwning=Item condition set to Item Owning.
setCondition.itemblock=Please click on a block which should be the keyhole.
+setCondition.mythicMob=MythicMob condition set.
setCondition.permissionNode=Permission condition set.
setCondition.placeholder=Placeholder condition set.
setCondition.proximity=Location condition set to Proximity.
@@ -128,6 +142,8 @@ setCondition.weather=Weather condition set.\nOpen at: %OPEN%
setEvaluator.and=Using AND operator. Door will open if all conditions are true.
setEvaluator.custom=Using custom evaluator "%EVALUATOR%".
setEvaluator.or=Using OR operator. Door will open if one condition is true.
+setState.disabled=Door is currently not managed by Big Doors Opener.
+setState.enabled=Door is now managed by Big Doors Opener.
stayOpen.message=The door will stay open for at least %SECONDS% seconds when opened.
syntax.amount=amount
syntax.closeTime=closeTime
@@ -136,16 +152,19 @@ syntax.conditionValues=conditionValues
syntax.customEvaluator=customEvaluator
syntax.doorId=doorId
syntax.evaluationType=evaluationType
+syntax.mobType=mob type
syntax.openTime=openTime
syntax.player=player
syntax.proximityForm=proximityForm
syntax.seconds=seconds
syntax.sourceDoor=sourceDoorId
+syntax.state=state
syntax.targetDoor=targetDoorId
syntax.weatherType=weatherType
tabcomplete.consumed=consumed
tabcomplete.dimensions=dimensions
tabcomplete.doorId=doorId
+tabcomplete.doorPermission=doorPermission
tabcomplete.forceState=forceState
tabcomplete.permissionNode=own.permissionNode.node
tabcomplete.regionName=region name
@@ -156,11 +175,3 @@ unregister.message=Door %DOOR_NAME% unregistered.
warning.chainIsEmpty=The door has no conditions set. The door will not change its state. Maybe you want to unregister it instead.
warning.valueNotInEvaluator=The condition %VALUE% is missing in the evaluator. It will not have any influence on the door state yet.
warning.valueStillUsed=The condition %VALUE% is still present in the evaluator. The evaluation will probably not work till it is removed.
-setCondition.mythicMob=MythicMob condition set.
-conditionDesc.owner=Owner
-conditionDesc.user=User
-conditionDesc.editor=Editor
-conditionDesc.doorPermission=Access Level:
-tabcomplete.doorPermission=doorPermission
-error.invalidAccessLevel=The entered access level is invalid.
-setCondition.doorPermission=Permission set to Door Permission.
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 2c408ce..faa0611 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -2,7 +2,7 @@ name: ${project.name}
description: ${project.description}
author: Hadde
version: ${project.version}
-main: de.eldoria.bigdoorsopener.BigDoorsOpener
+main: de.eldoria.bigdoorsopener.core.BigDoorsOpener
website: www.spigotmc.org/resources/80805/
api-version: 1.13
depend: [BigDoors]