9
0
mirror of https://github.com/Xiao-MoMi/Custom-Fishing.git synced 2025-12-19 15:09:24 +00:00
This commit is contained in:
XiaoMoMi
2024-08-30 23:42:49 +08:00
parent 6f54585538
commit b149e08ba1
17 changed files with 541 additions and 262 deletions

View File

@@ -33,6 +33,7 @@ import net.momirealms.customfishing.api.mechanic.item.ItemManager;
import net.momirealms.customfishing.api.mechanic.loot.LootManager;
import net.momirealms.customfishing.api.mechanic.market.MarketManager;
import net.momirealms.customfishing.api.mechanic.misc.cooldown.CoolDownManager;
import net.momirealms.customfishing.api.mechanic.misc.hologram.HologramManager;
import net.momirealms.customfishing.api.mechanic.misc.placeholder.PlaceholderManager;
import net.momirealms.customfishing.api.mechanic.requirement.RequirementManager;
import net.momirealms.customfishing.api.mechanic.statistic.StatisticsManager;
@@ -84,6 +85,7 @@ public abstract class BukkitCustomFishingPlugin implements CustomFishingPlugin {
protected TotemManager totemManager;
protected FishingManager fishingManager;
protected GameManager gameManager;
protected HologramManager hologramManager;
/**
* Constructs a new BukkitCustomFishingPlugin instance.
@@ -358,6 +360,15 @@ public abstract class BukkitCustomFishingPlugin implements CustomFishingPlugin {
return translationManager;
}
/**
* Retrieves the HologramManager.
*
* @return the {@link HologramManager}
*/
public HologramManager getHologramManager() {
return hologramManager;
}
/**
* Logs a debug message.
*

View File

@@ -35,11 +35,11 @@ public interface ActionManager<T> extends Reloadable {
/**
* Registers a custom action type with its corresponding factory.
*
* @param type The type identifier of the action.
* @param actionFactory The factory responsible for creating instances of the action.
* @param type The type identifier of the action.
* @return True if registration was successful, false if the type is already registered.
*/
boolean registerAction(String type, ActionFactory<T> actionFactory);
boolean registerAction(ActionFactory<T> actionFactory, String... type);
/**
* Unregisters a custom action type.

View File

@@ -31,5 +31,6 @@ public enum ActionTrigger {
TIMER,
INTERACT,
REEL,
NEW_SIZE_RECORD
NEW_SIZE_RECORD,
END
}

View File

@@ -207,6 +207,7 @@ public abstract class AbstractGamingPlayer implements GamingPlayer, Runnable {
* Ends the game for the gaming player.
*/
protected void endGame() {
if (!isValid()) return;
destroy();
boolean success = isSuccessful();
BukkitCustomFishingPlugin.getInstance().getScheduler().sync().run(() -> {

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) <2024> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customfishing.api.mechanic.misc.hologram;
import net.momirealms.sparrow.heart.feature.entity.FakeNamedEntity;
import org.bukkit.entity.Player;
import java.util.HashSet;
import java.util.Set;
public class Hologram {
private final FakeNamedEntity entity;
private Set<Player> set1 = new HashSet<>();
private int ticksRemaining = 0;
public Hologram(FakeNamedEntity entity) {
this.entity = entity;
}
public void name(String json) {
entity.name(json);
}
public void destroy() {
for (Player player : set1) {
entity.destroy(player);
}
set1.clear();
}
public void setTicksRemaining(int ticks) {
ticksRemaining = ticks;
}
public boolean reduceTicks() {
ticksRemaining--;
return ticksRemaining < 0;
}
public void updateNearbyPlayers(Set<Player> set2) {
Set<Player> intersectionSet = new HashSet<>(set1);
intersectionSet.retainAll(set2);
Set<Player> uniqueToSet1 = new HashSet<>(set1);
uniqueToSet1.removeAll(set2);
Set<Player> uniqueToSet2 = new HashSet<>(set2);
uniqueToSet2.removeAll(set1);
for (Player p : uniqueToSet1) {
entity.destroy(p);
}
for (Player p : uniqueToSet2) {
entity.spawn(p);
}
for (Player p : intersectionSet) {
entity.updateMetaData(p);
}
set1 = set2;
}
}

View File

@@ -0,0 +1,100 @@
/*
* Copyright (C) <2024> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customfishing.api.mechanic.misc.hologram;
import net.momirealms.customfishing.api.BukkitCustomFishingPlugin;
import net.momirealms.customfishing.common.helper.VersionHelper;
import net.momirealms.customfishing.common.plugin.feature.Reloadable;
import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask;
import net.momirealms.sparrow.heart.SparrowHeart;
import net.momirealms.sparrow.heart.feature.entity.FakeNamedEntity;
import net.momirealms.sparrow.heart.feature.entity.armorstand.FakeArmorStand;
import net.momirealms.sparrow.heart.feature.entity.display.FakeTextDisplay;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class HologramManager implements Reloadable {
private final BukkitCustomFishingPlugin plugin;
private final ConcurrentHashMap<Location, Hologram> holograms = new ConcurrentHashMap<>();
private SchedulerTask task;
public HologramManager(BukkitCustomFishingPlugin plugin) {
this.plugin = plugin;
}
@Override
public void load() {
this.task = plugin.getScheduler().sync().runRepeating(() -> {
ArrayList<Location> toRemove = new ArrayList<>();
for (Map.Entry<Location, Hologram> entry : holograms.entrySet()) {
if (entry.getValue().reduceTicks()) {
toRemove.add(entry.getKey());
entry.getValue().destroy();
}
}
for (Location location : toRemove) {
holograms.remove(location);
}
}, 1,1, null);
}
@Override
public void unload() {
if (this.task != null) {
this.task.cancel();
}
for (Hologram hologram : holograms.values()) {
hologram.destroy();
}
holograms.clear();
}
public void createHologram(Location location, String json, int ticks, boolean displayEntity, int[] rgba, Set<Player> viewers) {
Hologram hologram = holograms.get(location);
if (hologram == null) {
FakeNamedEntity fakeNamedEntity;
if (displayEntity && VersionHelper.isVersionNewerThan1_19_4()) {
FakeTextDisplay textDisplay = SparrowHeart.getInstance().createFakeTextDisplay(location);
textDisplay.rgba(rgba[0], rgba[1], rgba[2], rgba[3]);
fakeNamedEntity = textDisplay;
} else {
FakeArmorStand armorStand = SparrowHeart.getInstance().createFakeArmorStand(location);
armorStand.small(true);
armorStand.invisible(true);
fakeNamedEntity = armorStand;
}
hologram = new Hologram(fakeNamedEntity);
hologram.name(json);
hologram.updateNearbyPlayers(viewers);
hologram.setTicksRemaining(ticks);
holograms.put(location, hologram);
} else {
hologram.name(json);
hologram.updateNearbyPlayers(viewers);
hologram.setTicksRemaining(ticks);
}
}
}

View File

@@ -35,11 +35,11 @@ public interface RequirementManager<T> extends Reloadable {
/**
* Registers a custom requirement type with its corresponding factory.
*
* @param type The type identifier of the requirement.
* @param requirementFactory The factory responsible for creating instances of the requirement.
* @param type The type identifier of the requirement.
* @return True if registration was successful, false if the type is already registered.
*/
boolean registerRequirement(@NotNull String type, @NotNull RequirementFactory<T> requirementFactory);
boolean registerRequirement(@NotNull RequirementFactory<T> requirementFactory, @NotNull String... type);
/**
* Unregisters a custom requirement type.

View File

@@ -39,7 +39,7 @@ import java.util.stream.Collectors;
public class WorldGuardRegion {
public static void register() {
BukkitCustomFishingPlugin.getInstance().getRequirementManager().registerRequirement("region", (args, notSatisfiedActions, runActions) -> {
BukkitCustomFishingPlugin.getInstance().getRequirementManager().registerRequirement((args, notSatisfiedActions, runActions) -> {
HashSet<String> regions = new HashSet<>();
boolean other;
int mode = 1;
@@ -92,6 +92,6 @@ public class WorldGuardRegion {
if (runActions) ActionManager.trigger(context, notSatisfiedActions);
return false;
};
});
}, "region");
}
}

View File

@@ -22,6 +22,7 @@ import net.momirealms.customfishing.api.event.CustomFishingReloadEvent;
import net.momirealms.customfishing.api.mechanic.MechanicType;
import net.momirealms.customfishing.api.mechanic.config.ConfigManager;
import net.momirealms.customfishing.api.mechanic.misc.cooldown.CoolDownManager;
import net.momirealms.customfishing.api.mechanic.misc.hologram.HologramManager;
import net.momirealms.customfishing.api.mechanic.misc.placeholder.BukkitPlaceholderManager;
import net.momirealms.customfishing.api.util.EventUtils;
import net.momirealms.customfishing.bukkit.action.BukkitActionManager;
@@ -137,6 +138,7 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin {
this.translationManager = new TranslationManager(this);
this.integrationManager = new BukkitIntegrationManager(this);
this.gameManager = new BukkitGameManager(this);
this.hologramManager = new HologramManager(this);
this.commandManager = new BukkitCommandManager(this);
this.commandManager.registerDefaultFeatures();
@@ -196,6 +198,7 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin {
this.bagManager.reload();
this.storageManager.reload();
this.fishingManager.reload();
this.hologramManager.reload();
this.itemManager.load();
this.eventManager.load();
@@ -230,6 +233,7 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin {
this.bagManager.disable();
this.integrationManager.disable();
this.storageManager.disable();
this.hologramManager.disable();
this.commandManager.unregisterFeatures();
}

View File

@@ -37,6 +37,7 @@ import net.momirealms.customfishing.api.util.PlayerUtils;
import net.momirealms.customfishing.bukkit.integration.VaultHook;
import net.momirealms.customfishing.bukkit.util.LocationUtils;
import net.momirealms.customfishing.common.helper.AdventureHelper;
import net.momirealms.customfishing.common.helper.VersionHelper;
import net.momirealms.customfishing.common.locale.MessageConstants;
import net.momirealms.customfishing.common.locale.TranslationManager;
import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask;
@@ -45,7 +46,9 @@ import net.momirealms.customfishing.common.util.ListUtils;
import net.momirealms.customfishing.common.util.Pair;
import net.momirealms.customfishing.common.util.RandomUtils;
import net.momirealms.sparrow.heart.SparrowHeart;
import net.momirealms.sparrow.heart.feature.armorstand.FakeArmorStand;
import net.momirealms.sparrow.heart.feature.entity.FakeEntity;
import net.momirealms.sparrow.heart.feature.entity.armorstand.FakeArmorStand;
import net.momirealms.sparrow.heart.feature.entity.display.FakeItemDisplay;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -89,9 +92,13 @@ public class BukkitActionManager implements ActionManager<Player> {
}
@Override
public boolean registerAction(String type, ActionFactory<Player> actionFactory) {
public boolean registerAction(ActionFactory<Player> actionFactory, String... types) {
for (String type : types) {
if (this.actionFactoryMap.containsKey(type)) return false;
}
for (String type : types) {
this.actionFactoryMap.put(type, actionFactory);
}
return true;
}
@@ -155,7 +162,7 @@ public class BukkitActionManager implements ActionManager<Player> {
this.registerCloseInvAction();
this.registerExpAction();
this.registerFoodAction();
this.registerChainAction();
this.registerBuildAction();
this.registerMoneyAction();
this.registerItemAction();
this.registerPotionAction();
@@ -168,7 +175,7 @@ public class BukkitActionManager implements ActionManager<Player> {
}
private void registerMessageAction() {
registerAction("message", (args, chance) -> {
registerAction((args, chance) -> {
List<String> messages = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -178,8 +185,8 @@ public class BukkitActionManager implements ActionManager<Player> {
audience.sendMessage(AdventureHelper.miniMessage(text));
}
};
});
registerAction("random-message", (args, chance) -> {
}, "message");
registerAction((args, chance) -> {
List<String> messages = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -188,8 +195,8 @@ public class BukkitActionManager implements ActionManager<Player> {
Audience audience = plugin.getSenderFactory().getAudience(context.holder());
audience.sendMessage(AdventureHelper.miniMessage(random));
};
});
registerAction("broadcast", (args, chance) -> {
}, "random-message");
registerAction((args, chance) -> {
List<String> messages = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -201,8 +208,8 @@ public class BukkitActionManager implements ActionManager<Player> {
}
}
};
});
registerAction("message-nearby", (args, chance) -> {
}, "broadcast");
registerAction((args, chance) -> {
if (args instanceof Section section) {
List<String> messages = ListUtils.toList(section.get("message"));
MathValue<Player> range = MathValue.auto(section.get("range"));
@@ -230,11 +237,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at message-nearby action which should be Section");
return Action.empty();
}
});
}, "message-nearby");
}
private void registerCommandAction() {
registerAction("command", (args, chance) -> {
registerAction((args, chance) -> {
List<String> commands = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -245,8 +252,8 @@ public class BukkitActionManager implements ActionManager<Player> {
}
}, null);
};
});
registerAction("player-command", (args, chance) -> {
}, "command");
registerAction((args, chance) -> {
List<String> commands = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -257,8 +264,8 @@ public class BukkitActionManager implements ActionManager<Player> {
}
}, context.holder().getLocation());
};
});
registerAction("random-command", (args, chance) -> {
}, "player-command");
registerAction((args, chance) -> {
List<String> commands = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -269,8 +276,8 @@ public class BukkitActionManager implements ActionManager<Player> {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), finalRandom);
}, null);
};
});
registerAction("command-nearby", (args, chance) -> {
}, "random-command");
registerAction((args, chance) -> {
if (args instanceof Section section) {
List<String> cmd = ListUtils.toList(section.get("command"));
MathValue<Player> range = MathValue.auto(section.get("range"));
@@ -293,18 +300,18 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at command-nearby action which should be Section");
return Action.empty();
}
});
}, "command-nearby");
}
private void registerCloseInvAction() {
registerAction("close-inv", (args, chance) -> condition -> {
registerAction((args, chance) -> condition -> {
if (Math.random() > chance) return;
condition.holder().closeInventory();
});
}, "close-inv");
}
private void registerActionBarAction() {
registerAction("actionbar", (args, chance) -> {
registerAction((args, chance) -> {
String text = (String) args;
return context -> {
if (Math.random() > chance) return;
@@ -312,8 +319,8 @@ public class BukkitActionManager implements ActionManager<Player> {
Component component = AdventureHelper.miniMessage(plugin.getPlaceholderManager().parse(context.holder(), text, context.placeholderMap()));
audience.sendActionBar(component);
};
});
registerAction("random-actionbar", (args, chance) -> {
}, "actionbar");
registerAction((args, chance) -> {
List<String> texts = ListUtils.toList(args);
return context -> {
if (Math.random() > chance) return;
@@ -322,8 +329,8 @@ public class BukkitActionManager implements ActionManager<Player> {
Audience audience = plugin.getSenderFactory().getAudience(context.holder());
audience.sendActionBar(AdventureHelper.miniMessage(random));
};
});
registerAction("actionbar-nearby", (args, chance) -> {
}, "random-actionbar");
registerAction((args, chance) -> {
if (args instanceof Section section) {
String actionbar = section.getString("actionbar");
MathValue<Player> range = MathValue.auto(section.get("range"));
@@ -345,11 +352,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at actionbar-nearby action which should be Section");
return Action.empty();
}
});
}, "actionbar-nearby");
}
private void registerExpAction() {
registerAction("mending", (args, chance) -> {
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
@@ -357,8 +364,8 @@ public class BukkitActionManager implements ActionManager<Player> {
ExperienceOrb entity = player.getLocation().getWorld().spawn(player.getLocation().clone().add(0,0.5,0), ExperienceOrb.class);
entity.setExperience((int) value.evaluate(context));
};
});
registerAction("exp", (args, chance) -> {
}, "mending");
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
@@ -367,38 +374,38 @@ public class BukkitActionManager implements ActionManager<Player> {
Audience audience = plugin.getSenderFactory().getAudience(player);
AdventureHelper.playSound(audience, Sound.sound(Key.key("minecraft:entity.experience_orb.pickup"), Sound.Source.PLAYER, 1, 1));
};
});
registerAction("level", (args, chance) -> {
}, "exp");
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
Player player = context.holder();
player.setLevel((int) Math.max(0, player.getLevel() + value.evaluate(context)));
};
});
}, "level");
}
private void registerFoodAction() {
registerAction("food", (args, chance) -> {
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
Player player = context.holder();
player.setFoodLevel((int) (player.getFoodLevel() + value.evaluate(context)));
};
});
registerAction("saturation", (args, chance) -> {
}, "food");
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
Player player = context.holder();
player.setSaturation((float) (player.getSaturation() + value.evaluate(context)));
};
});
}, "saturation");
}
private void registerItemAction() {
registerAction("item-amount", (args, chance) -> {
registerAction((args, chance) -> {
if (args instanceof Section section) {
boolean mainOrOff = section.getString("hand", "main").equalsIgnoreCase("main");
int amount = section.getInt("amount", 1);
@@ -417,8 +424,8 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at item-amount action which is expected to be `Section`");
return Action.empty();
}
});
registerAction("durability", (args, chance) -> {
}, "item-amount");
registerAction((args, chance) -> {
if (args instanceof Section section) {
EquipmentSlot slot = Optional.ofNullable(section.getString("slot"))
.map(hand -> EquipmentSlot.valueOf(hand.toUpperCase(Locale.ENGLISH)))
@@ -450,8 +457,8 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at durability action which is expected to be `Section`");
return Action.empty();
}
});
registerAction("give-item", (args, chance) -> {
}, "durability");
registerAction((args, chance) -> {
if (args instanceof Section section) {
String id = section.getString("item");
int amount = section.getInt("amount", 1);
@@ -480,11 +487,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at give-item action which is expected to be `Section`");
return Action.empty();
}
});
}, "give-item");
}
private void registerChainAction() {
registerAction("chain", (args, chance) -> {
private void registerBuildAction() {
registerAction((args, chance) -> {
List<Action<Player>> actions = new ArrayList<>();
if (args instanceof Section section) {
for (Map.Entry<String, Object> entry : section.getStringRouteMappedValues(false).entrySet()) {
@@ -499,8 +506,8 @@ public class BukkitActionManager implements ActionManager<Player> {
action.trigger(context);
}
};
});
registerAction("delay", (args, chance) -> {
}, "chain");
registerAction((args, chance) -> {
List<Action<Player>> actions = new ArrayList<>();
int delay;
boolean async;
@@ -531,8 +538,8 @@ public class BukkitActionManager implements ActionManager<Player> {
}, delay, location);
}
};
});
registerAction("timer", (args, chance) -> {
}, "delay");
registerAction((args, chance) -> {
List<Action<Player>> actions = new ArrayList<>();
int delay, duration, period;
boolean async;
@@ -571,8 +578,8 @@ public class BukkitActionManager implements ActionManager<Player> {
}
plugin.getScheduler().asyncLater(task::cancel, duration * 50L, TimeUnit.MILLISECONDS);
};
});
registerAction("conditional", (args, chance) -> {
}, "timer");
registerAction((args, chance) -> {
if (args instanceof Section section) {
Action<Player>[] actions = parseActions(section.getSection("actions"));
Requirement<Player>[] requirements = plugin.getRequirementManager().parseRequirements(section.getSection("conditions"), true);
@@ -591,8 +598,8 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at conditional action which is expected to be `Section`");
return Action.empty();
}
});
registerAction("priority", (args, chance) -> {
}, "conditional");
registerAction((args, chance) -> {
if (args instanceof Section section) {
List<Pair<Requirement<Player>[], Action<Player>[]>> conditionActionPairList = new ArrayList<>();
for (Map.Entry<String, Object> entry : section.getStringRouteMappedValues(false).entrySet()) {
@@ -623,32 +630,32 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at priority action which is expected to be `Section`");
return Action.empty();
}
});
}, "priority");
}
private void registerMoneyAction() {
registerAction("give-money", (args, chance) -> {
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
if (!VaultHook.isHooked()) return;
VaultHook.deposit(context.holder(), value.evaluate(context));
};
});
registerAction("take-money", (args, chance) -> {
}, "give-money");
registerAction((args, chance) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() > chance) return;
if (!VaultHook.isHooked()) return;
VaultHook.withdraw(context.holder(), value.evaluate(context));
};
});
}, "take-money");
}
// The registry name changes a lot
@SuppressWarnings("deprecation")
private void registerPotionAction() {
registerAction("potion-effect", (args, chance) -> {
registerAction((args, chance) -> {
if (args instanceof Section section) {
PotionEffect potionEffect = new PotionEffect(
Objects.requireNonNull(PotionEffectType.getByName(section.getString("type", "BLINDNESS").toUpperCase(Locale.ENGLISH))),
@@ -663,11 +670,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at potion-effect action which is expected to be `Section`");
return Action.empty();
}
});
}, "potion-effect");
}
private void registerSoundAction() {
registerAction("sound", (args, chance) -> {
registerAction((args, chance) -> {
if (args instanceof Section section) {
Sound sound = Sound.sound(
Key.key(section.getString("key")),
@@ -684,12 +691,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at sound action which is expected to be `Section`");
return Action.empty();
}
});
}, "sound");
}
private void registerPluginExpAction() {
registerAction("plugin-exp", (args, chance) -> {
registerAction((args, chance) -> {
if (args instanceof Section section) {
String pluginName = section.getString("plugin");
MathValue<Player> value = MathValue.auto(section.get("exp"));
@@ -704,11 +710,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at plugin-exp action which is expected to be `Section`");
return Action.empty();
}
});
}, "plugin-exp");
}
private void registerTitleAction() {
registerAction("title", (args, chance) -> {
registerAction((args, chance) -> {
if (args instanceof Section section) {
TextValue<Player> title = TextValue.auto(section.getString("title", ""));
TextValue<Player> subtitle = TextValue.auto(section.getString("subtitle", ""));
@@ -729,8 +735,8 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at title action which is expected to be `Section`");
return Action.empty();
}
});
registerAction("random-title", (args, chance) -> {
}, "title");
registerAction((args, chance) -> {
if (args instanceof Section section) {
List<String> titles = section.getStringList("titles");
if (titles.isEmpty()) titles.add("");
@@ -755,8 +761,8 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at random-title action which is expected to be `Section`");
return Action.empty();
}
});
registerAction("title-nearby", (args, chance) -> {
}, "random-title");
registerAction((args, chance) -> {
if (args instanceof Section section) {
TextValue<Player> title = TextValue.auto(section.getString("title"));
TextValue<Player> subtitle = TextValue.auto(section.getString("subtitle"));
@@ -783,11 +789,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at title-nearby action which is expected to be `Section`");
return Action.empty();
}
});
}, "title-nearby");
}
private void registerFakeItemAction() {
registerAction("fake-item", ((args, chance) -> {
registerAction(((args, chance) -> {
if (args instanceof Section section) {
String itemID = section.getString("item", "");
String[] split = itemID.split(":");
@@ -800,17 +806,28 @@ public class BukkitActionManager implements ActionManager<Player> {
MathValue<Player> yaw = MathValue.auto(section.get("yaw", 0));
int range = section.getInt("range", 0);
boolean opposite = section.getBoolean("opposite-yaw", false);
boolean useItemDisplay = section.getBoolean("use-item-display", false);
String finalItemID = itemID;
return context -> {
if (Math.random() > chance) return;
Player owner = context.holder();
Location location = position ? requireNonNull(context.arg(ContextKeys.OTHER_LOCATION)).clone() : owner.getLocation().clone();
location.add(x.evaluate(context), y.evaluate(context) - 1, z.evaluate(context));
location.setPitch(0);
if (opposite) location.setYaw(-owner.getLocation().getYaw());
else location.setYaw((float) yaw.evaluate(context));
FakeEntity fakeEntity;
if (useItemDisplay && VersionHelper.isVersionNewerThan1_19_4()) {
location.add(0,1.5,0);
FakeItemDisplay itemDisplay = SparrowHeart.getInstance().createFakeItemDisplay(location);
itemDisplay.item(plugin.getItemManager().buildInternal(context, finalItemID));
fakeEntity = itemDisplay;
} else {
FakeArmorStand armorStand = SparrowHeart.getInstance().createFakeArmorStand(location);
armorStand.invisible(true);
armorStand.equipment(EquipmentSlot.HEAD, plugin.getItemManager().buildInternal(context, finalItemID));
fakeEntity = armorStand;
}
ArrayList<Player> viewers = new ArrayList<>();
if (range > 0) {
for (Player player : location.getWorld().getPlayers()) {
@@ -822,12 +839,12 @@ public class BukkitActionManager implements ActionManager<Player> {
viewers.add(owner);
}
for (Player player : viewers) {
armorStand.spawn(player);
fakeEntity.spawn(player);
}
plugin.getScheduler().asyncLater(() -> {
for (Player player : viewers) {
if (player.isOnline() && player.isValid()) {
armorStand.destroy(player);
fakeEntity.destroy(player);
}
}
}, (long) (duration.evaluate(context) * 50), TimeUnit.MILLISECONDS);
@@ -836,11 +853,11 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at fake-item action which is expected to be `Section`");
return Action.empty();
}
}));
}), "fake-item");
}
private void registerHologramAction() {
registerAction("hologram", ((args, chance) -> {
registerAction(((args, chance) -> {
if (args instanceof Section section) {
TextValue<Player> text = TextValue.auto(section.getString("text", ""));
MathValue<Player> duration = MathValue.auto(section.get("duration", 20));
@@ -848,17 +865,20 @@ public class BukkitActionManager implements ActionManager<Player> {
MathValue<Player> x = MathValue.auto(section.get("x", 0));
MathValue<Player> y = MathValue.auto(section.get("y", 0));
MathValue<Player> z = MathValue.auto(section.get("z", 0));
String rgbaStr = section.getString("rgba", "0,0,0,0");
int[] rgba = new int[4];
String[] split = rgbaStr.split(",");
for (int i = 0; i < split.length; i++) {
rgba[i] = Integer.parseInt(split[i]);
}
int range = section.getInt("range", 16);
boolean useTextDisplay = section.getBoolean("use-text-display", false);
return context -> {
if (Math.random() > chance) return;
Player owner = context.holder();
Location location = position ? requireNonNull(context.arg(ContextKeys.OTHER_LOCATION)).clone() : owner.getLocation().clone();
location.add(x.evaluate(context), y.evaluate(context), z.evaluate(context));
FakeArmorStand armorStand = SparrowHeart.getInstance().createFakeArmorStand(location);
armorStand.invisible(true);
armorStand.small(true);
armorStand.name(AdventureHelper.miniMessageToJson(text.render(context)));
ArrayList<Player> viewers = new ArrayList<>();
HashSet<Player> viewers = new HashSet<>();
if (range > 0) {
for (Player player : location.getWorld().getPlayers()) {
if (LocationUtils.getDistance(player.getLocation(), location) <= range) {
@@ -868,26 +888,17 @@ public class BukkitActionManager implements ActionManager<Player> {
} else {
viewers.add(owner);
}
for (Player player : viewers) {
armorStand.spawn(player);
}
plugin.getScheduler().asyncLater(() -> {
for (Player player : viewers) {
if (player.isOnline() && player.isValid()) {
armorStand.destroy(player);
}
}
}, (long) (duration.evaluate(context) * 50), TimeUnit.MILLISECONDS);
plugin.getHologramManager().createHologram(location, AdventureHelper.miniMessageToJson(text.render(context)), (int) duration.evaluate(context), useTextDisplay, rgba, viewers);
};
} else {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at hologram action which is expected to be `Section`");
return Action.empty();
}
}));
}), "hologram");
}
private void registerFishFindAction() {
registerAction("fish-finder", (args, chance) -> {
registerAction((args, chance) -> {
String surrounding;
if (args instanceof Boolean b) {
surrounding = b ? "lava" : "water";
@@ -920,7 +931,7 @@ public class BukkitActionManager implements ActionManager<Player> {
plugin.getSenderFactory().wrap(context.holder()).sendMessage(TranslationManager.render(MessageConstants.COMMAND_FISH_FINDER_POSSIBLE_LOOTS.arguments(AdventureHelper.miniMessage(stringJoiner.toString())).build()));
}
};
});
}, "fish-finder");
}
/**
@@ -951,7 +962,7 @@ public class BukkitActionManager implements ActionManager<Player> {
for (Class<? extends ActionExpansion<Player>> expansionClass : classes) {
ActionExpansion<Player> expansion = expansionClass.getDeclaredConstructor().newInstance();
unregisterAction(expansion.getActionType());
registerAction(expansion.getActionType(), expansion.getActionFactory());
registerAction(expansion.getActionFactory(), expansion.getActionType());
plugin.getPluginLogger().info("Loaded action expansion: " + expansion.getActionType() + "[" + expansion.getVersion() + "]" + " by " + expansion.getAuthor() );
}
} catch (InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) {

View File

@@ -45,6 +45,7 @@ import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
@@ -80,9 +81,13 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
}
@Override
public boolean registerRequirement(@NotNull String type, @NotNull RequirementFactory<Player> requirementFactory) {
public boolean registerRequirement(@NotNull RequirementFactory<Player> requirementFactory, @NotNull String... types) {
for (String type : types) {
if (this.requirementFactoryMap.containsKey(type)) return false;
}
for (String type : types) {
this.requirementFactoryMap.put(type, requirementFactory);
}
return true;
}
@@ -188,17 +193,20 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
this.registerItemInHandRequirement();
this.registerImpossibleRequirement();
this.registerPotionEffectRequirement();
this.registerSneakRequirement();
this.registerGameModeRequirement();
this.registerEquipmentRequirement();
}
private void registerImpossibleRequirement() {
registerRequirement("impossible", ((args, actions, runActions) -> context -> {
registerRequirement(((args, actions, runActions) -> context -> {
if (runActions) ActionManager.trigger(context, actions);
return false;
}));
}), "impossible");
}
private void registerCompetitionRequirement() {
registerRequirement("competition", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
boolean onCompetition = section.getBoolean("ongoing", true);
List<String> ids = section.contains("id") ? ListUtils.toList(section.get("id")) : List.of();
@@ -225,11 +233,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at competition requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "competition");
}
private void registerInBagRequirement() {
registerRequirement("in-fishingbag", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean arg = (boolean) args;
return context -> {
boolean inBag = Optional.ofNullable(context.arg(ContextKeys.IN_BAG)).orElse(false);
@@ -237,11 +245,30 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "in-fishingbag");
}
private void registerEquipmentRequirement() {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
EquipmentSlot slot = EquipmentSlot.valueOf(section.getString("slot","HEAD").toUpperCase(Locale.ENGLISH));
List<String> items = ListUtils.toList(section.get("item"));
return context -> {
ItemStack itemStack = context.holder().getInventory().getItem(slot);
String id = plugin.getItemManager().getItemID(itemStack);
if (items.contains(id)) return true;
if (runActions) ActionManager.trigger(context, actions);
return false;
};
} else {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at equipment requirement which is expected be `Section`");
return Requirement.empty();
}
}, "equipment");
}
private void registerItemInHandRequirement() {
registerRequirement("item-in-hand", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
boolean mainOrOff = section.getString("hand","main").equalsIgnoreCase("main");
int amount = section.getInt("amount", 1);
@@ -259,11 +286,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at item-in-hand requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "item-in-hand");
}
private void registerPluginLevelRequirement() {
registerRequirement("plugin-level", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
String pluginName = section.getString("plugin");
int level = section.getInt("level");
@@ -283,11 +310,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at plugin-level requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "plugin-level");
}
private void registerTimeRequirement() {
registerRequirement("time", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
List<String> list = ListUtils.toList(args);
List<Pair<Integer, Integer>> timePairs = list.stream().map(line -> {
String[] split = line.split("~");
@@ -302,11 +329,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "time");
}
private void registerYRequirement() {
registerRequirement("ypos", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
List<String> list = ListUtils.toList(args);
List<Pair<Double, Double>> posPairs = list.stream().map(line -> {
String[] split = line.split("~");
@@ -321,11 +348,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "ypos");
}
private void registerOrRequirement() {
registerRequirement("||", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
Requirement<Player>[] requirements = parseRequirements(section, runActions);
return context -> {
@@ -339,11 +366,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at || requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "||");
}
private void registerAndRequirement() {
registerRequirement("&&", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
Requirement<Player>[] requirements = parseRequirements(section, runActions);
return context -> {
@@ -360,11 +387,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at && requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "&&");
}
private void registerInWaterRequirement() {
registerRequirement("in-water", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean inWater = (boolean) args;
return context -> {
boolean in_water = Optional.ofNullable(context.arg(ContextKeys.SURROUNDING)).orElse("").equals(EffectProperties.WATER_FISHING.key());
@@ -372,11 +399,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "in-water");
}
private void registerInVoidRequirement() {
registerRequirement("in-void", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean inVoid = (boolean) args;
return context -> {
boolean in_void = Optional.ofNullable(context.arg(ContextKeys.SURROUNDING)).orElse("").equals(EffectProperties.VOID_FISHING.key());
@@ -384,12 +411,12 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "in-void");
}
private void registerInLavaRequirement() {
// Deprecated requirement type
registerRequirement("lava-fishing", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean inLava = (boolean) args;
if (!inLava) {
// in water
@@ -407,8 +434,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("in-lava", (args, actions, runActions) -> {
}, "lava-fishing");
registerRequirement((args, actions, runActions) -> {
boolean inLava = (boolean) args;
return context -> {
boolean in_lava = Optional.ofNullable(context.arg(ContextKeys.SURROUNDING)).orElse("").equals(EffectProperties.LAVA_FISHING.key());
@@ -416,11 +443,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "in-lava");
}
private void registerRodRequirement() {
registerRequirement("rod", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> rods = new HashSet<>(ListUtils.toList(args));
return context -> {
String id = context.arg(ContextKeys.ROD);
@@ -428,8 +455,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!rod", (args, actions, runActions) -> {
}, "rod");
registerRequirement((args, actions, runActions) -> {
HashSet<String> rods = new HashSet<>(ListUtils.toList(args));
return context -> {
String id = context.arg(ContextKeys.ROD);
@@ -437,11 +464,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!rod");
}
private void registerGroupRequirement() {
registerRequirement("group", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> groups = new HashSet<>(ListUtils.toList(args));
return context -> {
String lootID = context.arg(ContextKeys.ID);
@@ -455,8 +482,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!group", (args, actions, runActions) -> {
}, "group");
registerRequirement((args, actions, runActions) -> {
HashSet<String> groups = new HashSet<>(ListUtils.toList(args));
return context -> {
String lootID = context.arg(ContextKeys.ID);
@@ -474,11 +501,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!group");
}
private void registerLootRequirement() {
registerRequirement("loot", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> arg = new HashSet<>(ListUtils.toList(args));
return context -> {
String lootID = context.arg(ContextKeys.ID);
@@ -486,8 +513,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!loot", (args, actions, runActions) -> {
}, "loot");
registerRequirement((args, actions, runActions) -> {
HashSet<String> arg = new HashSet<>(ListUtils.toList(args));
return context -> {
String lootID = context.arg(ContextKeys.ID);
@@ -495,11 +522,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!loot");
}
private void registerHookRequirement() {
registerRequirement("hook", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> hooks = new HashSet<>(ListUtils.toList(args));
return context -> {
String id = context.arg(ContextKeys.HOOK);
@@ -507,8 +534,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!hook", (args, actions, runActions) -> {
}, "hook");
registerRequirement((args, actions, runActions) -> {
HashSet<String> hooks = new HashSet<>(ListUtils.toList(args));
return context -> {
String id = context.arg(ContextKeys.HOOK);
@@ -516,8 +543,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("has-hook", (args, actions, runActions) -> {
}, "!hook");
registerRequirement((args, actions, runActions) -> {
boolean has = (boolean) args;
return context -> {
String id = context.arg(ContextKeys.HOOK);
@@ -526,11 +553,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "has-hook");
}
private void registerBaitRequirement() {
registerRequirement("bait", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> arg = new HashSet<>(ListUtils.toList(args));
return context -> {
String id = context.arg(ContextKeys.BAIT);
@@ -538,8 +565,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!bait", (args, actions, runActions) -> {
}, "bait");
registerRequirement((args, actions, runActions) -> {
HashSet<String> arg = new HashSet<>(ListUtils.toList(args));
return context -> {
String id = context.arg(ContextKeys.BAIT);
@@ -547,8 +574,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("has-bait", (args, actions, runActions) -> {
}, "!bait");
registerRequirement((args, actions, runActions) -> {
boolean has = (boolean) args;
return context -> {
String id = context.arg(ContextKeys.BAIT);
@@ -557,11 +584,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "has-bait");
}
private void registerSizeRequirement() {
registerRequirement("has-size", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean has = (boolean) args;
return context -> {
float size = Optional.ofNullable(context.arg(ContextKeys.SIZE)).orElse(-1f);
@@ -570,11 +597,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "has-size");
}
private void registerOpenWaterRequirement() {
registerRequirement("open-water", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean openWater = (boolean) args;
return context -> {
boolean current = Optional.ofNullable(context.arg(ContextKeys.OPEN_WATER)).orElse(false);
@@ -583,11 +610,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "open-water");
}
private void registerHasStatsRequirement() {
registerRequirement("has-stats", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean has = (boolean) args;
return context -> {
String loot = context.arg(ContextKeys.ID);
@@ -599,11 +626,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "has-stats");
}
private void registerLootTypeRequirement() {
registerRequirement("loot-type", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
List<String> types = ListUtils.toList(args);
return context -> {
String loot = context.arg(ContextKeys.ID);
@@ -615,8 +642,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!loot-type", (args, actions, runActions) -> {
}, "loot-type");
registerRequirement((args, actions, runActions) -> {
List<String> types = ListUtils.toList(args);
return context -> {
String loot = context.arg(ContextKeys.ID);
@@ -628,22 +655,22 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!loot-type");
}
private void registerListRequirement() {
registerRequirement("list", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
plugin.getPluginLogger().severe("It seems that you made a mistake where you put \"list\" into \"conditions\" section.");
plugin.getPluginLogger().warn("list:");
for (String e : ListUtils.toList(args)) {
plugin.getPluginLogger().warn(" - " + e);
}
return Requirement.empty();
});
}, "list");
}
private void registerEnvironmentRequirement() {
registerRequirement("environment", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
List<String> environments = ListUtils.toList(args);
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.LOCATION));
@@ -652,8 +679,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!environment", (args, actions, runActions) -> {
}, "environment");
registerRequirement((args, actions, runActions) -> {
List<String> environments = ListUtils.toList(args);
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.LOCATION));
@@ -662,11 +689,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!environment");
}
private void registerIceFishingRequirement() {
registerRequirement("ice-fishing", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
boolean iceFishing = (boolean) args;
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.OTHER_LOCATION));
@@ -686,11 +713,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "ice-fishing");
}
private void registerLevelRequirement() {
registerRequirement("level", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
int current = context.holder().getLevel();
@@ -699,11 +726,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "level");
}
private void registerMoneyRequirement() {
registerRequirement("money", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
double current = VaultHook.getBalance(context.holder());
@@ -712,11 +739,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "money");
}
private void registerRandomRequirement() {
registerRequirement("random", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
MathValue<Player> value = MathValue.auto(args);
return context -> {
if (Math.random() < value.evaluate(context, true))
@@ -724,11 +751,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "random");
}
private void registerBiomeRequirement() {
registerRequirement("biome", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> biomes = new HashSet<>(ListUtils.toList(args));
return context -> {
Location location = requireNonNull(Optional.ofNullable(context.arg(ContextKeys.OTHER_LOCATION)).orElse(context.arg(ContextKeys.LOCATION)));
@@ -738,8 +765,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!biome", (args, actions, runActions) -> {
}, "biome");
registerRequirement((args, actions, runActions) -> {
HashSet<String> biomes = new HashSet<>(ListUtils.toList(args));
return context -> {
Location location = requireNonNull(Optional.ofNullable(context.arg(ContextKeys.OTHER_LOCATION)).orElse(context.arg(ContextKeys.LOCATION)));
@@ -749,11 +776,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!biome");
}
private void registerMoonPhaseRequirement() {
registerRequirement("moon-phase", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> moonPhases = new HashSet<>(ListUtils.toList(args));
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.LOCATION));
@@ -763,8 +790,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!moon-phase", (args, actions, runActions) -> {
}, "moon-phase");
registerRequirement((args, actions, runActions) -> {
HashSet<String> moonPhases = new HashSet<>(ListUtils.toList(args));
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.LOCATION));
@@ -774,11 +801,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!moon-phase");
}
private void registerWorldRequirement() {
registerRequirement("world", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> worlds = new HashSet<>(ListUtils.toList(args));
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.LOCATION));
@@ -787,8 +814,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!world", (args, actions, runActions) -> {
}, "world");
registerRequirement((args, actions, runActions) -> {
HashSet<String> worlds = new HashSet<>(ListUtils.toList(args));
return context -> {
Location location = requireNonNull(context.arg(ContextKeys.LOCATION));
@@ -797,11 +824,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "!world");
}
private void registerWeatherRequirement() {
registerRequirement("weather", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> weathers = new HashSet<>(ListUtils.toList(args));
return context -> {
String currentWeather;
@@ -814,11 +841,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "weather");
}
private void registerCoolDownRequirement() {
registerRequirement("cooldown", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
String key = section.getString("key");
int time = section.getInt("time");
@@ -832,11 +859,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at cooldown requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "cooldown");
}
private void registerDateRequirement() {
registerRequirement("date", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
HashSet<String> dates = new HashSet<>(ListUtils.toList(args));
return context -> {
Calendar calendar = Calendar.getInstance();
@@ -846,11 +873,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "date");
}
private void registerPermissionRequirement() {
registerRequirement("permission", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
List<String> perms = ListUtils.toList(args);
return context -> {
for (String perm : perms)
@@ -859,8 +886,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
registerRequirement("!permission", (args, actions, runActions) -> {
}, "permission");
registerRequirement((args, actions, runActions) -> {
List<String> perms = ListUtils.toList(args);
return context -> {
for (String perm : perms)
@@ -870,11 +897,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
}
return true;
};
});
}, "!permission");
}
private void registerSeasonRequirement() {
registerRequirement("season", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
List<String> seasons = ListUtils.toList(args);
return context -> {
SeasonProvider seasonProvider = plugin.getIntegrationManager().getSeasonProvider();
@@ -886,11 +913,11 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "season");
}
private void registerPAPIRequirement() {
registerRequirement("<", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
MathValue<Player> v1 = MathValue.auto(section.get("value1"));
MathValue<Player> v2 = MathValue.auto(section.get("value2"));
@@ -903,8 +930,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at < requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("<=", (args, actions, runActions) -> {
}, "<");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
MathValue<Player> v1 = MathValue.auto(section.get("value1"));
MathValue<Player> v2 = MathValue.auto(section.get("value2"));
@@ -917,8 +944,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at <= requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("!=", (args, actions, runActions) -> {
}, "<=");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
MathValue<Player> v1 = MathValue.auto(section.get("value1"));
MathValue<Player> v2 = MathValue.auto(section.get("value2"));
@@ -931,8 +958,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at != requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("==", (args, actions, runActions) -> {
}, "!=");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
MathValue<Player> v1 = MathValue.auto(section.get("value1"));
MathValue<Player> v2 = MathValue.auto(section.get("value2"));
@@ -945,8 +972,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at == requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement(">=", (args, actions, runActions) -> {
}, "==");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
MathValue<Player> v1 = MathValue.auto(section.get("value1"));
MathValue<Player> v2 = MathValue.auto(section.get("value2"));
@@ -959,8 +986,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at >= requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement(">", (args, actions, runActions) -> {
}, ">=");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
MathValue<Player> v1 = MathValue.auto(section.get("value1"));
MathValue<Player> v2 = MathValue.auto(section.get("value2"));
@@ -973,8 +1000,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at > requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("regex", (args, actions, runActions) -> {
}, ">");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("papi", ""));
String v2 = section.getString("regex", "");
@@ -987,8 +1014,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at regex requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("startsWith", (args, actions, runActions) -> {
}, "regex");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1001,8 +1028,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at startsWith requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("!startsWith", (args, actions, runActions) -> {
}, "startsWith");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1015,8 +1042,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at !startsWith requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("endsWith", (args, actions, runActions) -> {
}, "!startsWith");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1029,8 +1056,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at endsWith requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("!endsWith", (args, actions, runActions) -> {
}, "endsWith");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1043,8 +1070,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at !endsWith requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("contains", (args, actions, runActions) -> {
}, "!endsWith");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1057,8 +1084,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at contains requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("!contains", (args, actions, runActions) -> {
}, "contains");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1071,8 +1098,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at !contains requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("in-list", (args, actions, runActions) -> {
}, "!contains");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> papi = TextValue.auto(section.getString("papi", ""));
List<String> values = ListUtils.toList(section.get("values"));
@@ -1085,8 +1112,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at in-list requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("!in-list", (args, actions, runActions) -> {
}, "in-list");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> papi = TextValue.auto(section.getString("papi", ""));
List<String> values = ListUtils.toList(section.get("values"));
@@ -1099,8 +1126,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at !in-list requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("equals", (args, actions, runActions) -> {
}, "!in-list");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1114,8 +1141,8 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at equals requirement which is expected be `Section`");
return Requirement.empty();
}
});
registerRequirement("!equals", (args, actions, runActions) -> {
}, "equals");
registerRequirement((args, actions, runActions) -> {
if (args instanceof Section section) {
TextValue<Player> v1 = TextValue.auto(section.getString("value1", ""));
TextValue<Player> v2 = TextValue.auto(section.getString("value2", ""));
@@ -1128,12 +1155,12 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
plugin.getPluginLogger().warn("Invalid value type: " + args.getClass().getSimpleName() + " found at !equals requirement which is expected be `Section`");
return Requirement.empty();
}
});
}, "!equals");
}
@SuppressWarnings("deprecation")
private void registerPotionEffectRequirement() {
registerRequirement("potion-effect", (args, actions, runActions) -> {
registerRequirement((args, actions, runActions) -> {
String potions = (String) args;
String[] split = potions.split("(<=|>=|<|>|==)", 2);
PotionEffectType type = PotionEffectType.getByName(split[0]);
@@ -1176,7 +1203,40 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
if (runActions) ActionManager.trigger(context, actions);
return false;
};
});
}, "potion-effect");
}
private void registerSneakRequirement() {
registerRequirement((args, actions, advanced) -> {
boolean sneak = (boolean) args;
return context -> {
if (context.holder() == null) return false;
if (sneak) {
if (context.holder().isSneaking())
return true;
} else {
if (!context.holder().isSneaking())
return true;
}
if (advanced) ActionManager.trigger(context, actions);
return false;
};
}, "sneak");
}
protected void registerGameModeRequirement() {
registerRequirement((args, actions, advanced) -> {
List<String> modes = ListUtils.toList(args);
return context -> {
if (context.holder() == null) return false;
var name = context.holder().getGameMode().name().toLowerCase(Locale.ENGLISH);
if (modes.contains(name)) {
return true;
}
if (advanced) ActionManager.trigger(context, actions);
return false;
};
}, "gamemode");
}
/**
@@ -1206,7 +1266,7 @@ public class BukkitRequirementManager implements RequirementManager<Player> {
for (Class<? extends RequirementExpansion<Player>> expansionClass : classes) {
RequirementExpansion<Player> expansion = expansionClass.getDeclaredConstructor().newInstance();
unregisterRequirement(expansion.getRequirementType());
registerRequirement(expansion.getRequirementType(), expansion.getRequirementFactory());
registerRequirement(expansion.getRequirementFactory(), expansion.getRequirementType());
plugin.getPluginLogger().info("Loaded requirement expansion: " + expansion.getRequirementType() + "[" + expansion.getVersion() + "]" + " by " + expansion.getAuthor());
}
} catch (InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) {

View File

@@ -41,6 +41,10 @@ public class BukkitExecutor implements RegionExecutor<Location> {
@Override
public void run(Runnable r, Location l) {
if (Bukkit.isPrimaryThread()) {
r.run();
return;
}
Bukkit.getScheduler().runTask(plugin, r);
}

View File

@@ -71,6 +71,7 @@ public class ActivatedTotem {
task.cancel();
}
this.subTasks.clear();
this.doEndAction();
}
public long getExpireTime() {
@@ -86,4 +87,9 @@ public class ActivatedTotem {
BukkitCustomFishingPlugin.getInstance().getEventManager().getEventCarrier(totemConfig.id(), MechanicType.TOTEM)
.ifPresent(carrier -> carrier.trigger(context, ActionTrigger.TIMER));
}
public void doEndAction() {
BukkitCustomFishingPlugin.getInstance().getEventManager().getEventCarrier(totemConfig.id(), MechanicType.TOTEM)
.ifPresent(carrier -> carrier.trigger(context, ActionTrigger.END));
}
}

View File

@@ -23,11 +23,13 @@ import net.momirealms.customfishing.api.mechanic.MechanicType;
import net.momirealms.customfishing.api.mechanic.action.ActionTrigger;
import net.momirealms.customfishing.api.mechanic.config.ConfigManager;
import net.momirealms.customfishing.api.mechanic.context.Context;
import net.momirealms.customfishing.api.mechanic.context.ContextKeys;
import net.momirealms.customfishing.api.mechanic.effect.EffectModifier;
import net.momirealms.customfishing.api.mechanic.requirement.RequirementManager;
import net.momirealms.customfishing.api.mechanic.totem.TotemConfig;
import net.momirealms.customfishing.api.mechanic.totem.TotemManager;
import net.momirealms.customfishing.api.mechanic.totem.block.TotemBlock;
import net.momirealms.customfishing.api.util.EventUtils;
import net.momirealms.customfishing.api.util.SimpleLocation;
import net.momirealms.customfishing.bukkit.util.LocationUtils;
import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask;
@@ -91,6 +93,7 @@ public class BukkitTotemManager implements TotemManager, Listener {
if (this.timerCheckTask != null)
this.timerCheckTask.cancel();
this.block2Totem.clear();
this.id2Totem.clear();
}
@Override
@@ -162,9 +165,17 @@ public class BukkitTotemManager implements TotemManager, Listener {
if (config == null)
return;
Location location = block.getLocation();
SimpleLocation simpleLocation = SimpleLocation.of(location);
ActivatedTotem previous = this.activatedTotems.get(simpleLocation);
if (previous != null) {
return;
}
String totemID = config.id();
final Player player = event.getPlayer();;
Context<Player> context = Context.player(player);
context.arg(ContextKeys.SLOT, event.getHand());
Optional<EffectModifier> optionalEffectModifier = plugin.getEffectManager().getEffectModifier(totemID, MechanicType.TOTEM);
if (optionalEffectModifier.isPresent()) {
if (!RequirementManager.isSatisfied(context, optionalEffectModifier.get().requirements())) {
@@ -172,21 +183,13 @@ public class BukkitTotemManager implements TotemManager, Listener {
}
}
TotemActivateEvent totemActivateEvent = new TotemActivateEvent(player, block.getLocation(), config);
Bukkit.getPluginManager().callEvent(totemActivateEvent);
if (totemActivateEvent.isCancelled()) {
if (EventUtils.fireAndCheckCancel(new TotemActivateEvent(player, block.getLocation(), config))) {
return;
}
plugin.getEventManager().trigger(context, totemID, MechanicType.TOTEM, ActionTrigger.ACTIVATE);
Location location = block.getLocation();
ActivatedTotem activatedTotem = new ActivatedTotem(player, location, config);
SimpleLocation simpleLocation = SimpleLocation.of(location);
ActivatedTotem previous = this.activatedTotems.put(simpleLocation, activatedTotem);
if (previous != null) {
previous.cancel();
}
this.activatedTotems.put(simpleLocation, activatedTotem);
}
@Override

View File

@@ -131,6 +131,7 @@ mechanics:
duration: 35
position: other
item: lava_effect
use-item-display: true
priority_2:
conditions:
in-water: true
@@ -141,6 +142,7 @@ mechanics:
duration: 35
position: other
item: water_effect
use-item-display: true
# Global properties which would help you reduce duplicated lines
global-loot-property:
show-in-fishfinder: true

View File

@@ -26,7 +26,6 @@ double_loot_totem:
requirement_1:
type: item-in-hand
value:
hand: main
item: NAUTILUS_SHELL
amount: 1
not-met-actions:
@@ -48,6 +47,8 @@ double_loot_totem:
text: '<#BA55D3>[Double Loot Totem]</#BA55D3>'
position: other
range: 16
use-text-display: true
rgba: 147,112,219,50
y: 3.3
x: 0
z: 0
@@ -58,6 +59,7 @@ double_loot_totem:
text: 'Time Left: {time_left} seconds'
position: other
range: 16
use-text-display: true
y: 2.8
x: 0
z: 0
@@ -65,7 +67,6 @@ double_loot_totem:
remove_item_action:
type: item-amount
value:
hand: main
amount: -1
broadcast_action:
type: message-nearby
@@ -256,7 +257,6 @@ golden_star_totem:
requirement_1:
type: item-in-hand
value:
hand: main
item: GOLD_INGOT
amount: 1
not-met-actions:
@@ -278,6 +278,8 @@ golden_star_totem:
text: '<#FFFF00>[Golden Star Totem]</#FFFF00>'
position: other
range: 16
use-text-display: true
rgba: 255,215,0,50
y: 1
x: 0
z: 0
@@ -287,6 +289,7 @@ golden_star_totem:
duration: 20
text: 'Time Left: {time_left} seconds'
position: other
use-text-display: true
range: 16
y: 0.5
x: 0
@@ -295,7 +298,6 @@ golden_star_totem:
remove_item_action:
type: item-amount
value:
hand: main
amount: -1
broadcast_action:
type: message-nearby

View File

@@ -1,6 +1,6 @@
# Project settings
# Rule: [major update].[feature update].[bug fix]
project_version=2.2.20
project_version=2.2.21
config_version=36
project_group=net.momirealms
@@ -17,7 +17,7 @@ h2_driver_version=2.2.224
sqlite_driver_version=3.46.0.1
adventure_bundle_version=4.17.0
adventure_platform_version=4.3.3
sparrow_heart_version=0.36
sparrow_heart_version=0.39
cloud_core_version=2.0.0-rc.2
cloud_services_version=2.0.0-rc.2
cloud_brigadier_version=2.0.0-beta.9