Updated to ContextAware Alias.

This commit is contained in:
wolf
2025-07-05 13:13:05 -04:00
parent cd80f35006
commit 229ac8d73b
74 changed files with 569 additions and 893 deletions

View File

@@ -0,0 +1,15 @@
package me.trouper.clonedupecore;
import me.trouper.alias.server.ContextAware;
import org.bukkit.plugin.java.JavaPlugin;
public interface CloneDupeContext extends ContextAware {
@Override
default Class<? extends JavaPlugin> getPluginClass() {
return CloneDupeCore.class;
}
default CloneDupeCore getInstance() {
return CloneDupeCore.getInstance();
}
}

View File

@@ -2,15 +2,21 @@ package me.trouper.clonedupecore;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import me.trouper.alias.Alias; import me.trouper.alias.AliasContext;
import me.trouper.clonedupecore.server.Manager; import me.trouper.alias.AliasContextProvider;
import org.bukkit.NamespacedKey; import me.trouper.alias.data.Common;
import me.trouper.clonedupecore.data.IO;
import me.trouper.clonedupecore.data.io.Config;
import me.trouper.clonedupecore.server.systems.trims.TrimManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
public final class CloneDupeCore extends JavaPlugin { public class CloneDupeCore extends JavaPlugin {
private static CloneDupeCore instance; private static CloneDupeCore instance;
private Manager manager; private IO io;
private Common common;
private AliasContext alias;
private TrimManager trimManager;
@Override @Override
public void onLoad() { public void onLoad() {
@@ -27,38 +33,70 @@ public final class CloneDupeCore extends JavaPlugin {
getLogger().info("Initializing PacketEvents"); getLogger().info("Initializing PacketEvents");
PacketEvents.getAPI().init(); PacketEvents.getAPI().init();
getLogger().info("Instantiating Manager"); getLogger().info("Initializing IO");
manager = new Manager(instance);
getLogger().info("Initializing Manager"); io = new IO(getDataFolder());
manager.init();
getLogger().info("Successfully enabled CloneDupeCore."); getLogger().info("Initializing Alias");
common = new Common(getClass().getPackageName(), 0xFF00AA, 0xFFDDDD, "CloneDupeCore", "CloneDupe> ", false,
"http://api.trouper.me:9090/download/plugins/CloneDupe/CloneDupeCore-1.0.0-all.jar");
alias = new AliasContext(this, common);
AliasContextProvider.registerContext(this, alias);
alias.initialize();
io.loadAll();
updateCommon();
cleanup();
trimManager = new TrimManager();
trimManager.register();
trimManager.startTicking();
} }
@Override @Override
public void onDisable() { public void onDisable() {
getLogger().info("Cleaning up...");
manager.cleanup();
getLogger().info("Saving all IO files.");
manager.io.saveAll();
getLogger().info("Terminating PacketEventsAPI."); getLogger().info("Terminating PacketEventsAPI.");
PacketEvents.getAPI().terminate(); PacketEvents.getAPI().terminate();
cleanup();
io.saveAll();
getLogger().info("Stopping Alias."); getLogger().info("Stopping Alias.");
Alias.stop(getInstance(),getManager().common); alias.shutdown();
}
public void updateCommon() {
Config config = alias.getDataManager().get(Config.class);
common.setMainColor(config.messages.mainColor);
common.setSecondaryColor(config.messages.secondaryColor);
common.setFlatPrefix(config.messages.flatPrefix);
common.setPluginName(config.messages.pluginName);
common.setDebugMode(config.debugMode);
config.debuggerExclusions.forEach(common::addDebuggerExclusion);
}
private void cleanup() {
alias.getDisplayManager().getBlockDisplayRaytracer().cleanup();
}
public IO getIO() {
return io;
}
public Common getCommon() {
return common;
}
public AliasContext getAliasContext() {
return alias;
}
public TrimManager getTrimManager() {
return trimManager;
} }
public static CloneDupeCore getInstance() { public static CloneDupeCore getInstance() {
return instance; return instance;
} }
public NamespacedKey getNameSpace() {
return new NamespacedKey(getInstance(),"clone_dupe_core");
}
public Manager getManager() {
return manager;
}
} }

View File

@@ -1,27 +1,25 @@
package me.trouper.clonedupecore.data; package me.trouper.clonedupecore.data;
import me.trouper.clonedupecore.CloneDupeContext;
import me.trouper.clonedupecore.CloneDupeCore; import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.data.io.Config; import me.trouper.clonedupecore.data.io.Config;
import me.trouper.clonedupecore.data.io.NBTConfig; import me.trouper.clonedupecore.data.io.NBTConfig;
import me.trouper.clonedupecore.data.io.Storage; import me.trouper.clonedupecore.data.io.Storage;
public interface Data { public interface Data extends CloneDupeContext {
Data data = new Data() {};
default Config getConfig() { default Config getConfig() {
return CloneDupeCore.getInstance().getManager().io.config; return getDataManager().get(Config.class);
} }
default Storage getStorage() { default Storage getStorage() {
return CloneDupeCore.getInstance().getManager().io.storage; return getDataManager().get(Storage.class);
} }
default NBTConfig getNBT() { default NBTConfig getNBT() {
return CloneDupeCore.getInstance().getManager().io.nbtConfig; return getDataManager().get(NBTConfig.class);
} }
default IO getIO() { default IO getIO() {
return CloneDupeCore.getInstance().getManager().io; return CloneDupeCore.getInstance().getIO();
} }
} }

View File

@@ -1,48 +1,36 @@
package me.trouper.clonedupecore.data; package me.trouper.clonedupecore.data;
import me.trouper.alias.data.JsonSerializable; import me.trouper.clonedupecore.CloneDupeContext;
import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.data.io.Config; import me.trouper.clonedupecore.data.io.Config;
import me.trouper.clonedupecore.data.io.NBTConfig; import me.trouper.clonedupecore.data.io.NBTConfig;
import me.trouper.clonedupecore.data.io.Storage; import me.trouper.clonedupecore.data.io.Storage;
import java.io.File; import java.io.File;
public class IO { public class IO implements CloneDupeContext {
public final File DATA_FOLDER; public final File DATA_FOLDER;
public final File CONFIG_FILE; public final File CONFIG_FILE;
public final File STORAGE_FILE; public final File STORAGE_FILE;
public final File NBT_FILE; public final File NBT_FILE;
public Config config;
public Storage storage;
public NBTConfig nbtConfig;
public IO(File dataFolder) { public IO(File dataFolder) {
DATA_FOLDER = dataFolder; DATA_FOLDER = dataFolder;
CONFIG_FILE = new File(DATA_FOLDER,"/config.json"); CONFIG_FILE = new File(DATA_FOLDER,"/config.json");
STORAGE_FILE = new File(DATA_FOLDER, "/storage.json"); STORAGE_FILE = new File(DATA_FOLDER, "/storage.json");
NBT_FILE = new File(DATA_FOLDER, "/enchants.json"); NBT_FILE = new File(DATA_FOLDER, "/enchants.json");
config = new Config();
storage = new Storage();
nbtConfig = new NBTConfig();
} }
public void loadAll() { public void loadAll() {
CloneDupeCore.getInstance().getLogger().info("Loading all IO Files"); getInstance().getLogger().info("Loading all IO Files");
config = JsonSerializable.load(CONFIG_FILE,Config.class,new Config()); getDataManager().load(Config.class);
storage = JsonSerializable.load(STORAGE_FILE,Storage.class,new Storage()); getDataManager().load(Storage.class);
nbtConfig = JsonSerializable.load(NBT_FILE, NBTConfig.class,new NBTConfig()); getDataManager().load(NBTConfig.class);
saveAll();
} }
public void saveAll() { public void saveAll() {
CloneDupeCore.getInstance().getLogger().info("Saving all IO Files"); getInstance().getLogger().info("Saving all IO Files");
if (config == null) config = new Config(); getDataManager().save(Config.class);
if (storage == null) storage = new Storage(); getDataManager().save(Storage.class);
if (nbtConfig == null) nbtConfig = new NBTConfig(); getDataManager().save(NBTConfig.class);
config.save();
storage.save();
nbtConfig.save();
} }
} }

View File

@@ -1,8 +1,6 @@
package me.trouper.clonedupecore.data.io; package me.trouper.clonedupecore.data.io;
import com.google.common.base.Predicates;
import me.trouper.alias.data.JsonSerializable; import me.trouper.alias.data.JsonSerializable;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.CloneDupeCore; import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.data.SerialLocation; import me.trouper.clonedupecore.data.SerialLocation;
@@ -17,7 +15,8 @@ public class Config implements JsonSerializable<Config> {
@Override @Override
public File getFile() { public File getFile() {
return CloneDupeCore.getInstance().getManager().io.CONFIG_FILE; return CloneDupeCore.getInstance().
getIO().CONFIG_FILE;
} }
@Override @Override

View File

@@ -9,7 +9,7 @@ import java.util.List;
public class NBTConfig implements JsonSerializable<NBTConfig> { public class NBTConfig implements JsonSerializable<NBTConfig> {
@Override @Override
public File getFile() { public File getFile() {
return CloneDupeCore.getInstance().getManager().io.NBT_FILE; return CloneDupeCore.getInstance().getIO().NBT_FILE;
} }
@Override @Override

View File

@@ -4,15 +4,13 @@ import me.trouper.alias.data.JsonSerializable;
import me.trouper.clonedupecore.CloneDupeCore; import me.trouper.clonedupecore.CloneDupeCore;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
public class Storage implements JsonSerializable<Storage> { public class Storage implements JsonSerializable<Storage> {
@Override @Override
public File getFile() { public File getFile() {
return CloneDupeCore.getInstance().getManager().io.STORAGE_FILE; return CloneDupeCore.getInstance().getIO().STORAGE_FILE;
} }
@Override @Override

View File

@@ -1,59 +0,0 @@
package me.trouper.clonedupecore.server;
import me.trouper.alias.Alias;
import me.trouper.alias.data.Common;
import me.trouper.alias.server.systems.tracing.BlockDisplayRaytracer;
import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.data.IO;
import me.trouper.clonedupecore.server.trims.TrimManager;
import me.trouper.clonedupecore.server.trims.animations.*;
import org.bukkit.plugin.java.JavaPlugin;
public class Manager {
public IO io;
public Common common;
public TrimManager trimManager;
public Manager(JavaPlugin instance) {
io = new IO(instance.getDataFolder());
common = new Common(instance.getClass().getPackageName(),0xFF00AA,0xFFDDDD,"CloneDupeCore","CloneDupe> ",false,"http://api.trouper.me:9090/download/plugins/CloneDupe/CloneDupeCore-1.0.0-all.jar");
trimManager = new TrimManager();
}
public void init() {
io.loadAll();
setCommon();
Alias.register(CloneDupeCore.getInstance(),common);
cleanup();
trimManager.register(new AmethystAnimation());
trimManager.register(new AmethystAnimation());
trimManager.register(new CopperAnimation());
trimManager.register(new DiamondAnimation());
trimManager.register(new EmeraldAnimation());
trimManager.register(new GoldAnimation());
trimManager.register(new IronAnimation());
trimManager.register(new LapisAnimation());
trimManager.register(new NetheriteAnimation());
trimManager.register(new QuartzAnimation());
trimManager.register(new RedstoneAnimation());
trimManager.register();
trimManager.startTicking();
}
public void setCommon() {
common.setMainColor(io.config.messages.mainColor);
common.setSecondaryColor(io.config.messages.secondaryColor);
common.setFlatPrefix(io.config.messages.flatPrefix);
common.setPluginName(io.config.messages.pluginName);
common.setDebugMode(io.config.debugMode);
io.config.debuggerExclusions.forEach(exclusion -> common.addDebuggerExclusion(exclusion));
}
public void cleanup() {
BlockDisplayRaytracer.cleanup();
}
}

View File

@@ -5,16 +5,11 @@ import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.Permission; import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.systems.Text;
import me.trouper.alias.server.systems.tracing.BlockDisplayRaytracer;
import me.trouper.alias.server.systems.visual.DisplayUtils;
import me.trouper.alias.update.AutoUpdater;
import me.trouper.alias.utils.FormatUtils; import me.trouper.alias.utils.FormatUtils;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.server.trims.ValidArmorType; import me.trouper.clonedupecore.server.systems.trims.ValidArmorType;
import me.trouper.clonedupecore.server.trims.ValidMaterial; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@@ -80,8 +75,8 @@ public class AdminCommand implements QuickCommand, Data {
private void handleUpdate(CommandSender sender, Args args) { private void handleUpdate(CommandSender sender, Args args) {
infoAny(sender,"Checking for an update..."); infoAny(sender,"Checking for an update...");
Bukkit.getScheduler().runTask(main.getPlugin(),()->{ Bukkit.getScheduler().runTask(getPlugin(),()->{
if (AutoUpdater.checkUpdate(main.getPlugin(),main.getCommon())) { if (getContext().getAutoUpdater().checkUpdate()) {
successAny(sender,"Updated plugin has been downloaded to {0}.","plugins/update"); successAny(sender,"Updated plugin has been downloaded to {0}.","plugins/update");
} else { } else {
successAny(sender,"Plugin is up-to-date!"); successAny(sender,"Plugin is up-to-date!");
@@ -92,12 +87,12 @@ public class AdminCommand implements QuickCommand, Data {
private void handleCleanup(CommandSender sender, Args args) { private void handleCleanup(CommandSender sender, Args args) {
infoAny(sender,"Cleaning up temporary entities on all loaded worlds."); infoAny(sender,"Cleaning up temporary entities on all loaded worlds.");
Bukkit.getScheduler().runTask(main.getPlugin(),()->{ Bukkit.getScheduler().runTask(getPlugin(),()->{
int count = 0; int count = 0;
for (World world : Bukkit.getWorlds()) { for (World world : Bukkit.getWorlds()) {
for (Chunk chunk : world.getLoadedChunks()) { for (Chunk chunk : world.getLoadedChunks()) {
for (Entity entity : chunk.getEntities()) { for (Entity entity : chunk.getEntities()) {
if (entity.getScoreboardTags().contains(main.getCommon().getTempTag())) { if (entity.getScoreboardTags().contains(getCommon().getTempTag())) {
entity.remove(); entity.remove();
count++; count++;
} }
@@ -112,7 +107,7 @@ public class AdminCommand implements QuickCommand, Data {
private void handleReload(CommandSender sender, Args args) { private void handleReload(CommandSender sender, Args args) {
successAny(sender,"Reloading IO and common..."); successAny(sender,"Reloading IO and common...");
getIO().loadAll(); getIO().loadAll();
CloneDupeCore.getInstance().getManager().setCommon(); getInstance().updateCommon();
} }
private void handleTrim(CommandSender sender, Args args) { private void handleTrim(CommandSender sender, Args args) {
@@ -125,15 +120,15 @@ public class AdminCommand implements QuickCommand, Data {
return; return;
} }
ValidMaterial validMaterial = main.randomizer().getRandomElement(ValidMaterial.values()); ValidMaterial validMaterial = randomizer().getRandomElement(ValidMaterial.values());
ValidArmorType validArmorType = main.randomizer().getRandomElement(ValidArmorType.values()); ValidArmorType validArmorType = randomizer().getRandomElement(ValidArmorType.values());
if (args.getSize() >= 2) validMaterial = args.get(1).toEnum(ValidMaterial.class); if (args.getSize() >= 2) validMaterial = args.get(1).toEnum(ValidMaterial.class);
if (args.getSize() >= 3) validArmorType = args.get(2).toEnum(ValidArmorType.class); if (args.getSize() >= 3) validArmorType = args.get(2).toEnum(ValidArmorType.class);
TrimPattern pattern = TrimPattern.SILENCE; TrimPattern pattern = TrimPattern.SILENCE;
TrimMaterial material = validMaterial.getCanonical(); TrimMaterial material = validMaterial.getCanonical();
if (material == null) material = main.randomizer().getRandomElement(ValidMaterial.values()).getCanonical(); if (material == null) material = randomizer().getRandomElement(ValidMaterial.values()).getCanonical();
p.getEquipment().setHelmet(createTestArmor(new ItemStack(validArmorType.getHelmet()),pattern,material)); p.getEquipment().setHelmet(createTestArmor(new ItemStack(validArmorType.getHelmet()),pattern,material));
p.getEquipment().setChestplate(createTestArmor(new ItemStack(validArmorType.getChestplate()),pattern,material)); p.getEquipment().setChestplate(createTestArmor(new ItemStack(validArmorType.getChestplate()),pattern,material));
@@ -142,15 +137,15 @@ public class AdminCommand implements QuickCommand, Data {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
double finalI = i; double finalI = i;
Bukkit.getScheduler().runTaskLater(main.getPlugin(),()->{ Bukkit.getScheduler().runTaskLater(getPlugin(),()->{
DisplayUtils.ring(p.getLocation().clone().add(0, finalI / 5D,0),0.5, Color.RED,0.5F); getContext().getDisplayManager().getPatterns().ring(p.getLocation().clone().add(0, finalI / 5D,0),0.5, Color.RED,0.5F);
},i); },i);
} }
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
double finalI = i; double finalI = i;
Bukkit.getScheduler().runTaskLater(main.getPlugin(),()->{ Bukkit.getScheduler().runTaskLater(getPlugin(),()->{
DisplayUtils.ring(p.getLocation().clone().add(0,2,0).subtract(0,finalI / 5D,0),0.5,Color.RED,0.5F); getContext().getDisplayManager().getPatterns().ring(p.getLocation().clone().add(0,2,0).subtract(0,finalI / 5D,0),0.5,Color.RED,0.5F);
},10 + i); },10 + i);
} }
@@ -165,12 +160,12 @@ public class AdminCommand implements QuickCommand, Data {
throw new IllegalArgumentException("You must input armor ONLY"); throw new IllegalArgumentException("You must input armor ONLY");
} }
armor.displayName(Text.color("&eTesting Armor").decoration(TextDecoration.ITALIC,false)); armor.displayName(getTextSystem().color("&eTesting Armor").decoration(TextDecoration.ITALIC,false));
armor.lore(List.of( armor.lore(List.of(
Text.color("&8&l| &7%s".formatted(FormatUtils.formatEnum(ValidMaterial.validate(trimMaterial)))).decoration(TextDecoration.ITALIC,false), getTextSystem().color("&8&l| &7%s".formatted(FormatUtils.formatEnum(ValidMaterial.validate(trimMaterial)))).decoration(TextDecoration.ITALIC,false),
Text.color("&8&l| &7Won't Break").decoration(TextDecoration.ITALIC,false), getTextSystem().color("&8&l| &7Won't Break").decoration(TextDecoration.ITALIC,false),
Text.color("&8&l| &7Vanishes on death").decoration(TextDecoration.ITALIC,false), getTextSystem().color("&8&l| &7Vanishes on death").decoration(TextDecoration.ITALIC,false),
Text.color("&8&l| &7This armor is for testing purposes &c&lONLY&7!").decoration(TextDecoration.ITALIC,false) getTextSystem().color("&8&l| &7This armor is for testing purposes &c&lONLY&7!").decoration(TextDecoration.ITALIC,false)
)); ));
armor.addEnchant(Enchantment.VANISHING_CURSE,1,true); armor.addEnchant(Enchantment.VANISHING_CURSE,1,true);
armor.addEnchant(Enchantment.PROTECTION, 4, true); armor.addEnchant(Enchantment.PROTECTION, 4, true);
@@ -199,7 +194,7 @@ public class AdminCommand implements QuickCommand, Data {
getConfig().debugMode = result = !getConfig().debugMode; getConfig().debugMode = result = !getConfig().debugMode;
getConfig().save(); getConfig().save();
CloneDupeCore.getInstance().getManager().common.setDebugMode(result); getInstance().updateCommon();
successAny(sender,"Toggled debug mode {0}.",result ? "on" : "off"); successAny(sender,"Toggled debug mode {0}.",result ? "on" : "off");
} }
@@ -212,7 +207,7 @@ public class AdminCommand implements QuickCommand, Data {
getConfig().debuggerExclusions.add(exclusion); getConfig().debuggerExclusions.add(exclusion);
getConfig().save(); getConfig().save();
CloneDupeCore.getInstance().getManager().common.addDebuggerExclusion(exclusion); getInstance().updateCommon();
successAny(sender, "Excluded {0} from the debugger.", exclusion); successAny(sender, "Excluded {0} from the debugger.", exclusion);
} }
@@ -225,7 +220,7 @@ public class AdminCommand implements QuickCommand, Data {
getConfig().debuggerExclusions.remove(exclusion); getConfig().debuggerExclusions.remove(exclusion);
getConfig().save(); getConfig().save();
CloneDupeCore.getInstance().getManager().common.removeDebuggerExclusion(exclusion); getInstance().updateCommon();
successAny(sender, "Removed exclusion for {0} on the debugger.", exclusion); successAny(sender, "Removed exclusion for {0} on the debugger.", exclusion);
} }

View File

@@ -6,10 +6,10 @@ import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.systems.Text; import me.trouper.alias.server.systems.Text;
import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.data.SerialLocation; import me.trouper.clonedupecore.data.SerialLocation;
import me.trouper.clonedupecore.server.punishment.Freeze;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title;
@@ -22,6 +22,7 @@ import org.bukkit.entity.Player;
import java.time.Duration; import java.time.Duration;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.HashSet;
@CommandRegistry( @CommandRegistry(
value = "freeze", value = "freeze",
@@ -44,16 +45,9 @@ public class FreezeCommand implements QuickCommand, Data {
return; return;
} }
boolean frozen = Freeze.getFrozen().containsKey(target.getUniqueId()) || "unfreeze".equals(label) || "unscreenshare".equals(label); boolean frozen = getContext().getFreezeManager().isFrozen(target.getUniqueId()) || "unfreeze".equals(label) || "unscreenshare".equals(label);
if (frozen) { if (frozen) {
Freeze.thawPlayer(target.getUniqueId()); getContext().getFreezeManager().getSession(target.getUniqueId()).thaw();
infoAny(sender,"Completed ScreenShare/Freeze on {0}.",target.name());
infoAny(target,"You have been released!");
target.showTitle(Title.title(
Text.format(Text.Pallet.SUCCESS,"Screenshare Complete!").decorate(TextDecoration.BOLD),
Text.format(Text.Pallet.INFO,"Thank you for your cooperation."),
Title.Times.times(Duration.ZERO,Duration.of(3, ChronoUnit.SECONDS),Duration.ZERO)
));
return; return;
} }
@@ -77,12 +71,12 @@ public class FreezeCommand implements QuickCommand, Data {
} }
Title attemptTitle = Title.title( Title attemptTitle = Title.title(
Text.format(Text.Pallet.ERROR,"You are being Screenshared!").decorate(TextDecoration.BOLD), getTextSystem().format(Text.Pallet.ERROR,"You are being Screenshared!").decorate(TextDecoration.BOLD),
Text.format(Text.Pallet.INFO,"Join the {0} VC using {1}!","'ScreenShare'", "/discord"), getTextSystem().format(Text.Pallet.INFO,"Join the {0} VC using {1}!","'ScreenShare'", "/discord"),
Title.Times.times(Duration.ZERO,Duration.of(10, ChronoUnit.SECONDS),Duration.ZERO) Title.Times.times(Duration.ZERO,Duration.of(10, ChronoUnit.SECONDS),Duration.ZERO)
); );
Component attemptMessage = Text.color(""" Component attemptMessage = getTextSystem().color("""
&cLeaving before or during a ScreenShare results in: &cLeaving before or during a ScreenShare results in:
&f➤ 1st Offense: 7d ban &f➤ 1st Offense: 7d ban
&f➤ 2nd Offense: 14d ban &f➤ 2nd Offense: 14d ban
@@ -91,19 +85,35 @@ public class FreezeCommand implements QuickCommand, Data {
&cYou Have &l5 Minutes&r&c To Join '&4ScreenShare&c' VC. &cYou Have &l5 Minutes&r&c To Join '&4ScreenShare&c' VC.
"""); """);
Freeze.FrozenPlayer fp = new Freeze.FrozenPlayer(target.getUniqueId(), target.getLocation().clone(), (player)->{ Title thawTitle = Title.title(
Freeze.thawPlayer(target.getUniqueId()); getTextSystem().format(Text.Pallet.SUCCESS,"Screenshare Complete!").decorate(TextDecoration.BOLD),
getConfig().freezeCommandsOnQuit.forEach(cmd -> Bukkit.dispatchCommand(sender,cmd.replace("{0}",player.getName()))); getTextSystem().format(Text.Pallet.INFO,"Thank you for your cooperation."),
infoAny(sender,"{0} left while being Screenshared/Frozen, and has been punished as a result.",target.name()); Title.Times.times(Duration.ZERO,Duration.of(3, ChronoUnit.SECONDS),Duration.ZERO)
}, (player)->{ );
player.showTitle(attemptTitle);
player.sendMessage(attemptMessage);
SoundPlayer.play(player, Sound.BLOCK_NOTE_BLOCK_BASS);
});
target.teleport(freezeLoc); Location finalFreezeLoc = freezeLoc;
FreezeSession freeze = new FreezeSession.Builder(getContext(),target.getUniqueId(),target.getLocation())
.onStart(()->{
target.teleport(finalFreezeLoc);
})
.onMove(player -> {
player.showTitle(attemptTitle);
player.sendMessage(attemptMessage);
SoundPlayer.play(player, Sound.BLOCK_NOTE_BLOCK_BASS);
})
.onQuit((player -> {
getConfig().freezeCommandsOnQuit.forEach(cmd -> Bukkit.dispatchCommand(sender,cmd.replace("{0}",player.getName())));
infoAny(sender,"{0} left while being Screenshared/Frozen, and has been punished as a result.",target.name());
}))
.onThaw(()->{
infoAny(sender,"Completed ScreenShare/Freeze on {0}.",target.name());
infoAny(target,"You have been released!");
target.showTitle(thawTitle);
})
.allowCommands(new HashSet<>(getConfig().allowedFreezeCommands))
.build();
Freeze.freezePlayer(fp); freeze.start();
} }
private void handleLocationUpdate(CommandSender sender) { private void handleLocationUpdate(CommandSender sender) {

View File

@@ -4,17 +4,18 @@ import club.minnced.discord.webhook.WebhookClient;
import club.minnced.discord.webhook.WebhookClientBuilder; import club.minnced.discord.webhook.WebhookClientBuilder;
import club.minnced.discord.webhook.send.WebhookEmbed; import club.minnced.discord.webhook.send.WebhookEmbed;
import club.minnced.discord.webhook.send.WebhookEmbedBuilder; import club.minnced.discord.webhook.send.WebhookEmbedBuilder;
import me.trouper.alias.server.commands.*; import me.trouper.alias.server.commands.Args;
import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommandListener;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.events.QuickListener;
import me.trouper.alias.server.systems.Text; import me.trouper.alias.server.systems.Text;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.alias.utils.misc.ArrayUtils; import me.trouper.alias.utils.misc.ArrayUtils;
import me.trouper.alias.utils.misc.TimeUtils; import me.trouper.alias.utils.misc.TimeUtils;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.server.punishment.LiteBansManager; import me.trouper.clonedupecore.server.systems.punishment.LiteBansManager;
import me.trouper.clonedupecore.server.punishment.WrappedEntry; import me.trouper.clonedupecore.server.systems.punishment.WrappedEntry;
import me.trouper.clonedupecore.server.punishment.animations.*; import me.trouper.clonedupecore.server.systems.punishment.animations.*;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
@@ -24,8 +25,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import java.awt.desktop.QuitEvent;
import java.time.OffsetDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -66,7 +65,7 @@ public class OffendCommand implements QuickCommandListener, Data {
String.join(", ", getConfig().banTemplates)); String.join(", ", getConfig().banTemplates));
return; return;
} }
Bukkit.getScheduler().runTaskAsynchronously(main.getPlugin(), ()->{ Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), ()->{
handlePunish(sender, target, template); handlePunish(sender, target, template);
}); });
} }
@@ -86,7 +85,7 @@ public class OffendCommand implements QuickCommandListener, Data {
@EventHandler @EventHandler
public void onDisconnect(PlayerQuitEvent e) { public void onDisconnect(PlayerQuitEvent e) {
recentlyDisconnected.add(e.getPlayer().getName()); recentlyDisconnected.add(e.getPlayer().getName());
Bukkit.getScheduler().runTaskLater(main.getPlugin(),()->{ Bukkit.getScheduler().runTaskLater(getPlugin(),()->{
recentlyDisconnected.remove(e.getPlayer().getName()); recentlyDisconnected.remove(e.getPlayer().getName());
},20*120); },20*120);
} }
@@ -95,18 +94,18 @@ public class OffendCommand implements QuickCommandListener, Data {
if (template == null) { if (template == null) {
List<WrappedEntry> allBans = liteBansManager.getPlayerBans(target); List<WrappedEntry> allBans = liteBansManager.getPlayerBans(target);
Component historyMessage = Text.format(Text.Pallet.INFO, "All bans for {0}: ", target.getName()) Component historyMessage = getTextSystem().format(Text.Pallet.INFO, "All bans for {0}: ", target.getName())
.appendNewline(); .appendNewline();
if (allBans.isEmpty()) { if (allBans.isEmpty()) {
historyMessage = historyMessage.append(Text.format(Text.Pallet.LOCATION, "No bans found.")); historyMessage = historyMessage.append(getTextSystem().format(Text.Pallet.LOCATION, "No bans found."));
} else { } else {
for (WrappedEntry ban : allBans) { for (WrappedEntry ban : allBans) {
String status = ban.isActive() ? "Active" : "Expired/Unbanned"; String status = ban.isActive() ? "Active" : "Expired/Unbanned";
String duration = ban.isPermanent() ? "Permanent" : TimeUtils.formatTime(ban.getDateEnd()); String duration = ban.isPermanent() ? "Permanent" : TimeUtils.formatTime(ban.getDateEnd());
historyMessage = historyMessage historyMessage = historyMessage
.append(Text.format(Text.Pallet.LOCATION, .append(getTextSystem().format(Text.Pallet.LOCATION,
"{0} - {1} - {2} - {3}", "{0} - {1} - {2} - {3}",
TimeUtils.formatTime(ban.getDateStart()), TimeUtils.formatTime(ban.getDateStart()),
ban.getReason(), ban.getReason(),
@@ -123,18 +122,18 @@ public class OffendCommand implements QuickCommandListener, Data {
short index = (short) getConfig().banTemplates.indexOf(template); short index = (short) getConfig().banTemplates.indexOf(template);
List<WrappedEntry> templateBans = liteBansManager.getPlayerBansByTemplate(target, index); List<WrappedEntry> templateBans = liteBansManager.getPlayerBansByTemplate(target, index);
Component historyMessage = Text.format(Text.Pallet.INFO, Component historyMessage = getTextSystem().format(Text.Pallet.INFO,
"{0} template bans for {1}: ", template, target.getName()).appendNewline(); "{0} template bans for {1}: ", template, target.getName()).appendNewline();
if (templateBans.isEmpty()) { if (templateBans.isEmpty()) {
historyMessage = historyMessage.append(Text.format(Text.Pallet.LOCATION, "No bans found for this template.")); historyMessage = historyMessage.append(getTextSystem().format(Text.Pallet.LOCATION, "No bans found for this template."));
} else { } else {
for (WrappedEntry ban : templateBans) { for (WrappedEntry ban : templateBans) {
String status = ban.isActive() ? "Active" : "Expired/Unbanned"; String status = ban.isActive() ? "Active" : "Expired/Unbanned";
String duration = ban.isPermanent() ? "Permanent" : TimeUtils.formatTime(ban.getDateEnd()); String duration = ban.isPermanent() ? "Permanent" : TimeUtils.formatTime(ban.getDateEnd());
historyMessage = historyMessage historyMessage = historyMessage
.append(Text.format(Text.Pallet.LOCATION, .append(getTextSystem().format(Text.Pallet.LOCATION,
"{0} - {1} - {2}", "{0} - {1} - {2}",
TimeUtils.formatTime(ban.getDateStart()), TimeUtils.formatTime(ban.getDateStart()),
duration, duration,
@@ -150,7 +149,7 @@ public class OffendCommand implements QuickCommandListener, Data {
if (liteBansManager.isPlayerBanned(target)) { if (liteBansManager.isPlayerBanned(target)) {
WrappedEntry activeBan = liteBansManager.getActiveBan(target); WrappedEntry activeBan = liteBansManager.getActiveBan(target);
if (activeBan != null) { if (activeBan != null) {
sender.sendMessage(Text.format(Text.Pallet.ERROR, sender.sendMessage(getTextSystem().format(Text.Pallet.ERROR,
"{0} is already banned for: {1}", target.getName(), activeBan.getReason())); "{0} is already banned for: {1}", target.getName(), activeBan.getReason()));
return; return;
} }
@@ -159,12 +158,12 @@ public class OffendCommand implements QuickCommandListener, Data {
short index = (short) getConfig().banTemplates.indexOf(template); short index = (short) getConfig().banTemplates.indexOf(template);
int currentBans = liteBansManager.getBanCountByTemplate(target, index); int currentBans = liteBansManager.getBanCountByTemplate(target, index);
sender.sendMessage(Text.format(Text.Pallet.INFO, sender.sendMessage(getTextSystem().format(Text.Pallet.INFO,
"Executing ban for {0} using template {1} (Previous offenses: {2})", "Executing ban for {0} using template {1} (Previous offenses: {2})",
target.getName(), template, currentBans)); target.getName(), template, currentBans));
Runnable banPlayer = () -> { Runnable banPlayer = () -> {
Verbose.send("Executing ban due to animation finishing."); getVerbose().send("Executing ban due to animation finishing.");
liteBansManager.executeBan(target, template, sender); liteBansManager.executeBan(target, template, sender);
WebhookClientBuilder builder = new WebhookClientBuilder(getConfig().banWebhook); WebhookClientBuilder builder = new WebhookClientBuilder(getConfig().banWebhook);
@@ -177,16 +176,16 @@ public class OffendCommand implements QuickCommandListener, Data {
c.send(embedBuilder.build()); c.send(embedBuilder.build());
} }
sender.sendMessage(Text.format(Text.Pallet.SUCCESS, "Successfully banned {0} using template {1}", target.getName(), template)); sender.sendMessage(getTextSystem().format(Text.Pallet.SUCCESS, "Successfully banned {0} using template {1}", target.getName(), template));
}; };
Verbose.send("Banning with animation..."); getVerbose().send("Banning with animation...");
PunishmentAnimation animation = main.randomizer().getRandomElement(ANIMATION_FACTORIES).create(main.getPlugin(), target.getPlayer(), banPlayer); PunishmentAnimation animation = randomizer().getRandomElement(ANIMATION_FACTORIES).create(getPlugin(), target.getPlayer(), banPlayer);
try { try {
animation.run(); animation.run();
} catch (Exception e) { } catch (Exception e) {
Verbose.send("Animation generated an exception before it could run! Banning player..."); getVerbose().send("Animation generated an exception before it could run! Banning player...");
e.printStackTrace(); e.printStackTrace();
banPlayer.run(); banPlayer.run();
} }

View File

@@ -5,6 +5,7 @@ import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.Permission; import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.clonedupecore.CloneDupeContext;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextColor;
@@ -15,7 +16,7 @@ import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandRegistry(value = "ping", permission = @Permission("clonedupe.ping"),printStackTrace = true) @CommandRegistry(value = "ping", permission = @Permission("clonedupe.ping"),printStackTrace = true)
public class PingCommand implements QuickCommand { public class PingCommand implements QuickCommand, CloneDupeContext {
@Override @Override
public void handleCommand(CommandSender sender, Command command, String label, Args args) { public void handleCommand(CommandSender sender, Command command, String label, Args args) {

View File

@@ -5,6 +5,7 @@ import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.Permission; import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.clonedupecore.CloneDupeContext;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Statistic; import org.bukkit.Statistic;
@@ -12,15 +13,14 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Arrays;
@CommandRegistry( @CommandRegistry(
value = "statedit", value = "statedit",
permission = @Permission("clonedupe.statedit"), permission = @Permission("clonedupe.statedit"),
usage = "/statedit <player> <statistic> <add|subtract|set|get> [value]", usage = "/statedit <player> <statistic> <add|subtract|set|get> [value]",
printStackTrace = true printStackTrace = true
) )
public class StatisticsCommand implements QuickCommand { public class StatisticsCommand implements QuickCommand, CloneDupeContext {
@Override @Override
public void handleCommand(CommandSender sender, Command command, String label, Args args) { public void handleCommand(CommandSender sender, Command command, String label, Args args) {
if (args.getSize() < 3) { if (args.getSize() < 3) {
@@ -91,4 +91,5 @@ public class StatisticsCommand implements QuickCommand {
) )
); );
} }
} }

View File

@@ -4,7 +4,6 @@ import me.trouper.alias.server.commands.Args;
import me.trouper.alias.server.commands.CommandRegistry; import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.server.gui.TrimEffectGui; import me.trouper.clonedupecore.server.gui.TrimEffectGui;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@@ -55,4 +54,5 @@ public class TrimCommand implements QuickCommand, Data {
public void handleCompletion(CommandSender commandSender, Command command, String s, Args args, CompletionBuilder b) { public void handleCompletion(CommandSender commandSender, Command command, String s, Args args, CompletionBuilder b) {
b.then(b.arg("global","self")); b.then(b.arg("global","self"));
} }
} }

View File

@@ -7,11 +7,11 @@ import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.server.systems.Text; import me.trouper.alias.server.systems.Text;
import me.trouper.clonedupecore.server.trolls.*; import me.trouper.clonedupecore.CloneDupeContext;
import me.trouper.clonedupecore.server.systems.trolls.*;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -22,7 +22,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
@CommandRegistry(value = "clonetroll",permission = @Permission("clonedupe.troll"),printStackTrace = true) @CommandRegistry(value = "clonetroll",permission = @Permission("clonedupe.troll"),printStackTrace = true)
public class TrollCommand implements QuickCommand { public class TrollCommand implements QuickCommand, CloneDupeContext {
public final List<TrollFeature> trollRegistry = new ArrayList<>(); public final List<TrollFeature> trollRegistry = new ArrayList<>();
@@ -59,7 +59,7 @@ public class TrollCommand implements QuickCommand {
.append(Component.text(":",NamedTextColor.WHITE))).appendNewline(); .append(Component.text(":",NamedTextColor.WHITE))).appendNewline();
for (TrollFeature troll : trollRegistry) { for (TrollFeature troll : trollRegistry) {
helpMessage = helpMessage.append(Text.format(Text.Pallet.NEUTRAL,"[{0}] - {1}: {2}",troll.getRating(),troll.getName(),troll.getDescription())).appendNewline(); helpMessage = helpMessage.append(getTextSystem().format(Text.Pallet.NEUTRAL,"[{0}] - {1}: {2}",troll.getRating(),troll.getName(),troll.getDescription())).appendNewline();
} }
if (args.getSize() < 1 || (args.getSize() == 1 && Objects.equals("info",args.get(0).toString()))) { if (args.getSize() < 1 || (args.getSize() == 1 && Objects.equals("info",args.get(0).toString()))) {
@@ -134,4 +134,5 @@ public class TrollCommand implements QuickCommand {
b.arg("info") b.arg("info")
); );
} }
} }

View File

@@ -1,12 +1,12 @@
package me.trouper.clonedupecore.server.commands; package me.trouper.clonedupecore.server.commands;
import me.trouper.alias.Alias;
import me.trouper.alias.server.commands.Args; import me.trouper.alias.server.commands.Args;
import me.trouper.alias.server.commands.CommandRegistry; import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.Permission; import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.clonedupecore.CloneDupeContext;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -15,8 +15,6 @@ import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static me.trouper.alias.Alias.getAutoRegistrar;
@CommandRegistry( @CommandRegistry(
value = "wand", value = "wand",
usage = "/wand <name>", usage = "/wand <name>",
@@ -24,7 +22,7 @@ import static me.trouper.alias.Alias.getAutoRegistrar;
consoleAllowed = false, consoleAllowed = false,
blocksAllowed = false blocksAllowed = false
) )
public class WandCommand implements QuickCommand { public class WandCommand implements QuickCommand, CloneDupeContext {
@Override @Override
public void handleCommand(CommandSender sender, Command command, String label, Args args) { public void handleCommand(CommandSender sender, Command command, String label, Args args) {
@@ -60,4 +58,5 @@ public class WandCommand implements QuickCommand {
.collect(Collectors.toList())) .collect(Collectors.toList()))
); );
} }
} }

View File

@@ -1,7 +1,7 @@
package me.trouper.clonedupecore.server.events; package me.trouper.clonedupecore.server.events;
import me.trouper.alias.server.events.QuickListener; import me.trouper.alias.server.events.QuickListener;
import me.trouper.clonedupecore.CloneDupeCore; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck; import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -9,7 +9,7 @@ import org.bukkit.event.inventory.InventoryCreativeEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
public class CreativeHotbarEvent implements QuickListener { public class CreativeHotbarEvent implements QuickListener, Data {
@EventHandler @EventHandler
private void onNBT(InventoryCreativeEvent e) { private void onNBT(InventoryCreativeEvent e) {
@@ -22,7 +22,7 @@ public class CreativeHotbarEvent implements QuickListener {
if (i.getItemMeta() == null) return; if (i.getItemMeta() == null) return;
if (!i.hasItemMeta()) return; if (!i.hasItemMeta()) return;
if (CloneDupeCore.getInstance().getManager().io.config.nbtWhitelist.contains(p.getUniqueId().toString())) return; if (getConfig().nbtWhitelist.contains(p.getUniqueId().toString())) return;
if (new ItemCheck().passes(i)) return; if (new ItemCheck().passes(i)) return;
e.setCancelled(true); e.setCancelled(true);
@@ -32,4 +32,5 @@ public class CreativeHotbarEvent implements QuickListener {
e.setCurrentItem(replacement); e.setCurrentItem(replacement);
e.getCursor().setItemMeta(meta); e.getCursor().setItemMeta(meta);
} }
} }

View File

@@ -1,79 +0,0 @@
package me.trouper.clonedupecore.server.events;
import me.trouper.alias.server.events.QuickListener;
import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.server.punishment.Freeze;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageByBlockEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class FreezeEvents implements QuickListener {
@EventHandler
public void onMove(PlayerMoveEvent e) {
Freeze.FrozenPlayer frozen = Freeze.getFrozen().get(e.getPlayer().getUniqueId());
if (frozen == null) return;
if (frozen.movementAllowed()) return;
if (!e.getFrom().toVector().equals(e.getTo().toVector())) {
e.setTo(e.getFrom());
}
if (frozen.getOnMove() != null) frozen.getOnMove().accept(e.getPlayer());
}
@EventHandler
public void onInteract(PlayerInteractEvent e) {
Freeze.FrozenPlayer frozen = Freeze.getFrozen().get(e.getPlayer().getUniqueId());
if (frozen == null) return;
e.setCancelled(true);
if (frozen.getOnMove() != null) frozen.getOnMove().accept(e.getPlayer());
}
@EventHandler
public void onCommand(PlayerCommandPreprocessEvent e) {
Freeze.FrozenPlayer frozen = Freeze.getFrozen().get(e.getPlayer().getUniqueId());
if (frozen == null) return;
if (frozen.commandsAllowed()) return;
String baseCmd = e.getMessage().replace("/", "").split(" ")[0].toLowerCase();
if (!Data.data.getConfig().allowedFreezeCommands.contains(baseCmd)) {
e.setCancelled(true);
if (frozen.getOnMove() != null) frozen.getOnMove().accept(e.getPlayer());
}
}
@EventHandler
public void onDamageByEntity(EntityDamageByEntityEvent e) {
if (!(e.getEntity() instanceof Player p)) return;
Freeze.FrozenPlayer frozen = Freeze.getFrozen().get(p.getUniqueId());
if (frozen == null) return;
if (frozen.damageAllowed()) return;
e.setCancelled(true);
if (frozen.getOnMove() != null) frozen.getOnMove().accept(p);
}
@EventHandler
public void onDamageByBlock(EntityDamageByBlockEvent e) {
if (!(e.getEntity() instanceof Player p)) return;
Freeze.FrozenPlayer frozen = Freeze.getFrozen().get(p.getUniqueId());
if (frozen == null) return;
if (frozen.damageAllowed()) return;
e.setCancelled(true);
if (frozen.getOnMove() != null) frozen.getOnMove().accept(p);
}
@EventHandler
public void onQuit(PlayerQuitEvent e) {
Freeze.FrozenPlayer frozen = Freeze.getFrozen().get(e.getPlayer().getUniqueId());
if (frozen == null) return;
if (frozen.getOnQuit() != null) frozen.getOnQuit().accept(e.getPlayer());
}
}

View File

@@ -1,12 +1,13 @@
package me.trouper.clonedupecore.server.events; package me.trouper.clonedupecore.server.events;
import me.trouper.alias.server.events.QuickListener; import me.trouper.alias.server.events.QuickListener;
import me.trouper.clonedupecore.CloneDupeContext;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
public class JoinEvent implements QuickListener { public class JoinEvent implements QuickListener, CloneDupeContext {
@EventHandler @EventHandler
private void onJoin(PlayerJoinEvent e) { private void onJoin(PlayerJoinEvent e) {
@@ -18,4 +19,5 @@ public class JoinEvent implements QuickListener {
p.setAllowFlight(false); p.setAllowFlight(false);
infoAny(p,"Flight has been disable when joining."); infoAny(p,"Flight has been disable when joining.");
} }
} }

View File

@@ -1,9 +1,11 @@
package me.trouper.clonedupecore.server.events.hotbar; package me.trouper.clonedupecore.server.events.hotbar;
import me.trouper.alias.server.ContextAware;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.data.io.NBTConfig; import me.trouper.clonedupecore.data.io.NBTConfig;
public abstract class AbstractCheck<T> implements Data { public abstract class AbstractCheck<T> implements ContextAware, Data {
public NBTConfig config = getNBT(); public NBTConfig config = getNBT();
public abstract boolean passes(T input); public abstract boolean passes(T input);
} }

View File

@@ -1,7 +1,6 @@
package me.trouper.clonedupecore.server.events.hotbar.entities; package me.trouper.clonedupecore.server.events.hotbar.entities;
import de.tr7zw.nbtapi.NBT; import de.tr7zw.nbtapi.NBT;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.alias.utils.InventoryUtils; import me.trouper.alias.utils.InventoryUtils;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck; import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck;
@@ -21,37 +20,37 @@ public class EntityCheck extends AbstractCheck<Entity> {
public boolean passes(Entity entity) { public boolean passes(Entity entity) {
if (entity instanceof Item itemEntity) { if (entity instanceof Item itemEntity) {
if (!new ItemCheck().passes(itemEntity.getItemStack())) { if (!new ItemCheck().passes(itemEntity.getItemStack())) {
Verbose.send("Entity failed check: Item not allowed."); getVerbose().send("Entity failed check: Item not allowed.");
return false; return false;
} }
} }
Inventory inv = InventoryUtils.getInventory(entity); Inventory inv = InventoryUtils.getInventory(entity);
if (inv != null && !new InventoryCheck().passes(inv)) { if (inv != null && !new InventoryCheck().passes(inv)) {
Verbose.send("Entity inventory failed check."); getVerbose().send("Entity inventory failed check.");
return false; return false;
} }
if (entity instanceof Villager villager) { if (entity instanceof Villager villager) {
for (MerchantRecipe recipe : villager.getRecipes()) { for (MerchantRecipe recipe : villager.getRecipes()) {
if (!new ItemCheck().passes(recipe.getResult())) { if (!new ItemCheck().passes(recipe.getResult())) {
Verbose.send("Villager recipe failed check."); getVerbose().send("Villager recipe failed check.");
return false; return false;
} }
} }
} }
if (entity instanceof Mob mob) { if (entity instanceof Mob mob) {
if (!new EquipmentCheck().passes(mob)) { if (!new EquipmentCheck().passes(mob)) {
Verbose.send("Mob equipment failed check."); getVerbose().send("Mob equipment failed check.");
return false; return false;
} }
} }
if (!entity.getPassengers().isEmpty()) { if (!entity.getPassengers().isEmpty()) {
if (!config.allowRecursion) { if (!config.allowRecursion) {
Verbose.send("Entity recursion not allowed."); getVerbose().send("Entity recursion not allowed.");
return false; return false;
} }
for (Entity passenger : entity.getPassengers()) { for (Entity passenger : entity.getPassengers()) {
if (!passes(passenger)) { if (!passes(passenger)) {
Verbose.send("Entity passenger failed check."); getVerbose().send("Entity passenger failed check.");
return false; return false;
} }
} }
@@ -59,16 +58,16 @@ public class EntityCheck extends AbstractCheck<Entity> {
AtomicBoolean failsTiming = new AtomicBoolean(false); AtomicBoolean failsTiming = new AtomicBoolean(false);
NBT.get(entity, nbt -> { NBT.get(entity, nbt -> {
if (nbt.hasTag("DeathTime") && nbt.getInteger("DeathTime") < 1) { if (nbt.hasTag("DeathTime") && nbt.getInteger("DeathTime") < 1) {
Verbose.send("Entity death time check failed."); getVerbose().send("Entity death time check failed.");
failsTiming.set(true); failsTiming.set(true);
} }
if (nbt.hasTag("HurtTime") && nbt.getInteger("HurtTime") < 1) { if (nbt.hasTag("HurtTime") && nbt.getInteger("HurtTime") < 1) {
Verbose.send("Entity hurt time check failed."); getVerbose().send("Entity hurt time check failed.");
failsTiming.set(true); failsTiming.set(true);
} }
}); });
if (failsTiming.get()) { if (failsTiming.get()) {
Verbose.send("Entity timing check failed."); getVerbose().send("Entity timing check failed.");
return false; return false;
} }
return true; return true;

View File

@@ -1,6 +1,5 @@
package me.trouper.clonedupecore.server.events.hotbar.entities; package me.trouper.clonedupecore.server.events.hotbar.entities;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@@ -14,7 +13,7 @@ public class EntitySnapshotCheck extends AbstractCheck<EntitySnapshot> {
Location loc = new Location(Bukkit.getWorlds().getFirst(), 0, 1000000, 0); Location loc = new Location(Bukkit.getWorlds().getFirst(), 0, 1000000, 0);
Entity temp = input.createEntity(loc); Entity temp = input.createEntity(loc);
boolean result = new EntityCheck().passes(temp); boolean result = new EntityCheck().passes(temp);
Verbose.send("Temp Entity %s Entity Check", result ? "failed" : "passed"); getVerbose().send("Temp Entity %s Entity Check", result ? "failed" : "passed");
temp.remove(); temp.remove();
return result; return result;
} }

View File

@@ -1,6 +1,5 @@
package me.trouper.clonedupecore.server.events.hotbar.entities; package me.trouper.clonedupecore.server.events.hotbar.entities;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck; import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck;
import org.bukkit.entity.Mob; import org.bukkit.entity.Mob;
@@ -11,12 +10,12 @@ public class EquipmentCheck extends AbstractCheck<Mob> {
@Override @Override
public boolean passes(Mob mob) { public boolean passes(Mob mob) {
Verbose.send("Running mob check."); getVerbose().send("Running mob check.");
for (EquipmentSlot slot : EquipmentSlot.values()) { for (EquipmentSlot slot : EquipmentSlot.values()) {
if (mob.getEquipment().getItem(slot).isEmpty()) continue; if (mob.getEquipment().getItem(slot).isEmpty()) continue;
ItemStack item = mob.getEquipment().getItem(slot); ItemStack item = mob.getEquipment().getItem(slot);
if (!new ItemCheck().passes(item)) { if (!new ItemCheck().passes(item)) {
Verbose.send("Equipment slot did not pass."); getVerbose().send("Equipment slot did not pass.");
return false; return false;
} }
} }

View File

@@ -1,6 +1,5 @@
package me.trouper.clonedupecore.server.events.hotbar.items; package me.trouper.clonedupecore.server.events.hotbar.items;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -18,7 +17,7 @@ public class EnchantmentCheck extends AbstractCheck<ItemStack> {
} }
public boolean hasIllegalEnchants(ItemStack item) { public boolean hasIllegalEnchants(ItemStack item) {
Verbose.send("Checking item for illegal enchants: ", item.getType().name()); getVerbose().send("Checking item for illegal enchants: ", item.getType().name());
if (item.hasItemMeta() && item.getItemMeta().hasEnchants()) { if (item.hasItemMeta() && item.getItemMeta().hasEnchants()) {
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
Map<Enchantment, Integer> enchantments = meta.getEnchants(); Map<Enchantment, Integer> enchantments = meta.getEnchants();

View File

@@ -2,9 +2,7 @@ package me.trouper.clonedupecore.server.events.hotbar.items;
import de.tr7zw.nbtapi.NBT; import de.tr7zw.nbtapi.NBT;
import de.tr7zw.nbtapi.iface.ReadWriteNBT; import de.tr7zw.nbtapi.iface.ReadWriteNBT;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.alias.utils.InventoryUtils; import me.trouper.alias.utils.InventoryUtils;
import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.misc.BlockStateCheck; import me.trouper.clonedupecore.server.events.hotbar.misc.BlockStateCheck;
import me.trouper.clonedupecore.server.events.hotbar.misc.InventoryCheck; import me.trouper.clonedupecore.server.events.hotbar.misc.InventoryCheck;
@@ -22,23 +20,23 @@ public class ItemCheck extends AbstractCheck<ItemStack> {
try { try {
return scan(item); return scan(item);
} catch (Exception ex) { } catch (Exception ex) {
CloneDupeCore.getInstance().getLogger().warning("Caught an exception while handling an item check: " + Arrays.toString(ex.getStackTrace())); getInstance().getLogger().warning("Caught an exception while handling an item check: " + Arrays.toString(ex.getStackTrace()));
return false; return false;
} }
} }
private boolean scan(ItemStack item) { private boolean scan(ItemStack item) {
Verbose.send("Checking item: " + item.getType().name()); getVerbose().send("Checking item: " + item.getType().name());
// No metadata? Nothing to check. // No metadata? Nothing to check.
if (item.getItemMeta() == null) { if (item.getItemMeta() == null) {
Verbose.send("Item passes because it has no metadata."); getVerbose().send("Item passes because it has no metadata.");
return true; return true;
} }
if (!new MetaCheck().passes(item)) { if (!new MetaCheck().passes(item)) {
Verbose.send("Item failed metadata check."); getVerbose().send("Item failed metadata check.");
return false; return false;
} }
@@ -48,33 +46,33 @@ public class ItemCheck extends AbstractCheck<ItemStack> {
ReadWriteNBT components = nbt.getCompound("components"); ReadWriteNBT components = nbt.getCompound("components");
if (components != null) { if (components != null) {
if (!new ComponentCheck().passes(components)) { if (!new ComponentCheck().passes(components)) {
Verbose.send("Components check failed."); getVerbose().send("Components check failed.");
return false; return false;
} }
} }
// Spawn egg checks. // Spawn egg checks.
if (!new SpawnEggCheck().passes(item)) { if (!new SpawnEggCheck().passes(item)) {
Verbose.send("Spawn egg check failed."); getVerbose().send("Spawn egg check failed.");
return false; return false;
} }
if (!new BlockStateCheck().passes(item)) { if (!new BlockStateCheck().passes(item)) {
Verbose.send("Block State check failed."); getVerbose().send("Block State check failed.");
return false; return false;
} }
// Check for an inventory inside the item. // Check for an inventory inside the item.
Inventory inv = InventoryUtils.getInventory(item); Inventory inv = InventoryUtils.getInventory(item);
if (inv != null) { if (inv != null) {
Verbose.send("Item contains an inventory: " + inv); getVerbose().send("Item contains an inventory: " + inv);
if (!new InventoryCheck().passes(inv)) { if (!new InventoryCheck().passes(inv)) {
Verbose.send("Item failed inventory check."); getVerbose().send("Item failed inventory check.");
return false; return false;
} }
} }
Verbose.send("Item passed all checks."); getVerbose().send("Item passed all checks.");
return true; return true;
} }
} }

View File

@@ -1,6 +1,5 @@
package me.trouper.clonedupecore.server.events.hotbar.items; package me.trouper.clonedupecore.server.events.hotbar.items;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -15,30 +14,30 @@ public class MetaCheck extends AbstractCheck<ItemStack> {
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
// Name, lore, potion, attribute and enchantment checks. // Name, lore, potion, attribute and enchantment checks.
if (!config.allowName && meta.hasDisplayName()) { if (!config.allowName && meta.hasDisplayName()) {
Verbose.send("Custom names not allowed."); getVerbose().send("Custom names not allowed.");
return false; return false;
} }
if (!config.allowLore && meta.hasLore()) { if (!config.allowLore && meta.hasLore()) {
Verbose.send("Custom lore not allowed."); getVerbose().send("Custom lore not allowed.");
return false; return false;
} }
if (!config.allowBooks && meta instanceof BookMeta) { if (!config.allowBooks && meta instanceof BookMeta) {
Verbose.send("Item failed book check."); getVerbose().send("Item failed book check.");
return false; return false;
} }
if (!config.allowPotions && if (!config.allowPotions &&
(item.getType().equals(Material.POTION) || (item.getType().equals(Material.POTION) ||
item.getType().equals(Material.SPLASH_POTION) || item.getType().equals(Material.SPLASH_POTION) ||
item.getType().equals(Material.LINGERING_POTION))) { item.getType().equals(Material.LINGERING_POTION))) {
Verbose.send("Potions not allowed."); getVerbose().send("Potions not allowed.");
return false; return false;
} }
if (!config.allowAttributes && meta.hasAttributeModifiers()) { if (!config.allowAttributes && meta.hasAttributeModifiers()) {
Verbose.send("Attribute modifiers not allowed."); getVerbose().send("Attribute modifiers not allowed.");
return false; return false;
} }
if (config.globalMaxEnchant != 0 && new EnchantmentCheck().hasIllegalEnchants(item)) { if (config.globalMaxEnchant != 0 && new EnchantmentCheck().hasIllegalEnchants(item)) {
Verbose.send("Illegal enchantments found."); getVerbose().send("Illegal enchantments found.");
return false; return false;
} }

View File

@@ -1,79 +0,0 @@
package me.trouper.clonedupecore.server.events.hotbar.items;
import de.tr7zw.nbtapi.NBT;
import kotlin.Pair;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.CloneDupeCore;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class RateLimitCheck extends AbstractCheck<Pair<Player,ItemStack>> {
public static Map<UUID, Integer> dataUsed = new HashMap<>();
public static Map<UUID, Integer> itemsUsed = new HashMap<>();
@Override
public boolean passes(Pair<Player,ItemStack> input) {
Player player = input.getFirst();
UUID uuid = player.getUniqueId();
ItemStack item = input.getSecond();
return itemLimit(uuid,item) && dataLimit(uuid,item);
}
private boolean itemLimit(UUID uuid, ItemStack item) {
int currentUsed = itemsUsed.getOrDefault(uuid,0);
Verbose.send("Current Player used items: " + currentUsed);
currentUsed++;
itemsUsed.put(uuid,currentUsed);
return currentUsed <= config.rateLimit.rateLimitItems;
}
private boolean dataLimit(UUID uuid, ItemStack item) {
int currentData = dataUsed.getOrDefault(uuid,0);
Verbose.send("Current Player used data: " + currentData);
try {
int itemData = NBT.readNbt(item).toString().length();
Verbose.send("Item data: " + itemData);
if (currentData < config.rateLimit.maxOverhead) currentData += itemData;
} catch (Exception e) {
CloneDupeCore.getInstance().getLogger().warning("Could not determine size of item. Blocking.");
CloneDupeCore.getInstance().getLogger().warning(Arrays.toString(e.getStackTrace()));
return false;
}
dataUsed.put(uuid,currentData);
Verbose.send("New Player used data: " + currentData);
return currentData <= config.rateLimit.rateLimitBytes;
}
public void decayData() {
for (UUID uuid : dataUsed.keySet()) {
int currentData = dataUsed.get(uuid);
if (currentData > 0) {
currentData -= config.rateLimit.byteDecay;
dataUsed.put(uuid, Math.max(0, currentData));
}
}
}
public void decayItems() {
for (UUID uuid : itemsUsed.keySet()) {
int currentItems = itemsUsed.get(uuid);
if (currentItems > 0) {
currentItems -= config.rateLimit.itemDecay;
itemsUsed.put(uuid, Math.max(0, currentItems));
}
}
}
}

View File

@@ -2,7 +2,6 @@ package me.trouper.clonedupecore.server.events.hotbar.items;
import de.tr7zw.nbtapi.NBT; import de.tr7zw.nbtapi.NBT;
import de.tr7zw.nbtapi.iface.ReadWriteNBT; import de.tr7zw.nbtapi.iface.ReadWriteNBT;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.entities.EntitySnapshotCheck; import me.trouper.clonedupecore.server.events.hotbar.entities.EntitySnapshotCheck;
import me.trouper.clonedupecore.server.events.hotbar.nbt.EntityDataCheck; import me.trouper.clonedupecore.server.events.hotbar.nbt.EntityDataCheck;
@@ -13,10 +12,10 @@ public class SpawnEggCheck extends AbstractCheck<ItemStack> {
@Override @Override
public boolean passes(ItemStack item) { public boolean passes(ItemStack item) {
Verbose.send("Running spawn egg checks on item: ",item.getType().name()); getVerbose().send("Running spawn egg checks on item: ",item.getType().name());
if (!item.getType().name().toLowerCase().contains("spawn_egg")) return true; if (!item.getType().name().toLowerCase().contains("spawn_egg")) return true;
if (!SpawnEggCheck.entityMatches(item)) { if (!entityMatches(item)) {
Verbose.send("Spawn egg entity doesn't match item type."); getVerbose().send("Spawn egg entity doesn't match item type.");
return false; return false;
} }
ReadWriteNBT nbt = NBT.itemStackToNBT(item); ReadWriteNBT nbt = NBT.itemStackToNBT(item);
@@ -24,14 +23,14 @@ public class SpawnEggCheck extends AbstractCheck<ItemStack> {
if (components != null) { if (components != null) {
var entityData = components.getCompound("minecraft:entity_data"); var entityData = components.getCompound("minecraft:entity_data");
if (!new EntityDataCheck().passes(entityData)) { if (!new EntityDataCheck().passes(entityData)) {
Verbose.send("Spawn egg entity data check failed."); getVerbose().send("Spawn egg entity data check failed.");
return false; return false;
} }
} }
if (item.hasItemMeta() && item.getItemMeta() instanceof SpawnEggMeta sem) { if (item.hasItemMeta() && item.getItemMeta() instanceof SpawnEggMeta sem) {
if (sem.getSpawnedEntity() != null && !new EntitySnapshotCheck().passes(sem.getSpawnedEntity())) { if (sem.getSpawnedEntity() != null && !new EntitySnapshotCheck().passes(sem.getSpawnedEntity())) {
Verbose.send("Spawn egg entity snapshot check failed."); getVerbose().send("Spawn egg entity snapshot check failed.");
return false; return false;
} }
} }
@@ -39,7 +38,7 @@ public class SpawnEggCheck extends AbstractCheck<ItemStack> {
return true; return true;
} }
public static boolean entityMatches(ItemStack item) { private boolean entityMatches(ItemStack item) {
if (item.hasItemMeta() && item.getItemMeta() instanceof SpawnEggMeta sem) { if (item.hasItemMeta() && item.getItemMeta() instanceof SpawnEggMeta sem) {
String eggEntityName = item.getType().name().replace("_SPAWN_EGG", ""); String eggEntityName = item.getType().name().replace("_SPAWN_EGG", "");
return sem.getSpawnedEntity() != null && return sem.getSpawnedEntity() != null &&

View File

@@ -1,6 +1,5 @@
package me.trouper.clonedupecore.server.events.hotbar.misc; package me.trouper.clonedupecore.server.events.hotbar.misc;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.entities.EntitySnapshotCheck; import me.trouper.clonedupecore.server.events.hotbar.entities.EntitySnapshotCheck;
import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck; import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck;
@@ -18,7 +17,7 @@ public class BlockStateCheck extends AbstractCheck<ItemStack> {
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
if (!(meta instanceof BlockStateMeta blockStateMeta)) { if (!(meta instanceof BlockStateMeta blockStateMeta)) {
Verbose.send("Item passes due to not being a block state meta"); getVerbose().send("Item passes due to not being a block state meta");
return true; return true;
} }
@@ -28,7 +27,7 @@ public class BlockStateCheck extends AbstractCheck<ItemStack> {
for (int slot = 0; slot < 4; slot++) { for (int slot = 0; slot < 4; slot++) {
ItemStack campfireItem = campfire.getItem(slot); ItemStack campfireItem = campfire.getItem(slot);
if (campfireItem != null && !new ItemCheck().passes(campfireItem)) { if (campfireItem != null && !new ItemCheck().passes(campfireItem)) {
Verbose.send("Campfire item failed check."); getVerbose().send("Campfire item failed check.");
return false; return false;
} }
} }
@@ -40,7 +39,7 @@ public class BlockStateCheck extends AbstractCheck<ItemStack> {
BlockState bs = blockStateMeta.getBlockState(); BlockState bs = blockStateMeta.getBlockState();
if (bs instanceof Lectern lectern) { if (bs instanceof Lectern lectern) {
if (!new InventoryCheck().passes(lectern.getInventory())) { if (!new InventoryCheck().passes(lectern.getInventory())) {
Verbose.send("Lectern inventory failed check."); getVerbose().send("Lectern inventory failed check.");
return false; return false;
} }
} }
@@ -49,7 +48,7 @@ public class BlockStateCheck extends AbstractCheck<ItemStack> {
BlockState bs = blockStateMeta.getBlockState(); BlockState bs = blockStateMeta.getBlockState();
if (bs instanceof ChiseledBookshelf bookshelf) { if (bs instanceof ChiseledBookshelf bookshelf) {
if (!new InventoryCheck().passes(bookshelf.getInventory())) { if (!new InventoryCheck().passes(bookshelf.getInventory())) {
Verbose.send("Chiseled bookshelf inventory failed check."); getVerbose().send("Chiseled bookshelf inventory failed check.");
return false; return false;
} }
} }
@@ -62,11 +61,11 @@ public class BlockStateCheck extends AbstractCheck<ItemStack> {
if (spawner.getSpawnedEntity() != null) { if (spawner.getSpawnedEntity() != null) {
if (spawner.getSpawnedEntity().getEntityType().equals(EntityType.FALLING_BLOCK) || if (spawner.getSpawnedEntity().getEntityType().equals(EntityType.FALLING_BLOCK) ||
spawner.getSpawnedEntity().getEntityType().equals(EntityType.COMMAND_BLOCK_MINECART)) { spawner.getSpawnedEntity().getEntityType().equals(EntityType.COMMAND_BLOCK_MINECART)) {
Verbose.send("Spawner contains disallowed entity type."); getVerbose().send("Spawner contains disallowed entity type.");
return false; return false;
} }
if (!new EntitySnapshotCheck().passes(spawner.getSpawnedEntity())) { if (!new EntitySnapshotCheck().passes(spawner.getSpawnedEntity())) {
Verbose.send("Spawner entity snapshot check failed."); getVerbose().send("Spawner entity snapshot check failed.");
return false; return false;
} }
} }
@@ -77,18 +76,18 @@ public class BlockStateCheck extends AbstractCheck<ItemStack> {
if (item.getType() == Material.TRIAL_SPAWNER) { if (item.getType() == Material.TRIAL_SPAWNER) {
BlockState bs = blockStateMeta.getBlockState(); BlockState bs = blockStateMeta.getBlockState();
if (bs instanceof TrialSpawner spawner) { if (bs instanceof TrialSpawner spawner) {
Verbose.send("Running trial spawner check."); getVerbose().send("Running trial spawner check.");
if (spawner.getNormalConfiguration() != null) { if (spawner.getNormalConfiguration() != null) {
TrialSpawnerConfiguration config = spawner.getNormalConfiguration(); TrialSpawnerConfiguration config = spawner.getNormalConfiguration();
if (config.getSpawnedEntity() != null && !new EntitySnapshotCheck().passes(config.getSpawnedEntity())) { if (config.getSpawnedEntity() != null && !new EntitySnapshotCheck().passes(config.getSpawnedEntity())) {
Verbose.send("Trial Spawner failed check: Normal entity snapshot not allowed."); getVerbose().send("Trial Spawner failed check: Normal entity snapshot not allowed.");
return false; return false;
} }
} }
if (spawner.getOminousConfiguration() != null) { if (spawner.getOminousConfiguration() != null) {
TrialSpawnerConfiguration config = spawner.getOminousConfiguration(); TrialSpawnerConfiguration config = spawner.getOminousConfiguration();
if (config.getSpawnedEntity() != null && !new EntitySnapshotCheck().passes(config.getSpawnedEntity())) { if (config.getSpawnedEntity() != null && !new EntitySnapshotCheck().passes(config.getSpawnedEntity())) {
Verbose.send("Trial Spawner failed check: Ominous entity snapshot not allowed."); getVerbose().send("Trial Spawner failed check: Ominous entity snapshot not allowed.");
return false; return false;
} }
} }

View File

@@ -1,6 +1,5 @@
package me.trouper.clonedupecore.server.events.hotbar.misc; package me.trouper.clonedupecore.server.events.hotbar.misc;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.alias.utils.InventoryUtils; import me.trouper.alias.utils.InventoryUtils;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck; import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck;
@@ -11,25 +10,25 @@ public class InventoryCheck extends AbstractCheck<Inventory> {
@Override @Override
public boolean passes(Inventory inv) { public boolean passes(Inventory inv) {
Verbose.send("Running Inventory Check"); getVerbose().send("Running Inventory Check");
for (ItemStack i : inv.getContents()) { for (ItemStack i : inv.getContents()) {
if (i == null || i.getType().isAir()) continue; if (i == null || i.getType().isAir()) continue;
if (!new ItemCheck().passes(i)) { if (!new ItemCheck().passes(i)) {
Verbose.send("Inventory item failed check."); getVerbose().send("Inventory item failed check.");
return false; return false;
} }
Inventory subInventory = InventoryUtils.getInventory(i); Inventory subInventory = InventoryUtils.getInventory(i);
if (subInventory != null && !config.allowRecursion) { if (subInventory != null && !config.allowRecursion) {
Verbose.send("Recursion is disabled. Failing check."); getVerbose().send("Recursion is disabled. Failing check.");
return false; return false;
} }
if (subInventory != null && !passes(subInventory)) { if (subInventory != null && !passes(subInventory)) {
Verbose.send("Sub-inventory failed check."); getVerbose().send("Sub-inventory failed check.");
return false; return false;
} }
} }
Verbose.send("Inventory passed all checks."); getVerbose().send("Inventory passed all checks.");
return true; return true;
} }
} }

View File

@@ -1,28 +1,27 @@
package me.trouper.clonedupecore.server.events.hotbar.nbt; package me.trouper.clonedupecore.server.events.hotbar.nbt;
import de.tr7zw.nbtapi.iface.ReadWriteNBT; import de.tr7zw.nbtapi.iface.ReadWriteNBT;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
public class ComponentCheck extends AbstractCheck<ReadWriteNBT> { public class ComponentCheck extends AbstractCheck<ReadWriteNBT> {
@Override @Override
public boolean passes(ReadWriteNBT components) { public boolean passes(ReadWriteNBT components) {
Verbose.send("Checking Consumable & tool"); getVerbose().send("Checking Consumable & tool");
if (!config.allowCustomConsumables && components.getCompound("minecraft:consumable") != null) { if (!config.allowCustomConsumables && components.getCompound("minecraft:consumable") != null) {
Verbose.send("Item is consumable and not allowed."); getVerbose().send("Item is consumable and not allowed.");
return false; return false;
} }
if (!config.allowCustomTools && components.getCompound("minecraft:tool") != null) { if (!config.allowCustomTools && components.getCompound("minecraft:tool") != null) {
Verbose.send("Item is custom tool and not allowed."); getVerbose().send("Item is custom tool and not allowed.");
return false; return false;
} }
Verbose.send("Checking Entity data"); getVerbose().send("Checking Entity data");
ReadWriteNBT entityData = components.getCompound("minecraft:entity_data"); ReadWriteNBT entityData = components.getCompound("minecraft:entity_data");
if (!new EntityDataCheck().passes(entityData)) { if (!new EntityDataCheck().passes(entityData)) {
Verbose.send("Entity Data Check Failed."); getVerbose().send("Entity Data Check Failed.");
return false; return false;
} }

View File

@@ -2,7 +2,6 @@ package me.trouper.clonedupecore.server.events.hotbar.nbt;
import de.tr7zw.nbtapi.NBT; import de.tr7zw.nbtapi.NBT;
import de.tr7zw.nbtapi.iface.ReadWriteNBT; import de.tr7zw.nbtapi.iface.ReadWriteNBT;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck; import me.trouper.clonedupecore.server.events.hotbar.AbstractCheck;
import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck; import me.trouper.clonedupecore.server.events.hotbar.items.ItemCheck;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -11,30 +10,30 @@ public class EntityDataCheck extends AbstractCheck<ReadWriteNBT> {
@Override @Override
public boolean passes(ReadWriteNBT entityData) { public boolean passes(ReadWriteNBT entityData) {
if (entityData == null) { if (entityData == null) {
Verbose.send("Entity Data check passed. There was no data."); getVerbose().send("Entity Data check passed. There was no data.");
return true; return true;
} }
ReadWriteNBT itemData = entityData.getCompound("Item"); ReadWriteNBT itemData = entityData.getCompound("Item");
if (itemData != null) { if (itemData != null) {
Verbose.send("Entity data holds an item"); getVerbose().send("Entity data holds an item");
ItemStack heldItem = NBT.itemStackFromNBT(itemData); ItemStack heldItem = NBT.itemStackFromNBT(itemData);
if (heldItem != null && !new ItemCheck().passes(heldItem)) { if (heldItem != null && !new ItemCheck().passes(heldItem)) {
Verbose.send("Item contents failed check."); getVerbose().send("Item contents failed check.");
return false; return false;
} }
} }
if (entityData.hasTag("DeathTime") && entityData.getInteger("DeathTime") < 1) { if (entityData.hasTag("DeathTime") && entityData.getInteger("DeathTime") < 1) {
Verbose.send("Death time check failed."); getVerbose().send("Death time check failed.");
return false; return false;
} }
if (entityData.hasTag("HurtTime") && entityData.getInteger("HurtTime") < 1) { if (entityData.hasTag("HurtTime") && entityData.getInteger("HurtTime") < 1) {
Verbose.send("Hurt time check failed."); getVerbose().send("Hurt time check failed.");
return false; return false;
} }
Verbose.send("Entity Data check passed. There was no flagging."); getVerbose().send("Entity Data check passed. There was no flagging.");
return true; return true;
} }
} }

View File

@@ -4,8 +4,6 @@ import me.trouper.alias.server.systems.gui.QuickGui;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.List; import java.util.List;

View File

@@ -8,7 +8,6 @@ import me.trouper.clonedupecore.data.Data;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Display;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;

View File

@@ -1,104 +0,0 @@
package me.trouper.clonedupecore.server.punishment;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.function.Consumer;
public class Freeze {
private static final Map<UUID, FrozenPlayer> FROZEN_PLAYERS = new HashMap<>();
public static void quickFreeze(Player player) {
UUID uuid = player.getUniqueId();
if (!FROZEN_PLAYERS.containsKey(uuid)) {
FrozenPlayer frozen = new FrozenPlayer(uuid, player.getLocation(), null, null);
FROZEN_PLAYERS.put(uuid, frozen);
}
}
public static void freezePlayer(FrozenPlayer player) {
UUID uuid = player.getUuid();
if (!FROZEN_PLAYERS.containsKey(uuid)) {
FROZEN_PLAYERS.put(uuid, player);
}
}
public static void thawPlayer(UUID uuid) {
FROZEN_PLAYERS.remove(uuid).teleportBack();
}
public static Map<UUID, FrozenPlayer> getFrozen() {
return Collections.unmodifiableMap(FROZEN_PLAYERS);
}
public static boolean isFrozen(UUID uuid) {
return FROZEN_PLAYERS.containsKey(uuid);
}
public static FrozenPlayer get(UUID uuid) {
return FROZEN_PLAYERS.get(uuid);
}
public static class FrozenPlayer {
private final UUID uuid;
private final Location backLocation;
private final Consumer<OfflinePlayer> onQuit;
private final Consumer<Player> onMove;
private boolean allowMovement = false;
private boolean allowDamage = false;
private boolean allowCommands = false;
public FrozenPlayer(UUID uuid, Location backLocation, Consumer<OfflinePlayer> onQuit, Consumer<Player> onMove) {
this.uuid = uuid;
this.backLocation = backLocation;
this.onQuit = onQuit;
this.onMove = onMove;
}
public UUID getUuid() {
return uuid;
}
public Consumer<Player> getOnMove() {
return onMove;
}
public Consumer<OfflinePlayer> getOnQuit() {
return onQuit;
}
public void teleportBack() {
Player player = Bukkit.getPlayer(uuid);
if (player == null) return;
player.teleport(backLocation);
}
public void setAllowDamage(boolean allowDamage) {
this.allowDamage = allowDamage;
}
public void setAllowMovement(boolean allowMovement) {
this.allowMovement = allowMovement;
}
public boolean commandsAllowed() {
return allowCommands;
}
public void setAllowCommands(boolean allowCommands) {
this.allowCommands = allowCommands;
}
public boolean damageAllowed() {
return allowDamage;
}
public boolean movementAllowed() {
return allowMovement;
}
}
}

View File

@@ -6,6 +6,7 @@ import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.alias.server.systems.Text; import me.trouper.alias.server.systems.Text;
import me.trouper.clonedupecore.CloneDupeContext;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -16,7 +17,7 @@ import org.bukkit.command.CommandSender;
value = "broadcast", value = "broadcast",
permission = @Permission("clonedupe.broadcast") permission = @Permission("clonedupe.broadcast")
) )
public class BroadcastCommand implements QuickCommand { public class BroadcastCommand implements QuickCommand, CloneDupeContext {
@Override @Override
public void handleCommand(CommandSender sender, Command command, String label, Args args) { public void handleCommand(CommandSender sender, Command command, String label, Args args) {
@@ -27,9 +28,9 @@ public class BroadcastCommand implements QuickCommand {
} catch (Exception ex) { } catch (Exception ex) {
message = args.get(0) + " " + message; message = args.get(0) + " " + message;
} }
Component text = Text.color(message); Component text = getTextSystem().color(message);
Audience players = Audience.audience(Bukkit.getOnlinePlayers()); Audience players = Audience.audience(Bukkit.getOnlinePlayers());
Text.message(pallet,players,text); getTextSystem().message(pallet,players,text);
} }
@Override @Override

View File

@@ -4,7 +4,6 @@ import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class DashWand extends AbstractWand { public class DashWand extends AbstractWand {
public DashWand() { public DashWand() {
@@ -13,7 +12,7 @@ public class DashWand extends AbstractWand {
} }
@Override @Override
protected void onRightClick(Player player) { public void onRightClick(Player player) {
player.setVelocity(player.getVelocity().add(player.getEyeLocation().getDirection().normalize().multiply(2))); player.setVelocity(player.getVelocity().add(player.getEyeLocation().getDirection().normalize().multiply(2)));
} }
} }

View File

@@ -1,11 +1,11 @@
package me.trouper.clonedupecore.server.scripts; package me.trouper.clonedupecore.server.scripts;
import me.trouper.alias.server.events.QuickListener;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.alias.server.systems.world.Snapshot; import me.trouper.alias.server.systems.world.Snapshot;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import me.trouper.alias.utils.TargetingUtils; import me.trouper.alias.utils.TargetingUtils;
import me.trouper.clonedupecore.server.punishment.Freeze; import me.trouper.clonedupecore.CloneDupeContext;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
@@ -21,7 +21,7 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public class JailHeadWand extends AbstractWand implements QuickListener { public class JailHeadWand extends AbstractWand implements CloneDupeContext {
public JailHeadWand() { public JailHeadWand() {
super("clonedupe.jailwand", ItemBuilder.of(Material.PLAYER_HEAD) super("clonedupe.jailwand", ItemBuilder.of(Material.PLAYER_HEAD)
.createCustomHead("http://textures.minecraft.net/texture/a63b87ee6a55f2bf0135b26bd96ec279eded175f948c036d88a60725e127371c","Port-a-Jail") .createCustomHead("http://textures.minecraft.net/texture/a63b87ee6a55f2bf0135b26bd96ec279eded175f948c036d88a60725e127371c","Port-a-Jail")
@@ -32,18 +32,20 @@ public class JailHeadWand extends AbstractWand implements QuickListener {
private final Map<UUID,Jail> jailed = new HashMap<>(); private final Map<UUID,Jail> jailed = new HashMap<>();
@Override @Override
protected void onRightClick(Player player) { public void onRightClick(Player player) {
Optional<LivingEntity> optional = TargetingUtils.livingClosestAngle(player.getEyeLocation(),player.getEyeLocation().getDirection(),10,0.5); Optional<LivingEntity> optional = TargetingUtils.livingClosestAngle(player.getEyeLocation(),player.getEyeLocation().getDirection(),10,0.5);
if (optional.isEmpty() || !(optional.get() instanceof Player target)) return; if (optional.isEmpty() || !(optional.get() instanceof Player target)) return;
if (jailed.containsKey(target.getUniqueId())) { if (jailed.containsKey(target.getUniqueId())) {
Freeze.thawPlayer(target.getUniqueId()); getContext().getFreezeManager().getSession(target.getUniqueId()).thaw();
jailed.remove(target.getUniqueId()).revertCage(); jailed.remove(target.getUniqueId()).revertCage();
return; return;
} }
Freeze.quickFreeze(target);
Freeze.FrozenPlayer fp = new Freeze.FrozenPlayer(target.getUniqueId(),target.getLocation().clone(),null,null); FreezeSession freeze = new FreezeSession.Builder(getContext(), target.getUniqueId(),target.getLocation())
fp.setAllowMovement(true); .allowMovement()
Freeze.freezePlayer(fp); .allowDamage()
.build();
freeze.start();
Jail jail = new Jail(target); Jail jail = new Jail(target);
jail.createCage(); jail.createCage();

View File

@@ -2,11 +2,12 @@ package me.trouper.clonedupecore.server.scripts;
import me.trouper.alias.server.events.QuickListener; import me.trouper.alias.server.events.QuickListener;
import me.trouper.alias.server.events.custom.PlayerSpawnEntityEvent; import me.trouper.alias.server.events.custom.PlayerSpawnEntityEvent;
import me.trouper.clonedupecore.CloneDupeContext;
import org.bukkit.entity.Endermite; import org.bukkit.entity.Endermite;
import org.bukkit.entity.Wither; import org.bukkit.entity.Wither;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
public class MobDisablers implements QuickListener { public class MobDisablers implements QuickListener, CloneDupeContext {
@EventHandler @EventHandler
public void onSpawn(PlayerSpawnEntityEvent e) { public void onSpawn(PlayerSpawnEntityEvent e) {
@@ -20,4 +21,5 @@ public class MobDisablers implements QuickListener {
e.setCancelled(true); e.setCancelled(true);
} }
} }
} }

View File

@@ -5,6 +5,7 @@ import me.trouper.alias.server.commands.CommandRegistry;
import me.trouper.alias.server.commands.Permission; import me.trouper.alias.server.commands.Permission;
import me.trouper.alias.server.commands.QuickCommand; import me.trouper.alias.server.commands.QuickCommand;
import me.trouper.alias.server.commands.completions.CompletionBuilder; import me.trouper.alias.server.commands.completions.CompletionBuilder;
import me.trouper.clonedupecore.CloneDupeContext;
import me.trouper.clonedupecore.server.gui.RtpGui; import me.trouper.clonedupecore.server.gui.RtpGui;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -16,7 +17,7 @@ import org.bukkit.entity.Player;
blocksAllowed = false, blocksAllowed = false,
consoleAllowed = false consoleAllowed = false
) )
public class RtpCommand implements QuickCommand { public class RtpCommand implements QuickCommand, CloneDupeContext {
@Override @Override
public void handleCommand(CommandSender sender, Command command, String label, Args args) { public void handleCommand(CommandSender sender, Command command, String label, Args args) {
new RtpGui().create().build().open((Player) sender); new RtpGui().create().build().open((Player) sender);
@@ -26,4 +27,5 @@ public class RtpCommand implements QuickCommand {
public void handleCompletion(CommandSender sender, Command command, String label, Args args, CompletionBuilder b) { public void handleCompletion(CommandSender sender, Command command, String label, Args args, CompletionBuilder b) {
} }
} }

View File

@@ -40,7 +40,7 @@ public class SpawnCommand implements QuickCommandListener, Data {
Location l = setter.getLocation(); Location l = setter.getLocation();
getConfig().spawnLocation = SerialLocation.translate(l); getConfig().spawnLocation = SerialLocation.translate(l);
getConfig().save(); getConfig().save();
info(sender, Component.text("Set the spawn location to {0}."), Text.format(Text.Pallet.LOCATION,"({0},{1},{2})",l.getBlockX(),l.getBlockY(),l.getBlockZ())); info(sender, Component.text("Set the spawn location to {0}."), getTextSystem().format(Text.Pallet.LOCATION,"({0},{1},{2})",l.getBlockX(),l.getBlockY(),l.getBlockZ()));
return; return;
} }
Player target = Bukkit.getPlayerExact(args.get(0).toString()); Player target = Bukkit.getPlayerExact(args.get(0).toString());
@@ -81,7 +81,7 @@ public class SpawnCommand implements QuickCommandListener, Data {
successAny(player, "Teleporting to spawn in {0} seconds. Don't move or take damage!", WARMUP_TICKS / 20); successAny(player, "Teleporting to spawn in {0} seconds. Don't move or take damage!", WARMUP_TICKS / 20);
AtomicInteger secondsLeft = new AtomicInteger((int) WARMUP_TICKS / 20); AtomicInteger secondsLeft = new AtomicInteger((int) WARMUP_TICKS / 20);
Bukkit.getScheduler().runTaskTimer(main.getPlugin(),(task)->{ Bukkit.getScheduler().runTaskTimer(getPlugin(),(task)->{
if (!warmups.containsKey(player.getUniqueId()) || secondsLeft.get() < 0 || !player.isOnline()) { if (!warmups.containsKey(player.getUniqueId()) || secondsLeft.get() < 0 || !player.isOnline()) {
task.cancel(); task.cancel();
return; return;
@@ -89,7 +89,7 @@ public class SpawnCommand implements QuickCommandListener, Data {
if (secondsLeft.get() % 5 == 0 || secondsLeft.get() <= 3) { if (secondsLeft.get() % 5 == 0 || secondsLeft.get() <= 3) {
if (secondsLeft.get() > 0) { if (secondsLeft.get() > 0) {
player.sendActionBar(Text.format(Text.Pallet.INFO,"Teleporting in {0}!",secondsLeft.get())); player.sendActionBar(getTextSystem().format(Text.Pallet.INFO,"Teleporting in {0}!",secondsLeft.get()));
} else { } else {
warmups.remove(player.getUniqueId()); warmups.remove(player.getUniqueId());
teleportToSpawn(player, true); teleportToSpawn(player, true);
@@ -152,4 +152,5 @@ public class SpawnCommand implements QuickCommandListener, Data {
if (p.getLocation().distanceSquared(loc) > 100*100) return; if (p.getLocation().distanceSquared(loc) > 100*100) return;
p.teleport(loc); p.teleport(loc);
} }
} }

View File

@@ -1,12 +1,7 @@
package me.trouper.clonedupecore.server.punishment; package me.trouper.clonedupecore.server.systems.punishment;
import club.minnced.discord.webhook.WebhookClient;
import club.minnced.discord.webhook.WebhookClientBuilder;
import club.minnced.discord.webhook.send.WebhookEmbed;
import club.minnced.discord.webhook.send.WebhookEmbedBuilder;
import litebans.api.Database; import litebans.api.Database;
import litebans.api.Entry; import me.trouper.clonedupecore.CloneDupeContext;
import me.trouper.alias.server.Main;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -16,9 +11,8 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
public class LiteBansManager { public class LiteBansManager implements CloneDupeContext {
/** /**
* Get all ban entries for a specific player * Get all ban entries for a specific player
@@ -131,7 +125,7 @@ public class LiteBansManager {
* Execute a ban using LiteBans template system * Execute a ban using LiteBans template system
*/ */
public void executeBan(OfflinePlayer player, String template, CommandSender executor) { public void executeBan(OfflinePlayer player, String template, CommandSender executor) {
Bukkit.getScheduler().runTask(Main.main.getPlugin(),()-> { Bukkit.getScheduler().runTask(getPlugin(),()-> {
Bukkit.dispatchCommand(executor, Bukkit.dispatchCommand(executor,
String.format("litebans:ban %s %s -s", player.getName(), template)); String.format("litebans:ban %s %s -s", player.getName(), template));
}); });

View File

@@ -1,10 +1,9 @@
package me.trouper.clonedupecore.server.punishment; package me.trouper.clonedupecore.server.systems.punishment;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.Instant;
public class WrappedEntry implements Data { public class WrappedEntry implements Data {

View File

@@ -1,19 +1,14 @@
package me.trouper.clonedupecore.server.punishment.animations; package me.trouper.clonedupecore.server.systems.punishment.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.clonedupecore.server.punishment.Freeze;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.FallingBlock; import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
public class AnvilAnimation extends PunishmentAnimation { public class AnvilAnimation extends PunishmentAnimation {
@@ -28,10 +23,10 @@ public class AnvilAnimation extends PunishmentAnimation {
@Override @Override
protected void tick(int ticksElapsed) { protected void tick(int ticksElapsed) {
Freeze.quickFreeze(player); new FreezeSession.Builder(getContext(),player.getUniqueId(),player.getLocation()).build().start();
if (!spawned) { if (!spawned) {
spawnAnvilRing(); spawnAnvilRing();
DisplayUtils.ring(player.getLocation().add(0,10,0),5,1,(point)->{ getContext().getDisplayManager().getPatterns().ring(player.getLocation().add(0,10,0),5,1,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.CLOUD) .type(Particle.CLOUD)
.speed(0.07F) .speed(0.07F)
@@ -44,7 +39,7 @@ public class AnvilAnimation extends PunishmentAnimation {
} }
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
int finalI = i; int finalI = i;
DisplayUtils.ring(player.getLocation().add(0,0.1,0), (double)i/2D,0.5,(point)->{ getContext().getDisplayManager().getPatterns().ring(player.getLocation().add(0,0.1,0), (double)i/2D,0.5,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.DUST) .type(Particle.DUST)
.data(new Particle.DustOptions(finalI % 2 == 0 ? Color.RED : Color.WHITE,2F)) .data(new Particle.DustOptions(finalI % 2 == 0 ? Color.RED : Color.WHITE,2F))
@@ -67,7 +62,7 @@ public class AnvilAnimation extends PunishmentAnimation {
int amount = 12; int amount = 12;
for (int i = 0; i < amount; i++) { for (int i = 0; i < amount; i++) {
int finalI = i; int finalI = i;
Bukkit.getScheduler().runTaskLater(main.getPlugin(),()->{ Bukkit.getScheduler().runTaskLater(getPlugin(),()->{
double angle = 2 * Math.PI * finalI / amount; double angle = 2 * Math.PI * finalI / amount;
int RADIUS = 5; int RADIUS = 5;
double x = center.getX() + RADIUS * Math.cos(angle); double x = center.getX() + RADIUS * Math.cos(angle);
@@ -91,7 +86,7 @@ public class AnvilAnimation extends PunishmentAnimation {
@Override @Override
protected void cleanup() { protected void cleanup() {
Freeze.thawPlayer(player.getUniqueId()); getContext().getFreezeManager().getSession(player.getUniqueId()).thaw();
for (FallingBlock block : spawnedAnvils) { for (FallingBlock block : spawnedAnvils) {
if (!block.isDead()) { if (!block.isDead()) {
block.remove(); block.remove();

View File

@@ -1,8 +1,7 @@
package me.trouper.clonedupecore.server.punishment.animations; package me.trouper.clonedupecore.server.systems.punishment.animations;
import me.trouper.alias.server.systems.Verbose; import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.alias.utils.VectorUtils; import me.trouper.alias.utils.VectorUtils;
import me.trouper.clonedupecore.server.punishment.Freeze;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Particle; import org.bukkit.Particle;
import org.bukkit.World; import org.bukkit.World;
@@ -27,8 +26,7 @@ public class GwenAnimation extends PunishmentAnimation {
@Override @Override
protected void tick(int ticksElapsed) { protected void tick(int ticksElapsed) {
Freeze.quickFreeze(player); new FreezeSession.Builder(getContext(),player.getUniqueId(),player.getLocation()).build().start();
Location head = player.getEyeLocation(); Location head = player.getEyeLocation();
Location center = head.clone().add(0, 3, 0); Location center = head.clone().add(0, 3, 0);
World w = head.getWorld(); World w = head.getWorld();
@@ -37,7 +35,7 @@ public class GwenAnimation extends PunishmentAnimation {
head.getWorld().spawnParticle(Particle.EXPLOSION_EMITTER,head,10,1,1,1); head.getWorld().spawnParticle(Particle.EXPLOSION_EMITTER,head,10,1,1,1);
head.getWorld().strikeLightningEffect(head); head.getWorld().strikeLightningEffect(head);
Verbose.send("Closing G.W.E.N. animation"); getVerbose().send("Closing G.W.E.N. animation");
close(); close();
return; return;
} }
@@ -86,7 +84,7 @@ public class GwenAnimation extends PunishmentAnimation {
@Override @Override
protected void cleanup() { protected void cleanup() {
Freeze.thawPlayer(player.getUniqueId()); getContext().getFreezeManager().getSession(player.getUniqueId()).thaw();
for (Entity entity : guardians) { for (Entity entity : guardians) {
if (entity == null) continue; if (entity == null) continue;

View File

@@ -1,8 +1,6 @@
package me.trouper.clonedupecore.server.punishment.animations; package me.trouper.clonedupecore.server.systems.punishment.animations;
import me.trouper.alias.server.systems.tracing.BlockDisplayRaytracer; import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.alias.server.systems.visual.DisplayUtils;
import me.trouper.clonedupecore.server.punishment.Freeze;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@@ -19,7 +17,7 @@ public class LaserAnimation extends PunishmentAnimation {
@Override @Override
protected void tick(int ticksElapsed) { protected void tick(int ticksElapsed) {
Freeze.quickFreeze(player); new FreezeSession.Builder(getContext(),player.getUniqueId(),player.getLocation()).build().start();
Location target = player.getEyeLocation(); Location target = player.getEyeLocation();
Location center = player.getLocation(); Location center = player.getLocation();
@@ -29,12 +27,12 @@ public class LaserAnimation extends PunishmentAnimation {
} }
if (ticksElapsed == 1) { if (ticksElapsed == 1) {
DisplayUtils.sphereWave(target,8,1,1,(point)->{ getContext().getDisplayManager().getPatterns().sphereWave(target,8,1,1,(point)->{
point.getWorld().spawnParticle(Particle.SMOKE,point,2,0.5,0.5,0.5,0.01); point.getWorld().spawnParticle(Particle.SMOKE,point,2,0.5,0.5,0.5,0.01);
point.getWorld().spawnParticle(Particle.FLAME,point,2,0.5,0.5,0.5,0.01); point.getWorld().spawnParticle(Particle.FLAME,point,2,0.5,0.5,0.5,0.01);
}); });
DisplayUtils.wave(player.getLocation().clone().add(0,0.5,0),5,point -> { getContext().getDisplayManager().getPatterns().wave(player.getLocation().clone().add(0,0.5,0),5,point -> {
Block block = point.getWorld().getBlockAt(point.clone().subtract(0,2,0)); Block block = point.getWorld().getBlockAt(point.clone().subtract(0,2,0));
point.getWorld().spawn(point, FallingBlock.class,(launched)->{ point.getWorld().spawn(point, FallingBlock.class,(launched)->{
launched.setVelocity(point.toVector().subtract(center.toVector()).normalize().multiply(0.4).setY(1)); launched.setVelocity(point.toVector().subtract(center.toVector()).normalize().multiply(0.4).setY(1));
@@ -51,14 +49,14 @@ public class LaserAnimation extends PunishmentAnimation {
Location orbit = player.getLocation().clone().add(200-ticksElapsed*2,0,100); Location orbit = player.getLocation().clone().add(200-ticksElapsed*2,0,100);
orbit.setY(315); orbit.setY(315);
Bukkit.getScheduler().runTask(main.getPlugin(),()->{ Bukkit.getScheduler().runTask(getPlugin(),()->{
BlockDisplayRaytracer.trace(Material.SMOOTH_QUARTZ,target,orbit,0.5,2); getDisplayManager().getBlockDisplayRaytracer().trace(Material.SMOOTH_QUARTZ,target,orbit,0.5,2);
BlockDisplayRaytracer.trace(Material.RED_STAINED_GLASS,target,orbit,1 + main.random().nextDouble(),2); getDisplayManager().getBlockDisplayRaytracer().trace(Material.RED_STAINED_GLASS,target,orbit,1 + random().nextDouble(),2);
}); });
} }
@Override @Override
protected void cleanup() { protected void cleanup() {
Freeze.thawPlayer(player.getUniqueId()); getContext().getFreezeManager().getSession(player.getUniqueId()).thaw();
} }
} }

View File

@@ -1,9 +1,9 @@
package me.trouper.clonedupecore.server.punishment.animations; package me.trouper.clonedupecore.server.systems.punishment.animations;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import me.trouper.clonedupecore.server.punishment.Freeze; import me.trouper.clonedupecore.server.systems.trolls.DragTrollWand;
import me.trouper.clonedupecore.server.trolls.DragTrollWand;
import me.trouper.clonedupecore.utils.PlayerUtils; import me.trouper.clonedupecore.utils.PlayerUtils;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@@ -21,7 +21,7 @@ public class LightningAnimation extends PunishmentAnimation {
@Override @Override
protected void tick(int ticksElapsed) { protected void tick(int ticksElapsed) {
Freeze.quickFreeze(player); new FreezeSession.Builder(getContext(),player.getUniqueId(),player.getLocation()).build().start();
Location cloudCenter = player.getLocation().clone().add(0,10,0); Location cloudCenter = player.getLocation().clone().add(0,10,0);
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.CLOUD) .type(Particle.CLOUD)
@@ -34,8 +34,8 @@ public class LightningAnimation extends PunishmentAnimation {
.offset(0.3,1,0.3) .offset(0.3,1,0.3)
.spawn(player.getLocation().clone().add(0,1,0)); .spawn(player.getLocation().clone().add(0,1,0));
double x = main.randomizer().getRandomDouble(-4,4); double x = randomizer().getRandomDouble(-4,4);
double z = main.randomizer().getRandomDouble(-4,4); double z = randomizer().getRandomDouble(-4,4);
Location lightningLoc = cloudCenter.clone().add(x,0,z); Location lightningLoc = cloudCenter.clone().add(x,0,z);
if (ticksElapsed > 40) { if (ticksElapsed > 40) {
@@ -44,7 +44,7 @@ public class LightningAnimation extends PunishmentAnimation {
new SoundPlayer(Sound.ENTITY_LIGHTNING_BOLT_IMPACT,1,1).playAt(player.getLocation(),30); new SoundPlayer(Sound.ENTITY_LIGHTNING_BOLT_IMPACT,1,1).playAt(player.getLocation(),30);
new SoundPlayer(Sound.ENTITY_LIGHTNING_BOLT_THUNDER,1,1).playAt(lightningLoc,30); new SoundPlayer(Sound.ENTITY_LIGHTNING_BOLT_THUNDER,1,1).playAt(lightningLoc,30);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
DragTrollWand.drawLightning(lightningLoc,player.getEyeLocation(), Material.BLUE_ICE, Material.LIGHT_BLUE_STAINED_GLASS); new DragTrollWand().drawLightning(lightningLoc,player.getEyeLocation(), Material.BLUE_ICE, Material.LIGHT_BLUE_STAINED_GLASS);
} }
} }
} }
@@ -56,6 +56,6 @@ public class LightningAnimation extends PunishmentAnimation {
@Override @Override
protected void cleanup() { protected void cleanup() {
Freeze.thawPlayer(player.getUniqueId()); getContext().getFreezeManager().getSession(player.getUniqueId()).thaw();
} }
} }

View File

@@ -1,11 +1,9 @@
package me.trouper.clonedupecore.server.punishment.animations; package me.trouper.clonedupecore.server.systems.punishment.animations;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.server.systems.freeze.FreezeSession;
import me.trouper.clonedupecore.server.punishment.Freeze; import me.trouper.clonedupecore.server.systems.trolls.DragTrollWand;
import me.trouper.clonedupecore.server.trolls.DragTrollWand; import me.trouper.clonedupecore.server.systems.trolls.MatrixTroll;
import me.trouper.clonedupecore.server.trolls.MatrixTroll;
import org.bukkit.Bukkit;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@@ -16,12 +14,9 @@ import org.bukkit.entity.TextDisplay;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Transformation; import org.bukkit.util.Transformation;
import org.joml.AxisAngle4f; import org.joml.AxisAngle4f;
import org.joml.Quaternionf;
import org.joml.Vector3f; import org.joml.Vector3f;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@@ -43,16 +38,16 @@ public class MatrixAnimation extends PunishmentAnimation{
center.setPitch(0); center.setPitch(0);
ThreadLocalRandom random = ThreadLocalRandom.current(); ThreadLocalRandom random = ThreadLocalRandom.current();
DragTrollWand.drawLightning(center,center.clone().add( new DragTrollWand().drawLightning(center,center.clone().add(
random.nextDouble(-8,8), random.nextDouble(-8,8),
random.nextDouble(0,8), random.nextDouble(0,8),
random.nextDouble(-8,8) random.nextDouble(-8,8)
), Material.LIME_CONCRETE,Material.LIME_STAINED_GLASS); ), Material.LIME_CONCRETE,Material.LIME_STAINED_GLASS);
if (ticksElapsed != 1) return; if (ticksElapsed != 1) return;
Freeze.quickFreeze(player); new FreezeSession.Builder(getContext(),player.getUniqueId(),player.getLocation()).build().start();
DisplayUtils.sphereWave(center,5,0.5,2,(point)->{ getContext().getDisplayManager().getPatterns().sphereWave(center,5,0.5,2,(point)->{
TextDisplay display = point.getWorld().spawn(point,TextDisplay.class,(td)->{ TextDisplay display = point.getWorld().spawn(point,TextDisplay.class,(td)->{
td.text(MatrixTroll.generateMatrix(2,2)); td.text(MatrixTroll.generateMatrix(2,2));
td.setBillboard(Display.Billboard.FIXED); td.setBillboard(Display.Billboard.FIXED);
@@ -69,7 +64,7 @@ public class MatrixAnimation extends PunishmentAnimation{
td.setBrightness(new Display.Brightness(15,15)); td.setBrightness(new Display.Brightness(15,15));
}); });
ScheduledTask task = display.getScheduler().runAtFixedRate(main.getPlugin(),(t)->{ ScheduledTask task = display.getScheduler().runAtFixedRate(getPlugin(),(t)->{
float yawDegrees = random.nextFloat() * 360; float yawDegrees = random.nextFloat() * 360;
float yawRadians = (float) Math.toRadians(yawDegrees); float yawRadians = (float) Math.toRadians(yawDegrees);
AxisAngle4f angle = new AxisAngle4f(yawRadians,0,1,0); AxisAngle4f angle = new AxisAngle4f(yawRadians,0,1,0);
@@ -88,7 +83,7 @@ public class MatrixAnimation extends PunishmentAnimation{
@Override @Override
protected void cleanup() { protected void cleanup() {
Freeze.thawPlayer(player.getUniqueId()); getContext().getFreezeManager().getSession(player.getUniqueId()).thaw();
for (Map.Entry<Entity, ScheduledTask> entry : cleanupList.entrySet()) { for (Map.Entry<Entity, ScheduledTask> entry : cleanupList.entrySet()) {
entry.getValue().cancel(); entry.getValue().cancel();
entry.getKey().remove(); entry.getKey().remove();

View File

@@ -1,7 +1,6 @@
package me.trouper.clonedupecore.server.punishment.animations; package me.trouper.clonedupecore.server.systems.punishment.animations;
import me.trouper.alias.server.Main; import me.trouper.clonedupecore.CloneDupeContext;
import me.trouper.alias.server.systems.Verbose;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@@ -9,7 +8,7 @@ import org.bukkit.scheduler.BukkitRunnable;
import java.io.Closeable; import java.io.Closeable;
public abstract class PunishmentAnimation extends BukkitRunnable implements Closeable, Main { public abstract class PunishmentAnimation extends BukkitRunnable implements Closeable, CloneDupeContext {
protected final JavaPlugin plugin; protected final JavaPlugin plugin;
protected final String playerName; protected final String playerName;
@@ -28,7 +27,7 @@ public abstract class PunishmentAnimation extends BukkitRunnable implements Clos
this.playerName = player.getName(); this.playerName = player.getName();
this.finishTask = finishTask; this.finishTask = finishTask;
Verbose.send("Animation created, running task timer..."); getVerbose().send("Animation created, running task timer...");
runTaskTimer(plugin, 0L, 1L); runTaskTimer(plugin, 0L, 1L);
} }
@@ -43,19 +42,19 @@ public abstract class PunishmentAnimation extends BukkitRunnable implements Clos
this.player = Bukkit.getPlayerExact(playerName); this.player = Bukkit.getPlayerExact(playerName);
if (this.player == null || !this.player.isOnline()) { if (this.player == null || !this.player.isOnline()) {
Verbose.send("Finishing animation due to player logging off!"); getVerbose().send("Finishing animation due to player logging off!");
finishAnimation(); finishAnimation();
return; return;
} }
try { try {
Bukkit.getScheduler().runTask(main.getPlugin(),()->{ Bukkit.getScheduler().runTask(getPlugin(),()->{
tick(ticksElapsed++); tick(ticksElapsed++);
}); });
} catch (Exception e) { } catch (Exception e) {
Verbose.send("An animation experienced an unexpected runtime exception while ticking."); getVerbose().send("An animation experienced an unexpected runtime exception while ticking.");
e.printStackTrace(); e.printStackTrace();
Bukkit.getScheduler().runTask(main.getPlugin(), this::finishAnimation); Bukkit.getScheduler().runTask(getPlugin(), this::finishAnimation);
} }
} }
@@ -90,4 +89,5 @@ public abstract class PunishmentAnimation extends BukkitRunnable implements Clos
public boolean isFinished() { public boolean isFinished() {
return finished; return finished;
} }
} }

View File

@@ -1,12 +1,14 @@
package me.trouper.clonedupecore.server.trims; package me.trouper.clonedupecore.server.systems.trims;
import me.trouper.alias.server.Main; import me.trouper.clonedupecore.CloneDupeContext;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Set; import java.util.Set;
public abstract class MaterialAnimation implements Main { public abstract class MaterialAnimation implements CloneDupeContext {
private final ValidMaterial material; private final ValidMaterial material;
private final long loopDuration; private final long loopDuration;
@@ -26,4 +28,4 @@ public abstract class MaterialAnimation implements Main {
public abstract void tickMoving(Player player, Set<Player> viewers, long loopTime); public abstract void tickMoving(Player player, Set<Player> viewers, long loopTime);
public abstract void tickStationary(Player player, Set<Player> viewers, long loopTime); public abstract void tickStationary(Player player, Set<Player> viewers, long loopTime);
public abstract void onRemove(OfflinePlayer player); public abstract void onRemove(OfflinePlayer player);
} }

View File

@@ -1,9 +1,9 @@
package me.trouper.clonedupecore.server.trims; package me.trouper.clonedupecore.server.systems.trims;
import me.trouper.alias.server.Registrar;
import me.trouper.alias.server.events.QuickListener; import me.trouper.alias.server.events.QuickListener;
import me.trouper.alias.server.events.Registrar;
import me.trouper.alias.server.systems.Verbose;
import me.trouper.clonedupecore.data.Data; import me.trouper.clonedupecore.data.Data;
import me.trouper.clonedupecore.server.systems.trims.animations.*;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -23,13 +23,26 @@ public class TrimManager implements QuickListener, Data {
private final ConcurrentHashMap<UUID, MaterialAnimation> lastAnimationMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap<UUID, MaterialAnimation> lastAnimationMap = new ConcurrentHashMap<>();
private final Set<UUID> isStationary = new HashSet<>(); private final Set<UUID> isStationary = new HashSet<>();
public void register(MaterialAnimation animation) { public TrimManager() {
this.addAnimation(new AmethystAnimation());
this.addAnimation(new CopperAnimation());
this.addAnimation(new DiamondAnimation());
this.addAnimation(new EmeraldAnimation());
this.addAnimation(new GoldAnimation());
this.addAnimation(new IronAnimation());
this.addAnimation(new LapisAnimation());
this.addAnimation(new NetheriteAnimation());
this.addAnimation(new QuartzAnimation());
this.addAnimation(new RedstoneAnimation());
}
public void addAnimation(MaterialAnimation animation) {
allAnimations.add(animation); allAnimations.add(animation);
} }
public void startTicking() { public void startTicking() {
AtomicInteger globalTime = new AtomicInteger(0); AtomicInteger globalTime = new AtomicInteger(0);
Bukkit.getScheduler().runTaskTimer(main.getPlugin(), () -> { Bukkit.getScheduler().runTaskTimer(getPlugin(), () -> {
Bukkit.getOnlinePlayers().forEach(player->{ Bukkit.getOnlinePlayers().forEach(player->{
if (!player.isOnline()) return; if (!player.isOnline()) return;
tickPlayer(player, globalTime.get()); tickPlayer(player, globalTime.get());
@@ -44,7 +57,7 @@ public class TrimManager implements QuickListener, Data {
if (!player.isOnline()) return; if (!player.isOnline()) return;
if (activeAnimation == null && lastAnimationMap.containsKey(playerId)) { if (activeAnimation == null && lastAnimationMap.containsKey(playerId)) {
MaterialAnimation lastAnimation = lastAnimationMap.remove(playerId); MaterialAnimation lastAnimation = lastAnimationMap.remove(playerId);
Verbose.send("Player has no active animation, removing and stopping {0}, their last active animation.", lastAnimation.getMaterial().name()); getVerbose().send("Player has no active animation, removing and stopping {0}, their last active animation.", lastAnimation.getMaterial().name());
lastAnimation.onRemove(player); lastAnimation.onRemove(player);
return; return;
} }
@@ -85,7 +98,7 @@ public class TrimManager implements QuickListener, Data {
public void tick(Location currentLocation) { public void tick(Location currentLocation) {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (lastLocation.distanceSquared(currentLocation) > 0.01) { if (!currentLocation.getWorld().getName().equals(lastLocation.getWorld().getName()) || lastLocation.distanceSquared(currentLocation) > 0.01) {
lastMovedTime = now; lastMovedTime = now;
} }
isStationary = (now - lastMovedTime) >= 1000; isStationary = (now - lastMovedTime) >= 1000;
@@ -121,13 +134,13 @@ public class TrimManager implements QuickListener, Data {
public void onQuit(PlayerQuitEvent e) { public void onQuit(PlayerQuitEvent e) {
Player player = e.getPlayer(); Player player = e.getPlayer();
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
Verbose.send("{0} has quit!",player.getName()); getVerbose().send("{0} has quit!",player.getName());
if (lastAnimationMap.containsKey(playerId)) { if (lastAnimationMap.containsKey(playerId)) {
MaterialAnimation lastAnimation = lastAnimationMap.get(playerId); MaterialAnimation lastAnimation = lastAnimationMap.get(playerId);
Verbose.send("Last animation for {0} is {1}.",player.getName(),lastAnimation.getMaterial().name()); getVerbose().send("Last animation for {0} is {1}.",player.getName(),lastAnimation.getMaterial().name());
lastAnimation.onRemove(player); lastAnimation.onRemove(player);
} else { } else {
Verbose.send("{0} had no active animations.",player.getName()); getVerbose().send("{0} had no active animations.",player.getName());
} }
} }
} }

View File

@@ -1,4 +1,4 @@
package me.trouper.clonedupecore.server.trims; package me.trouper.clonedupecore.server.systems.trims;
import org.bukkit.Material; import org.bukkit.Material;
@@ -38,7 +38,7 @@ public enum ValidArmorType {
return boots; return boots;
} }
public static ValidArmorType validate(Material armor) { public ValidArmorType validate(Material armor) {
for (ValidArmorType value : values()) { for (ValidArmorType value : values()) {
if (value.helmet.equals(armor) || value.chestplate.equals(armor) || value.leggings.equals(armor) || value.boots.equals(armor)) return value; if (value.helmet.equals(armor) || value.chestplate.equals(armor) || value.leggings.equals(armor) || value.boots.equals(armor)) return value;
} }

View File

@@ -1,4 +1,4 @@
package me.trouper.clonedupecore.server.trims; package me.trouper.clonedupecore.server.systems.trims;
import me.trouper.clonedupecore.utils.ArmorUtils; import me.trouper.clonedupecore.utils.ArmorUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@@ -1,9 +1,8 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -36,7 +35,7 @@ public class AmethystAnimation extends MaterialAnimation {
double phase = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI; double phase = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI;
double radius = 1.5 + 0.5 * Math.sin(phase * 2); double radius = 1.5 + 0.5 * Math.sin(phase * 2);
DisplayUtils.ring(playerLoc, radius, (point)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc, radius, (point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.DUST) .type(Particle.DUST)
.data(new Particle.DustOptions(AMETHYST_COLOR,1F)) .data(new Particle.DustOptions(AMETHYST_COLOR,1F))
@@ -59,7 +58,7 @@ public class AmethystAnimation extends MaterialAnimation {
} }
if (loopTime % 20 == 0) { if (loopTime % 20 == 0) {
DisplayUtils.helix(playerLoc.clone().subtract(0, 0.5, 0), 0.8, (loc)->{ getContext().getDisplayManager().getPatterns().helix(playerLoc.clone().subtract(0, 0.5, 0), 0.8, (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)

View File

@@ -1,10 +1,12 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial; import org.bukkit.Location;
import org.bukkit.*; import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.Particle;
import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.BlockDisplay;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Transformation; import org.bukkit.util.Transformation;
@@ -48,11 +50,11 @@ public class CopperAnimation extends MaterialAnimation {
BlockDisplay display = player.getWorld().spawn(loc, BlockDisplay.class,disp->{ BlockDisplay display = player.getWorld().spawn(loc, BlockDisplay.class,disp->{
disp.setVisibleByDefault(false); disp.setVisibleByDefault(false);
viewers.forEach(viewer->{ viewers.forEach(viewer->{
viewer.showEntity(main.getPlugin(),disp); viewer.showEntity(getContext().getPlugin(),disp);
}); });
}); });
display.setBlock(Material.COPPER_BLOCK.createBlockData()); display.setBlock(Material.COPPER_BLOCK.createBlockData());
display.addScoreboardTag(main.getCommon().getTempTag()); display.addScoreboardTag(getContext().getCommon().getTempTag());
display.setInterpolationDuration(1); display.setInterpolationDuration(1);
display.setInterpolationDelay(0); display.setInterpolationDelay(0);
list.add(display); list.add(display);
@@ -87,7 +89,7 @@ public class CopperAnimation extends MaterialAnimation {
if (loopTime % 25 == 0) { if (loopTime % 25 == 0) {
Location groundLoc = player.getLocation(); Location groundLoc = player.getLocation();
DisplayUtils.wave(groundLoc, 4.0, 1.2f, 0.5, (point) -> { getContext().getDisplayManager().getPatterns().wave(groundLoc, 4.0, 1.2f, 0.5, (point) -> {
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.BLOCK) .type(Particle.BLOCK)
@@ -98,7 +100,7 @@ public class CopperAnimation extends MaterialAnimation {
if (loopTime % 15 == 0) { if (loopTime % 15 == 0) {
Location groundLoc = player.getLocation(); Location groundLoc = player.getLocation();
DisplayUtils.wave(groundLoc, 2.0, 0.4f, 0.2, (point) -> { getContext().getDisplayManager().getPatterns().wave(groundLoc, 2.0, 0.4f, 0.2, (point) -> {
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.WAX_ON) .type(Particle.WAX_ON)

View File

@@ -1,9 +1,8 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.BlockDisplay;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -48,12 +47,12 @@ public class DiamondAnimation extends MaterialAnimation {
BlockDisplay display = player.getWorld().spawn(initialLoc, BlockDisplay.class,disp->{ BlockDisplay display = player.getWorld().spawn(initialLoc, BlockDisplay.class,disp->{
disp.setVisibleByDefault(false); disp.setVisibleByDefault(false);
viewers.forEach(viewer->{ viewers.forEach(viewer->{
viewer.showEntity(main.getPlugin(),disp); viewer.showEntity(getContext().getPlugin(),disp);
}); });
}); });
display.setBlock(Material.DIAMOND_BLOCK.createBlockData()); display.setBlock(Material.DIAMOND_BLOCK.createBlockData());
display.addScoreboardTag(main.getCommon().getTempTag()); display.addScoreboardTag(getContext().getCommon().getTempTag());
display.setInterpolationDuration(1); display.setInterpolationDuration(1);
display.setInterpolationDelay(0); display.setInterpolationDelay(0);
list.add(display); list.add(display);

View File

@@ -1,12 +1,10 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.Set; import java.util.Set;
@@ -55,7 +53,7 @@ public class EmeraldAnimation extends MaterialAnimation {
double pulsePhase = (loopTime % 30) / 30.0 * 2 * Math.PI; double pulsePhase = (loopTime % 30) / 30.0 * 2 * Math.PI;
double pulseRadius = 2.0 + 0.5 * Math.sin(pulsePhase); double pulseRadius = 2.0 + 0.5 * Math.sin(pulsePhase);
DisplayUtils.ring(playerLoc, pulseRadius,0.9,(loc)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc, pulseRadius,0.9,(loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.HAPPY_VILLAGER) .type(Particle.HAPPY_VILLAGER)

View File

@@ -1,9 +1,8 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -19,7 +18,7 @@ public class GoldAnimation extends MaterialAnimation {
@Override @Override
public void tickMoving(Player player, Set<Player> viewers, long loopTime) { public void tickMoving(Player player, Set<Player> viewers, long loopTime) {
DisplayUtils.ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{ getContext().getDisplayManager().getPatterns().ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.DUST) .type(Particle.DUST)
.data(new Particle.DustOptions(GOLD_COLOR,0.3F)) .data(new Particle.DustOptions(GOLD_COLOR,0.3F))
@@ -42,7 +41,7 @@ public class GoldAnimation extends MaterialAnimation {
double crownAngle = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI; double crownAngle = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI;
DisplayUtils.ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{ getContext().getDisplayManager().getPatterns().ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.DUST) .type(Particle.DUST)
.data(new Particle.DustOptions(GOLD_COLOR,0.5F)) .data(new Particle.DustOptions(GOLD_COLOR,0.5F))
@@ -73,7 +72,7 @@ public class GoldAnimation extends MaterialAnimation {
double ringPhase = wealthPhase + ring * Math.PI / 2; double ringPhase = wealthPhase + ring * Math.PI / 2;
double ringHeight = Math.sin(ringPhase) * 0.3; double ringHeight = Math.sin(ringPhase) * 0.3;
DisplayUtils.ring(playerLoc.clone().add(0, ringHeight + 0.6, 0), ringRadius, 0.8f,(loc)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc.clone().add(0, ringHeight + 0.6, 0), ringRadius, 0.8f,(loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)

View File

@@ -1,9 +1,9 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.alias.utils.misc.Randomizer;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.ValidMaterial; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.ItemDisplay;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -58,11 +58,11 @@ public class IronAnimation extends MaterialAnimation {
ItemDisplay shield = player.getWorld().spawn(initialLoc, ItemDisplay.class,disp->{ ItemDisplay shield = player.getWorld().spawn(initialLoc, ItemDisplay.class,disp->{
disp.setVisibleByDefault(false); disp.setVisibleByDefault(false);
viewers.forEach(viewer->{ viewers.forEach(viewer->{
viewer.showEntity(main.getPlugin(),disp); viewer.showEntity(getContext().getPlugin(),disp);
}); });
}); });
shield.setItemStack(new ItemStack(main.randomizer().getRandomElement(IRON_ITEMS))); shield.setItemStack(new ItemStack(new Randomizer().getRandomElement(IRON_ITEMS)));
shield.addScoreboardTag(main.getCommon().getTempTag()); shield.addScoreboardTag(getContext().getCommon().getTempTag());
shield.setInterpolationDuration(1); shield.setInterpolationDuration(1);
shield.setInterpolationDelay(0); shield.setInterpolationDelay(0);
list.add(shield); list.add(shield);
@@ -112,7 +112,7 @@ public class IronAnimation extends MaterialAnimation {
} }
if (loopTime % 30 == 0) { if (loopTime % 30 == 0) {
DisplayUtils.wave(playerLoc, 3.5, loc->{ getContext().getDisplayManager().getPatterns().wave(playerLoc, 3.5, loc->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)
@@ -123,7 +123,7 @@ public class IronAnimation extends MaterialAnimation {
if (loopTime % 5 == 0) { if (loopTime % 5 == 0) {
Location dustLoc = playerLoc.clone().add(0, 0.1, 0); Location dustLoc = playerLoc.clone().add(0, 0.1, 0);
DisplayUtils.ring(dustLoc, 1.8, 0.18,(loc)->{ getContext().getDisplayManager().getPatterns().ring(dustLoc, 1.8, 0.18,(loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.BLOCK) .type(Particle.BLOCK)

View File

@@ -1,9 +1,8 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -19,7 +18,7 @@ public class LapisAnimation extends MaterialAnimation {
@Override @Override
public void tickMoving(Player player, Set<Player> viewers, long loopTime) { public void tickMoving(Player player, Set<Player> viewers, long loopTime) {
DisplayUtils.ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{ getContext().getDisplayManager().getPatterns().ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.ENCHANT) .type(Particle.ENCHANT)
.viewers(viewers) .viewers(viewers)
@@ -41,7 +40,7 @@ public class LapisAnimation extends MaterialAnimation {
double magicAngle = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI; double magicAngle = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI;
DisplayUtils.ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{ getContext().getDisplayManager().getPatterns().ring(player.getLocation().clone().add(0, 2.1, 0), 0.3, 0.5f,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.ENCHANT) .type(Particle.ENCHANT)
.viewers(viewers) .viewers(viewers)
@@ -59,7 +58,7 @@ public class LapisAnimation extends MaterialAnimation {
int startAngle = (int)(Math.toDegrees(circleAngle) + segment * 60); int startAngle = (int)(Math.toDegrees(circleAngle) + segment * 60);
int endAngle = startAngle + 30; int endAngle = startAngle + 30;
DisplayUtils.arc(circleCenter, circleRadius, startAngle, endAngle, 0.2, (loc)->{ getContext().getDisplayManager().getPatterns().arc(circleCenter, circleRadius, startAngle, endAngle, 0.2, (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)
@@ -93,7 +92,7 @@ public class LapisAnimation extends MaterialAnimation {
} }
if (loopTime % 15 == 0) { if (loopTime % 15 == 0) {
DisplayUtils.vortex(playerLoc.clone().subtract(0, 0.5, 0), 0.8,(loc)->{ getContext().getDisplayManager().getPatterns().vortex(playerLoc.clone().subtract(0, 0.5, 0), 0.8,(loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)
@@ -122,7 +121,7 @@ public class LapisAnimation extends MaterialAnimation {
(int)(181 * pulseIntensity + 255 * (1 - pulseIntensity)) (int)(181 * pulseIntensity + 255 * (1 - pulseIntensity))
); );
DisplayUtils.ring(playerLoc, 2.2, (loc)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc, 2.2, (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)

View File

@@ -1,10 +1,8 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.Verbose; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.BlockDisplay;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -44,18 +42,18 @@ public class NetheriteAnimation extends MaterialAnimation {
double angle = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI; double angle = (loopTime / (double) LOOP_DURATION) * 2 * Math.PI;
List<BlockDisplay> displays = activeDisplays.computeIfAbsent(playerId, id -> { List<BlockDisplay> displays = activeDisplays.computeIfAbsent(playerId, id -> {
Verbose.send("{0} needed new BlockDisplays",player.getName()); getVerbose().send("{0} needed new BlockDisplays",player.getName());
List<BlockDisplay> list = new ArrayList<>(); List<BlockDisplay> list = new ArrayList<>();
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
Location initialLoc = player.getLocation().add(0, 1, 0); Location initialLoc = player.getLocation().add(0, 1, 0);
BlockDisplay display = player.getWorld().spawn(initialLoc, BlockDisplay.class,disp->{ BlockDisplay display = player.getWorld().spawn(initialLoc, BlockDisplay.class,disp->{
disp.setVisibleByDefault(false); disp.setVisibleByDefault(false);
viewers.forEach(viewer->{ viewers.forEach(viewer->{
viewer.showEntity(main.getPlugin(),disp); viewer.showEntity(getContext().getPlugin(),disp);
}); });
}); });
display.setBlock(Material.NETHERITE_BLOCK.createBlockData()); display.setBlock(Material.NETHERITE_BLOCK.createBlockData());
display.addScoreboardTag(main.getCommon().getTempTag()); display.addScoreboardTag(getContext().getCommon().getTempTag());
display.setInterpolationDuration(1); display.setInterpolationDuration(1);
display.setInterpolationDelay(0); display.setInterpolationDelay(0);
list.add(display); list.add(display);
@@ -99,7 +97,7 @@ public class NetheriteAnimation extends MaterialAnimation {
} }
if (loopTime % 50 == 0) { if (loopTime % 50 == 0) {
DisplayUtils.fanWaveRandom(playerLoc, 4.5, 8, (loc)->{ getContext().getDisplayManager().getPatterns().fanWaveRandom(playerLoc, 4.5, 8, (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)
@@ -110,7 +108,7 @@ public class NetheriteAnimation extends MaterialAnimation {
double auraPhase = (loopTime % 60) / 60.0 * 2 * Math.PI; double auraPhase = (loopTime % 60) / 60.0 * 2 * Math.PI;
double auraRadius = 2.8 + 0.7 * Math.sin(auraPhase * 2); double auraRadius = 2.8 + 0.7 * Math.sin(auraPhase * 2);
DisplayUtils.ring(playerLoc.clone().add(0, 0.2, 0), auraRadius,0.8, (loc)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc.clone().add(0, 0.2, 0), auraRadius,0.8, (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.FLAME) .type(Particle.FLAME)

View File

@@ -1,17 +1,10 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.TaskManager; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.BlockDisplay;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Transformation;
import org.joml.AxisAngle4f;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import java.util.Set; import java.util.Set;
@@ -72,7 +65,7 @@ public class QuartzAnimation extends MaterialAnimation {
double ringPhase = purifyPhase + ring * Math.PI; double ringPhase = purifyPhase + ring * Math.PI;
double ringHeight = Math.sin(ringPhase) * 0.4; double ringHeight = Math.sin(ringPhase) * 0.4;
DisplayUtils.ring(playerLoc.clone().add(0, ringHeight, 0), ringRadius,(point)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc.clone().add(0, ringHeight, 0), ringRadius,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.type(Particle.DUST) .type(Particle.DUST)
.data(new Particle.DustOptions(QUARTZ_COLOR,1F)) .data(new Particle.DustOptions(QUARTZ_COLOR,1F))

View File

@@ -1,9 +1,8 @@
package me.trouper.clonedupecore.server.trims.animations; package me.trouper.clonedupecore.server.systems.trims.animations;
import me.trouper.alias.server.systems.visual.DisplayUtils; import me.trouper.alias.utils.ParticleUtils;
import me.trouper.alias.server.systems.visual.ParticleUtils; import me.trouper.clonedupecore.server.systems.trims.MaterialAnimation;
import me.trouper.clonedupecore.server.trims.MaterialAnimation; import me.trouper.clonedupecore.server.systems.trims.ValidMaterial;
import me.trouper.clonedupecore.server.trims.ValidMaterial;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -69,7 +68,7 @@ public class RedstoneAnimation extends MaterialAnimation {
Math.sin(torchAngle) * 2.2 Math.sin(torchAngle) * 2.2
); );
DisplayUtils.beam(torchLoc, getContext().getDisplayManager().getPatterns().beam(torchLoc,
(loc)->{ (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
@@ -81,7 +80,7 @@ public class RedstoneAnimation extends MaterialAnimation {
} }
if (loopTime % 30 == 0) { if (loopTime % 30 == 0) {
DisplayUtils.wave(playerLoc.clone(), 3.0, 0.8f, 0.4, (loc)->{ getContext().getDisplayManager().getPatterns().wave(playerLoc.clone(), 3.0, 0.8f, 0.4, (loc)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.ENCHANTED_HIT) .type(Particle.ENCHANTED_HIT)
@@ -111,7 +110,7 @@ public class RedstoneAnimation extends MaterialAnimation {
(int)(50 * coreIntensity) (int)(50 * coreIntensity)
); );
DisplayUtils.ring(playerLoc, 1.2, 0.2f,(point)->{ getContext().getDisplayManager().getPatterns().ring(playerLoc, 1.2, 0.2f,(point)->{
ParticleUtils.builder() ParticleUtils.builder()
.viewers(viewers) .viewers(viewers)
.type(Particle.DUST) .type(Particle.DUST)

View File

@@ -1,4 +1,4 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.player.GameMode; import com.github.retrooper.packetevents.protocol.player.GameMode;

View File

@@ -1,11 +1,8 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import me.trouper.alias.server.ContextAware;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.server.systems.Text; import me.trouper.alias.server.systems.display.tracing.Point;
import me.trouper.alias.server.systems.tracing.BlockDisplayRaytracer;
import me.trouper.alias.server.systems.tracing.CustomDisplayRaytracer;
import me.trouper.alias.server.systems.tracing.Point;
import me.trouper.alias.server.systems.visual.DisplayUtils;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import me.trouper.clonedupecore.utils.PlayerUtils; import me.trouper.clonedupecore.utils.PlayerUtils;
@@ -19,7 +16,6 @@ import org.bukkit.damage.DamageType;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@@ -27,7 +23,7 @@ import java.util.*;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class DragTrollWand extends AbstractWand implements TrollFeature { public class DragTrollWand extends AbstractWand implements TrollFeature, ContextAware {
@Override @Override
public String getName() { public String getName() {
@@ -41,20 +37,18 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
@Override @Override
public String getDescription() { public String getDescription() {
return "Gets a wand which you can use to controll players"; return "Gets a wand which you can use to control players";
} }
public static final ItemStack DRAG_WAND = ItemBuilder.of(Material.BREEZE_ROD)
.displayName(Component.text("Drag Wand", NamedTextColor.DARK_AQUA).decoration(TextDecoration.ITALIC,false).decoration(TextDecoration.BOLD,true))
.loreComponent(
Text.color("&1▪ &bRight-Click:&7 Select Player"),
Text.color("&1▪ &bLeft-Click:&7 Throw"),
Text.color("&1▪ &bSneak Left-Click:&7 Electrocute")
)
.build();
public DragTrollWand() { public DragTrollWand() {
super("clonedupe.troll", DRAG_WAND); super("clonedupe.troll", ItemBuilder.of(Material.BREEZE_ROD)
.displayName(Component.text("Drag Wand", NamedTextColor.DARK_AQUA).decoration(TextDecoration.ITALIC,false).decoration(TextDecoration.BOLD,true))
.loreMiniMessage(
("<dark_blue>▪ <aqua>Right-Click:<gray> Select Player"),
("<dark_blue>▪ <aqua>Left-Click:<gray> Throw"),
("<dark_blue>▪ <aqua>Sneak Left-Click:<gray> Electrocute")
)
.build());
} }
@Override @Override
@@ -66,22 +60,22 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
private final Map<UUID, DragTask> playerDragMap = new HashMap<>(); private final Map<UUID, DragTask> playerDragMap = new HashMap<>();
@Override @Override
protected void onRightClick(Player player) { public void onRightClick(Player player) {
handleDragPlayer(player); handleDragPlayer(player);
} }
@Override @Override
protected void onLeftClick(Player player) { public void onLeftClick(Player player) {
handleThrowPlayer(player); handleThrowPlayer(player);
} }
@Override @Override
protected void onLeftClickSneak(Player player) { public void onLeftClickSneak(Player player) {
handleElectrocute(player); handleElectrocute(player);
} }
@Override @Override
protected void onScrollUp(Player p) { public void onScrollUp(Player p) {
if (!playerDragMap.containsKey(p.getUniqueId())) return; if (!playerDragMap.containsKey(p.getUniqueId())) return;
DragTask task = playerDragMap.get(p.getUniqueId()); DragTask task = playerDragMap.get(p.getUniqueId());
@@ -90,7 +84,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
} }
@Override @Override
protected void onScrollDown(Player p) { public void onScrollDown(Player p) {
if (!playerDragMap.containsKey(p.getUniqueId())) return; if (!playerDragMap.containsKey(p.getUniqueId())) return;
DragTask task = playerDragMap.get(p.getUniqueId()); DragTask task = playerDragMap.get(p.getUniqueId());
@@ -113,7 +107,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
return; return;
} }
CustomDisplayRaytracer.trace(user.getEyeLocation(),user.getEyeLocation().getDirection(),30,0.5, point -> { getDisplayManager().getCustomRaytracer().trace(user.getEyeLocation(),user.getEyeLocation().getDirection(),30,0.5, point -> {
List<Entity> targets = point.getNearbyEntities(user,1, entity -> entity instanceof LivingEntity); List<Entity> targets = point.getNearbyEntities(user,1, entity -> entity instanceof LivingEntity);
if (targets.isEmpty()) return false; if (targets.isEmpty()) return false;
LivingEntity target = (LivingEntity) targets.getFirst(); LivingEntity target = (LivingEntity) targets.getFirst();
@@ -122,7 +116,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
target.setGlowing(true); target.setGlowing(true);
if (target instanceof Player t) t.setAllowFlight(true); if (target instanceof Player t) t.setAllowFlight(true);
DisplayUtils.helix(target.getLocation(),0.6,(helix)->{ getContext().getDisplayManager().getPatterns().helix(target.getLocation(),0.6,(helix)->{
user.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME,helix,1,0,0,0,0); user.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME,helix,1,0,0,0,0);
},0.02,2); },0.02,2);
@@ -132,7 +126,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
} }
private DragTask startDragging(Player user, LivingEntity victim) { private DragTask startDragging(Player user, LivingEntity victim) {
return new DragTask(victim.getUniqueId(), Bukkit.getScheduler().runTaskTimer(main.getPlugin(), () -> { return new DragTask(victim.getUniqueId(), Bukkit.getScheduler().runTaskTimer(getPlugin(), () -> {
if (victim == null) { if (victim == null) {
playerDragMap.remove(user.getUniqueId()).drop(); playerDragMap.remove(user.getUniqueId()).drop();
return; return;
@@ -144,7 +138,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
DragTask task = playerDragMap.get(user.getUniqueId()); DragTask task = playerDragMap.get(user.getUniqueId());
Point point = CustomDisplayRaytracer.blocksInFrontOf(user.getEyeLocation(), user.getEyeLocation().getDirection(),task.getDistance(), false); Point point = getDisplayManager().getCustomRaytracer().blocksInFrontOf(user.getEyeLocation(), user.getEyeLocation().getDirection(),task.getDistance(), false);
victim.teleport(point.getLoc().clone().subtract(0, 1, 0)); victim.teleport(point.getLoc().clone().subtract(0, 1, 0));
user.sendActionBar(Component.text("You ", NamedTextColor.GREEN).append(Component.text("",NamedTextColor.WHITE)).append(Component.text(victim.getName(),NamedTextColor.AQUA)).append(Component.text(" | ",NamedTextColor.GRAY)).append(Component.text(Math.round(task.getDistance()),NamedTextColor.DARK_GREEN))); user.sendActionBar(Component.text("You ", NamedTextColor.GREEN).append(Component.text("",NamedTextColor.WHITE)).append(Component.text(victim.getName(),NamedTextColor.AQUA)).append(Component.text(" | ",NamedTextColor.GRAY)).append(Component.text(Math.round(task.getDistance()),NamedTextColor.DARK_GREEN)));
@@ -173,7 +167,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
} }
AtomicInteger ticksRemaining = new AtomicInteger(60); AtomicInteger ticksRemaining = new AtomicInteger(60);
Bukkit.getScheduler().runTaskTimer(main.getPlugin(),(shockTask)->{ Bukkit.getScheduler().runTaskTimer(getPlugin(),(shockTask)->{
if (ticksRemaining.getAndDecrement() <= 0 || target == null) { if (ticksRemaining.getAndDecrement() <= 0 || target == null) {
shockTask.cancel(); shockTask.cancel();
return; return;
@@ -185,7 +179,7 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
} }
public static void drawLightning(Location start, Location end, Material blockInner, Material blockOuter) { public void drawLightning(Location start, Location end, Material blockInner, Material blockOuter) {
int segments = 10; int segments = 10;
double maxOffset = 0.5; double maxOffset = 0.5;
long stayTime = 10L; long stayTime = 10L;
@@ -208,13 +202,13 @@ public class DragTrollWand extends AbstractWand implements TrollFeature {
); );
Location next = current.clone().add(direction).add(offset); Location next = current.clone().add(direction).add(offset);
BlockDisplayRaytracer.trace(blockInner, current, next, thickness, stayTime, viewers); getDisplayManager().getBlockDisplayRaytracer().trace(blockInner, current, next, thickness, stayTime, viewers);
BlockDisplayRaytracer.trace(blockOuter, current, next, thicknessOut, stayTime, viewers); getDisplayManager().getBlockDisplayRaytracer().trace(blockOuter, current, next, thicknessOut, stayTime, viewers);
current = next; current = next;
} }
BlockDisplayRaytracer.trace(blockInner, current, end, thickness, stayTime, viewers); getDisplayManager().getBlockDisplayRaytracer().trace(blockInner, current, end, thickness, stayTime, viewers);
BlockDisplayRaytracer.trace(blockOuter, current, end, thicknessOut, stayTime, viewers); getDisplayManager().getBlockDisplayRaytracer().trace(blockOuter, current, end, thicknessOut, stayTime, viewers);
end.getWorld().spawnParticle(Particle.FLASH,end,0,0,0,0,0); end.getWorld().spawnParticle(Particle.FLASH,end,0,0,0,0,0);
} }

View File

@@ -1,4 +1,4 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityAnimation; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityAnimation;
@@ -33,7 +33,7 @@ public class FlickerTroll implements TrollFeature {
public void execute(CommandSender sender, Player target) { public void execute(CommandSender sender, Player target) {
var player = PacketEvents.getAPI().getPlayerManager().getUser(target); var player = PacketEvents.getAPI().getPlayerManager().getUser(target);
eepyPlayers.add(target.getUniqueId()); eepyPlayers.add(target.getUniqueId());
Bukkit.getScheduler().runTaskTimerAsynchronously(main.getPlugin(), (t) -> { Bukkit.getScheduler().runTaskTimerAsynchronously(getPlugin(), (t) -> {
if (!eepyPlayers.contains(target.getUniqueId())) t.cancel(); if (!eepyPlayers.contains(target.getUniqueId())) t.cancel();
player.sendPacket(new WrapperPlayServerEntityAnimation(target.getEntityId(), WrapperPlayServerEntityAnimation.EntityAnimationType.WAKE_UP)); player.sendPacket(new WrapperPlayServerEntityAnimation(target.getEntityId(), WrapperPlayServerEntityAnimation.EntityAnimationType.WAKE_UP));
}, 1, 1); }, 1, 1);

View File

@@ -1,4 +1,4 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.protocol.player.User;
@@ -68,7 +68,7 @@ public class LSDTroll implements TrollFeature {
final int radius = 8; final int radius = 8;
AtomicInteger ticksPassed = new AtomicInteger(0); AtomicInteger ticksPassed = new AtomicInteger(0);
lsdTasks.put(target.getUniqueId(),Bukkit.getScheduler().runTaskTimer(main.getPlugin(),()->{ lsdTasks.put(target.getUniqueId(),Bukkit.getScheduler().runTaskTimer(getPlugin(),()->{
if (!target.isOnline()) { if (!target.isOnline()) {
try { try {
lsdTasks.remove(target.getUniqueId()).cancel(); lsdTasks.remove(target.getUniqueId()).cancel();

View File

@@ -1,17 +1,19 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetPlayerInventory; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetPlayerInventory;
import io.github.retrooper.packetevents.util.SpigotConversionUtil; import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import me.trouper.alias.server.systems.Text;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title;
import org.bukkit.*; import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -53,7 +55,7 @@ public class LiarTroll implements TrollFeature {
AtomicBoolean inverse = new AtomicBoolean(false); AtomicBoolean inverse = new AtomicBoolean(false);
AtomicInteger timeRemaining = new AtomicInteger(15 * 20); AtomicInteger timeRemaining = new AtomicInteger(15 * 20);
Bukkit.getScheduler().runTaskTimer(main.getPlugin(), (task)->{ Bukkit.getScheduler().runTaskTimer(getPlugin(), (task)->{
if (!activeLiars.containsKey(target.getUniqueId())) { if (!activeLiars.containsKey(target.getUniqueId())) {
task.cancel(); task.cancel();
return; return;
@@ -79,15 +81,15 @@ public class LiarTroll implements TrollFeature {
WrapperPlayServerSetPlayerInventory packet = new WrapperPlayServerSetPlayerInventory(37,SpigotConversionUtil.fromBukkitItemStack(displayItem)); WrapperPlayServerSetPlayerInventory packet = new WrapperPlayServerSetPlayerInventory(37,SpigotConversionUtil.fromBukkitItemStack(displayItem));
Title title = Title.title( Title title = Title.title(
Text.color("&c⚠ &4&lWARNING &r&c⚠"), getTextSystem().color("&c⚠ &4&lWARNING &r&c⚠"),
Text.color("&7&nLEGGINGS COMBUSTION EMINENT!"), getTextSystem().color("&7&nLEGGINGS COMBUSTION EMINENT!"),
Title.Times.times(Duration.of(0, ChronoUnit.SECONDS),Duration.of(1, ChronoUnit.SECONDS),Duration.of(0, ChronoUnit.SECONDS)) Title.Times.times(Duration.of(0, ChronoUnit.SECONDS),Duration.of(1, ChronoUnit.SECONDS),Duration.of(0, ChronoUnit.SECONDS))
); );
if (inverse.get()) { if (inverse.get()) {
title = Title.title( title = Title.title(
Text.color("&e⚠ &4&l&nWARNING&r &e⚠"), getTextSystem().color("&e⚠ &4&l&nWARNING&r &e⚠"),
Text.color("&7LEGGINGS COMBUSTION EMINENT!"), getTextSystem().color("&7LEGGINGS COMBUSTION EMINENT!"),
Title.Times.times(Duration.of(0, ChronoUnit.SECONDS),Duration.of(1, ChronoUnit.SECONDS),Duration.of(0, ChronoUnit.SECONDS))) Title.Times.times(Duration.of(0, ChronoUnit.SECONDS),Duration.of(1, ChronoUnit.SECONDS),Duration.of(0, ChronoUnit.SECONDS)))
; ;
ItemStack pants = displayItem.withType(Material.WHITE_WOOL); ItemStack pants = displayItem.withType(Material.WHITE_WOOL);

View File

@@ -1,4 +1,4 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerChangeGameState; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerChangeGameState;

View File

@@ -1,30 +1,27 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.server.systems.Text; import me.trouper.alias.server.systems.Text;
import me.trouper.alias.server.systems.Verbose; import me.trouper.alias.server.systems.display.tracing.CustomRaytracer;
import me.trouper.alias.server.systems.tracing.BlockDisplayRaytracer; import me.trouper.alias.server.systems.display.tracing.Point;
import me.trouper.alias.server.systems.tracing.CustomDisplayRaytracer; import me.trouper.alias.server.systems.world.Explosion;
import me.trouper.alias.server.systems.tracing.Point;
import me.trouper.alias.server.systems.world.ExplosionOptions; import me.trouper.alias.server.systems.world.ExplosionOptions;
import me.trouper.alias.server.systems.world.ExplosionResult; import me.trouper.alias.server.systems.world.ExplosionResult;
import me.trouper.alias.server.systems.world.ExplosionUtils;
import me.trouper.alias.utils.FormatUtils;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Color;
import org.bukkit.*; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.BlockDisplay;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Stack; import java.util.Stack;
import java.util.UUID; import java.util.UUID;
@@ -32,16 +29,16 @@ import java.util.concurrent.ConcurrentHashMap;
public class OrbitalTrollWand extends AbstractWand implements TrollFeature { public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
private static final ItemStack ORBITAL_WAND = ItemBuilder.of(Material.TRIPWIRE_HOOK) private static final ItemStack ORBITAL_WAND = ItemBuilder.of(Material.TRIPWIRE_HOOK)
.displayName(Text.color("&4&lOrbital Sky Torch").decoration(TextDecoration.ITALIC,false)) .displayName("<reset><red><bold>Orbital Sky Torch")
.loreComponent( .loreMiniMessage(
Text.color("&8▪ &cRight-Click:&f Aim Cannon"), "<gray>▪ <red>Right-Click:<white> Aim Cannon",
Text.color("&8▪ &cRight-Click Again:&f Charge Ion Beam"), "<gray>▪ <red>Right-Click Again:<white> Charge Ion Beam",
Text.color("&8▪ &cLeft-Click:&f Call off shot"), "<gray>▪ <red>Left-Click:<white> Call off shot",
Text.color("&8▪ &cSwap-Hands:&f Undo"), "<gray>▪ <red>Swap-Hands:<white> Undo",
Text.color("&7"), "<gray>",
Text.color("&7Now Includes &oreal&r&7 orbital configurations!"), "<gray>Now Includes <italic>real</italic> orbital configurations!",
Text.color("&7"), "<gray>",
Text.color("&8Thank you TheCymaera and HeroBrayden!") "<gray>Thank you TheCymaera and HeroBrayden!"
) )
.build(); .build();
@@ -98,64 +95,64 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
} }
@Override @Override
protected void onSwapHand(Player player) { public void onSwapHand(Player player) {
try { try {
if (undoHistory(player)) { if (undoHistory(player)) {
Text.message(Text.Pallet.SUCCESS, false, player, SUCCESS_RESTORE); getTextSystem().message(Text.Pallet.SUCCESS, false, player, SUCCESS_RESTORE);
SoundPlayer.play(player, Sound.ENTITY_ILLUSIONER_PREPARE_BLINDNESS, 10, 1); SoundPlayer.play(player, Sound.ENTITY_ILLUSIONER_PREPARE_BLINDNESS, 10, 1);
} else if (cannonMap.containsKey(player.getUniqueId())) { } else if (cannonMap.containsKey(player.getUniqueId())) {
cannonMap.get(player.getUniqueId()).destroy(); cannonMap.get(player.getUniqueId()).destroy();
Text.message(Text.Pallet.SUCCESS, false, player, SUCCESS_DEACTIVATED); getTextSystem().message(Text.Pallet.SUCCESS, false, player, SUCCESS_DEACTIVATED);
} else { } else {
Text.message(Text.Pallet.ERROR, false, player, ERROR_EMPTY_STACK); getTextSystem().message(Text.Pallet.ERROR, false, player, ERROR_EMPTY_STACK);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Text.message(Text.Pallet.ERROR, false, player, ERROR_EXCEPTION); getTextSystem().message(Text.Pallet.ERROR, false, player, ERROR_EXCEPTION);
} }
} }
@Override @Override
protected void onRightClick(Player player) { public void onRightClick(Player player) {
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
OrbitalIonCannon playerCannon = cannonMap.get(playerId); OrbitalIonCannon playerCannon = cannonMap.get(playerId);
if (playerCannon != null) { if (playerCannon != null) {
if (playerCannon.getFireTask() != null || playerCannon.getChargeTask() != null) { if (playerCannon.getFireTask() != null || playerCannon.getChargeTask() != null) {
Text.message(Text.Pallet.ERROR, false, player, ERROR_ALREADY_CHARGING); getTextSystem().message(Text.Pallet.ERROR, false, player, ERROR_ALREADY_CHARGING);
return; return;
} }
playerCannon.charge(); playerCannon.charge();
Text.message(Text.Pallet.SUCCESS, false, player, SUCCESS_CHARGING); getTextSystem().message(Text.Pallet.SUCCESS, false, player, SUCCESS_CHARGING);
return; return;
} }
OrbitalIonCannon cannon = new OrbitalIonCannon(player, traceTargets(player)); OrbitalIonCannon cannon = new OrbitalIonCannon(player, traceTargets(player));
cannonMap.put(playerId, cannon); cannonMap.put(playerId, cannon);
Text.message(Text.Pallet.SUCCESS, false, player, SUCCESS_AIM); getTextSystem().message(Text.Pallet.SUCCESS, false, player, SUCCESS_AIM);
} }
@Override @Override
protected void onLeftClick(Player player) { public void onLeftClick(Player player) {
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
OrbitalIonCannon playerCannon = cannonMap.get(playerId); OrbitalIonCannon playerCannon = cannonMap.get(playerId);
if (playerCannon == null) { if (playerCannon == null) {
Text.message(Text.Pallet.ERROR, false, player, ERROR_NOT_CONTROLLING); getTextSystem().message(Text.Pallet.ERROR, false, player, ERROR_NOT_CONTROLLING);
return; return;
} }
playerCannon.destroy(); playerCannon.destroy();
cannonMap.remove(playerId); cannonMap.remove(playerId);
Text.message(Text.Pallet.SUCCESS, false, player, SUCCESS_DEACTIVATED); getTextSystem().message(Text.Pallet.SUCCESS, false, player, SUCCESS_DEACTIVATED);
SoundPlayer.play(player, Sound.BLOCK_BEACON_DEACTIVATE, 1, 0.5F); SoundPlayer.play(player, Sound.BLOCK_BEACON_DEACTIVATE, 1, 0.5F);
} }
@Override @Override
protected void onScrollDown(Player player) { public void onScrollDown(Player player) {
OrbitalIonCannon cannon = cannonMap.get(player.getUniqueId()); OrbitalIonCannon cannon = cannonMap.get(player.getUniqueId());
if (cannon == null) { if (cannon == null) {
Text.message(Text.Pallet.ERROR, false, player, ERROR_NOT_CONTROLLING); getTextSystem().message(Text.Pallet.ERROR, false, player, ERROR_NOT_CONTROLLING);
return; return;
} }
@@ -167,21 +164,21 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
cannon.setPower(Math.max(1, cannon.getPower() - 5)); cannon.setPower(Math.max(1, cannon.getPower() - 5));
SoundPlayer.play(player, Sound.BLOCK_NOTE_BLOCK_HAT, 1, 1.7F); SoundPlayer.play(player, Sound.BLOCK_NOTE_BLOCK_HAT, 1, 1.7F);
player.sendActionBar(Text.format(Text.Pallet.INFO, "Set ion cannon power to {0}.", cannon.getPower())); player.sendActionBar(getTextSystem().format(Text.Pallet.INFO, "Set ion cannon power to {0}.", cannon.getPower()));
} }
@Override @Override
protected void onScrollUp(Player player) { public void onScrollUp(Player player) {
OrbitalIonCannon cannon = cannonMap.get(player.getUniqueId()); OrbitalIonCannon cannon = cannonMap.get(player.getUniqueId());
if (cannon == null) { if (cannon == null) {
Text.message(Text.Pallet.ERROR, false, player, ERROR_NOT_CONTROLLING); getTextSystem().message(Text.Pallet.ERROR, false, player, ERROR_NOT_CONTROLLING);
return; return;
} }
cannon.setPower(Math.min(MAX_POWER, cannon.getPower() + 5)); cannon.setPower(Math.min(MAX_POWER, cannon.getPower() + 5));
SoundPlayer.play(player, Sound.BLOCK_NOTE_BLOCK_HAT, 1, 0.8F); SoundPlayer.play(player, Sound.BLOCK_NOTE_BLOCK_HAT, 1, 0.8F);
player.sendActionBar(Text.format(Text.Pallet.INFO, "Set ion cannon power to {0}.", cannon.getPower())); player.sendActionBar(getTextSystem().format(Text.Pallet.INFO, "Set ion cannon power to {0}.", cannon.getPower()));
} }
public class OrbitalIonCannon { public class OrbitalIonCannon {
@@ -221,20 +218,20 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
updateOrbitLocation(); updateOrbitLocation();
setSkyRenderLocation(getSimulatedOrbit().getRenderLocation(getTargetLocation())); setSkyRenderLocation(getSimulatedOrbit().getRenderLocation(getTargetLocation()));
setSkyTraceLocation(CustomDisplayRaytracer.blocksInFrontOf(getTargetLocation(), getSimulatedOrbit().getNormalToSatellite(getTargetLocation().toVector()), Math.max(5,power), false).getLoc()); setSkyTraceLocation(getDisplayManager().getCustomRaytracer().blocksInFrontOf(getTargetLocation(), getSimulatedOrbit().getNormalToSatellite(getTargetLocation().toVector()), Math.max(5,power), false).getLoc());
if (aimTask != null && !aimTask.isCancelled()) { if (aimTask != null && !aimTask.isCancelled()) {
setTargetLocation(traceTargets(getOwner())); setTargetLocation(traceTargets(getOwner()));
} }
setGroundTraced(CustomDisplayRaytracer.trace(getSkyTraceLocation(), getTargetLocation().clone().toVector().subtract(getSkyTraceLocation().clone().toVector()),Math.max(5,power), 5, (point) -> { setGroundTraced(getDisplayManager().getCustomRaytracer().trace(getSkyTraceLocation(), getTargetLocation().clone().toVector().subtract(getSkyTraceLocation().clone().toVector()),Math.max(5,power), 5, (point) -> {
Material type = point.getLoc().getBlock().getType(); Material type = point.getLoc().getBlock().getType();
return type.isCollidable(); return type.isCollidable();
}).getLoc()); }).getLoc());
ticksElapsed++; ticksElapsed++;
} }
}.runTaskTimer(main.getPlugin(), 0, 1); }.runTaskTimer(getPlugin(), 0, 1);
private OrbitalIonCannon(Player owner, Location target) { private OrbitalIonCannon(Player owner, Location target) {
this.owner = owner; this.owner = owner;
@@ -242,7 +239,7 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
this.targetLocation = target; this.targetLocation = target;
this.power = 20; this.power = 20;
this.simulatedOrbit = new OrbitalConfiguration(target.toVector().clone().add(new Vector(random().nextInt(-30_000_000,30_000_000),target.getY(),random().nextInt(-30_000_000,30_000_000)))); this.simulatedOrbit = new OrbitalConfiguration(target.toVector().clone().add(new Vector(random().nextInt(-30_000_000,30_000_000),target.getY(),random().nextInt(-30_000_000,30_000_000))));
this.setAimTask(aimRunnable.runTaskTimer(main.getPlugin(), 0, 1)); this.setAimTask(aimRunnable.runTaskTimer(getPlugin(), 0, 1));
} }
private final BukkitRunnable fireRunnable = new BukkitRunnable() { private final BukkitRunnable fireRunnable = new BukkitRunnable() {
@@ -259,10 +256,10 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
} }
if (ticksElapsed <= 40) { if (ticksElapsed <= 40) {
BlockDisplay inner = BlockDisplayRaytracer.trace(Material.WHITE_CONCRETE_POWDER, getGroundTraced(), getSkyRenderLocation(), 1, 2); BlockDisplay inner = getDisplayManager().getBlockDisplayRaytracer().trace(Material.WHITE_CONCRETE_POWDER, getGroundTraced(), getSkyRenderLocation(), 1, 2);
inner.setGlowing(true); inner.setGlowing(true);
inner.setGlowColorOverride(Color.fromRGB(0xFFDDDD)); inner.setGlowColorOverride(Color.fromRGB(0xFFDDDD));
BlockDisplayRaytracer.trace(Material.WHITE_STAINED_GLASS, getGroundTraced(), getSkyRenderLocation(), 1.5 + main.random().nextDouble(), 2); getDisplayManager().getBlockDisplayRaytracer().trace(Material.WHITE_STAINED_GLASS, getGroundTraced(), getSkyRenderLocation(), 1.5 + random().nextDouble(), 2);
} }
if (ticksElapsed == 0) { if (ticksElapsed == 0) {
@@ -275,7 +272,7 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
.setDestructionDelay(1); .setDestructionDelay(1);
Stack<ExplosionResult> history = playerHistory.computeIfAbsent(ownerId, k -> new Stack<>()); Stack<ExplosionResult> history = playerHistory.computeIfAbsent(ownerId, k -> new Stack<>());
setExplosionResult(ExplosionUtils.createExplosion(getGroundTraced(), options)); setExplosionResult(new Explosion(getContext()).createExplosion(getGroundTraced(), options));
history.push(getExplosionResult()); history.push(getExplosionResult());
} }
@@ -290,7 +287,7 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
public void run() { public void run() {
final int delay = 40; final int delay = 40;
if (ticksElapsed >= delay) { if (ticksElapsed >= delay) {
setFireTask(fireRunnable.runTaskTimer(main.getPlugin(), 0, 1)); setFireTask(fireRunnable.runTaskTimer(getPlugin(), 0, 1));
cannonMap.remove(ownerId); cannonMap.remove(ownerId);
this.cancel(); this.cancel();
chargeTask = null; chargeTask = null;
@@ -308,10 +305,10 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
double thickness = (double) ticksElapsed / delay; double thickness = (double) ticksElapsed / delay;
int otherValues = ((ticksElapsed / delay * 100) + 100); int otherValues = ((ticksElapsed / delay * 100) + 100);
BlockDisplay inner = BlockDisplayRaytracer.trace(Material.RED_CONCRETE, getGroundTraced(), getSkyRenderLocation(), thickness, 2); BlockDisplay inner = getDisplayManager().getBlockDisplayRaytracer().trace(Material.RED_CONCRETE, getGroundTraced(), getSkyRenderLocation(), thickness, 2);
inner.setGlowing(true); inner.setGlowing(true);
inner.setGlowColorOverride(Color.fromRGB(255, otherValues, otherValues)); inner.setGlowColorOverride(Color.fromRGB(255, otherValues, otherValues));
BlockDisplayRaytracer.trace(Material.ORANGE_STAINED_GLASS, getGroundTraced(), getSkyRenderLocation(), thickness + 0.1, 2); getDisplayManager().getBlockDisplayRaytracer().trace(Material.ORANGE_STAINED_GLASS, getGroundTraced(), getSkyRenderLocation(), thickness + 0.1, 2);
ticksElapsed++; ticksElapsed++;
} }
@@ -332,10 +329,10 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
new SoundPlayer(Sound.BLOCK_RESPAWN_ANCHOR_CHARGE, getPower() * 20, 0.5F).playAt(groundTraced, getPower() * 10); new SoundPlayer(Sound.BLOCK_RESPAWN_ANCHOR_CHARGE, getPower() * 20, 0.5F).playAt(groundTraced, getPower() * 10);
} }
BlockDisplay inner = BlockDisplayRaytracer.trace(Material.RED_CONCRETE_POWDER, getGroundTraced(), getSkyRenderLocation(), 0.1, 2); BlockDisplay inner = getDisplayManager().getBlockDisplayRaytracer().trace(Material.RED_CONCRETE_POWDER, getGroundTraced(), getSkyRenderLocation(), 0.1, 2);
inner.setGlowing(true); inner.setGlowing(true);
inner.setGlowColorOverride(Color.fromRGB(0xFF0000)); inner.setGlowColorOverride(Color.fromRGB(0xFF0000));
BlockDisplayRaytracer.trace(Material.RED_STAINED_GLASS, getGroundTraced(), getSkyRenderLocation(), 0.2, 2); getDisplayManager().getBlockDisplayRaytracer().trace(Material.RED_STAINED_GLASS, getGroundTraced(), getSkyRenderLocation(), 0.2, 2);
ticksElapsed++; ticksElapsed++;
} }
@@ -374,7 +371,7 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
if (this.aimTask != null && !this.aimTask.isCancelled()) { if (this.aimTask != null && !this.aimTask.isCancelled()) {
this.aimTask.cancel(); this.aimTask.cancel();
} }
this.setChargeTask(this.chargeRunnable.runTaskTimer(main.getPlugin(), 0, 1)); this.setChargeTask(this.chargeRunnable.runTaskTimer(getPlugin(), 0, 1));
} }
public Player getOwner() { return owner; } public Player getOwner() { return owner; }
@@ -476,8 +473,8 @@ public class OrbitalTrollWand extends AbstractWand implements TrollFeature {
public void setBaseSatellite(Vector baseSatellite) { this.baseSatellite = baseSatellite; } public void setBaseSatellite(Vector baseSatellite) { this.baseSatellite = baseSatellite; }
} }
private static Location traceTargets(Player player) { private Location traceTargets(Player player) {
Point hit = CustomDisplayRaytracer.trace(player.getEyeLocation(), player.getEyeLocation().getDirection(), 128, CustomDisplayRaytracer.HIT_BLOCK); Point hit = getDisplayManager().getCustomRaytracer().trace(player.getEyeLocation(), player.getEyeLocation().getDirection(), 128, CustomRaytracer.HIT_BLOCK);
return hit.getLoc(); return hit.getLoc();
} }
} }

View File

@@ -1,13 +1,11 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.server.systems.tracing.BlockDisplayRaytracer;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.BlockDisplay;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -46,42 +44,42 @@ public class TestTrollWand extends AbstractWand implements TrollFeature{
public void stop(CommandSender sender, Player target) {} public void stop(CommandSender sender, Player target) {}
@Override @Override
protected void onScrollUp(Player player) { public void onScrollUp(Player player) {
infoAny(player, "You scrolled upwards"); infoAny(player, "You scrolled upwards");
} }
@Override @Override
protected void onScrollDown(Player player) { public void onScrollDown(Player player) {
infoAny(player, "You scrolled downwards"); infoAny(player, "You scrolled downwards");
} }
@Override @Override
protected void onSwapHand(Player player) { public void onSwapHand(Player player) {
infoAny(player, "You swapped hands"); infoAny(player, "You swapped hands");
} }
@Override @Override
protected void onSwapHandSneak(Player player) { public void onSwapHandSneak(Player player) {
infoAny(player, "You swapped hands while sneaking"); infoAny(player, "You swapped hands while sneaking");
} }
@Override @Override
protected void onLeftClick(Player player) { public void onLeftClick(Player player) {
infoAny(player, "You left clicked"); infoAny(player, "You left clicked");
} }
@Override @Override
protected void onLeftClickSneak(Player player) { public void onLeftClickSneak(Player player) {
infoAny(player, "You left clicked while sneaking"); infoAny(player, "You left clicked while sneaking");
} }
@Override @Override
protected void onRightClick(Player player) { public void onRightClick(Player player) {
infoAny(player, "You right clicked"); infoAny(player, "You right clicked");
} }
@Override @Override
protected void onRightClickSneak(Player player) { public void onRightClickSneak(Player player) {
infoAny(player, "You right clicked while sneaking"); infoAny(player, "You right clicked while sneaking");
} }
} }

View File

@@ -1,10 +1,12 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import me.trouper.alias.server.events.QuickListener; import me.trouper.alias.server.events.QuickListener;
import me.trouper.clonedupecore.CloneDupeContext;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public interface TrollFeature extends QuickListener { public interface TrollFeature extends QuickListener, CloneDupeContext {
String getName(); String getName();
String getDescription(); String getDescription();

View File

@@ -1,11 +1,8 @@
package me.trouper.clonedupecore.server.trolls; package me.trouper.clonedupecore.server.systems.trolls;
import me.trouper.alias.server.systems.AbstractWand; import me.trouper.alias.server.systems.AbstractWand;
import me.trouper.alias.server.systems.Text;
import me.trouper.alias.server.systems.tracing.CustomDisplayRaytracer;
import me.trouper.alias.utils.ItemBuilder; import me.trouper.alias.utils.ItemBuilder;
import me.trouper.alias.utils.SoundPlayer; import me.trouper.alias.utils.SoundPlayer;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.BlockDisplay;
@@ -24,10 +21,10 @@ import java.util.concurrent.atomic.AtomicInteger;
public class VoidTrollWand extends AbstractWand implements TrollFeature { public class VoidTrollWand extends AbstractWand implements TrollFeature {
private static final ItemStack VOID_WAND = ItemBuilder.of(Material.ECHO_SHARD) private static final ItemStack VOID_WAND = ItemBuilder.of(Material.ECHO_SHARD)
.displayName(Text.color("&5&lVoid Wand").decoration(TextDecoration.ITALIC,false)) .displayName("<reset><dark_purple><bold>Void Wand")
.loreComponent( .loreMiniMessage(
Text.color("&8▪ &dRight-Click:&f Abyss"), "<dark_gray>▪ <light_purple>Right-Click:<white> Abyss",
Text.color("&8▪ &dLeft-Click:&f Engulf") "<dark_gray>▪ <light_purple>Left-Click:<white> Engulf"
) )
.build(); .build();
@@ -57,8 +54,8 @@ public class VoidTrollWand extends AbstractWand implements TrollFeature {
} }
@Override @Override
protected void onRightClick(Player player) { public void onRightClick(Player player) {
CustomDisplayRaytracer.traceDelayed(main.getPlugin(),player.getEyeLocation(),player.getEyeLocation().getDirection(),30,1, point -> { getDisplayManager().getCustomRaytracer().traceDelayed(getPlugin(),player.getEyeLocation(),player.getEyeLocation().getDirection(),30,1, point -> {
List<LivingEntity> targets = point.getNearbyEntities(player,1,true, entity->entity instanceof LivingEntity).stream().map(entity -> (LivingEntity) entity).toList(); List<LivingEntity> targets = point.getNearbyEntities(player,1,true, entity->entity instanceof LivingEntity).stream().map(entity -> (LivingEntity) entity).toList();
if (targets.isEmpty()) { if (targets.isEmpty()) {
SoundPlayer.play(point.getLoc(), Sound.BLOCK_SOUL_SAND_BREAK, 1,0.4F,10); SoundPlayer.play(point.getLoc(), Sound.BLOCK_SOUL_SAND_BREAK, 1,0.4F,10);
@@ -74,7 +71,7 @@ public class VoidTrollWand extends AbstractWand implements TrollFeature {
World w = target.getWorld(); World w = target.getWorld();
AtomicInteger counter = new AtomicInteger(0); AtomicInteger counter = new AtomicInteger(0);
Bukkit.getScheduler().runTaskTimer(main.getPlugin(),(task) -> { Bukkit.getScheduler().runTaskTimer(getPlugin(),(task) -> {
if (counter.getAndIncrement() > 60) { if (counter.getAndIncrement() > 60) {
task.cancel(); task.cancel();
return; return;
@@ -90,8 +87,8 @@ public class VoidTrollWand extends AbstractWand implements TrollFeature {
} }
@Override @Override
protected void onLeftClick(Player player) { public void onLeftClick(Player player) {
CustomDisplayRaytracer.traceDelayed(main.getPlugin(),player.getEyeLocation(),player.getEyeLocation().getDirection(),30,1,point -> { getDisplayManager().getCustomRaytracer().traceDelayed(getPlugin(),player.getEyeLocation(),player.getEyeLocation().getDirection(),30,1,point -> {
List<LivingEntity> targets = point.getNearbyEntities(player, 1, true, entity -> entity instanceof LivingEntity).stream().map(entity -> (LivingEntity) entity).toList(); List<LivingEntity> targets = point.getNearbyEntities(player, 1, true, entity -> entity instanceof LivingEntity).stream().map(entity -> (LivingEntity) entity).toList();
if (targets.isEmpty()) { if (targets.isEmpty()) {
SoundPlayer.play(point.getLoc(), Sound.BLOCK_SOUL_SAND_BREAK, 1,0.4F,10); SoundPlayer.play(point.getLoc(), Sound.BLOCK_SOUL_SAND_BREAK, 1,0.4F,10);
@@ -105,7 +102,7 @@ public class VoidTrollWand extends AbstractWand implements TrollFeature {
}); });
} }
public void engulf(LivingEntity target) { private void engulf(LivingEntity target) {
List<BlockDisplay> displays = new ArrayList<>(); List<BlockDisplay> displays = new ArrayList<>();
final double effectLength = 80; final double effectLength = 80;
@@ -117,7 +114,7 @@ public class VoidTrollWand extends AbstractWand implements TrollFeature {
final Location targetLoc = target.getLocation(); final Location targetLoc = target.getLocation();
AtomicInteger ticksElapsed = new AtomicInteger(); AtomicInteger ticksElapsed = new AtomicInteger();
Bukkit.getScheduler().runTaskTimer(main.getPlugin(),(task)->{ Bukkit.getScheduler().runTaskTimer(getPlugin(),(task)->{
if (ticksElapsed.getAndIncrement() > effectLength) { if (ticksElapsed.getAndIncrement() > effectLength) {
target.setHealth(0); target.setHealth(0);
SoundPlayer.play(targetLoc, Sound.ENTITY_DROWNED_DEATH_WATER, 1,0.4F,10); SoundPlayer.play(targetLoc, Sound.ENTITY_DROWNED_DEATH_WATER, 1,0.4F,10);
@@ -135,7 +132,7 @@ public class VoidTrollWand extends AbstractWand implements TrollFeature {
},0,1); },0,1);
} }
public static List<BlockDisplay> voidRing(Location center, double yOffset, double radius, int blockCount) { private List<BlockDisplay> voidRing(Location center, double yOffset, double radius, int blockCount) {
List<BlockDisplay> displays = new ArrayList<>(); List<BlockDisplay> displays = new ArrayList<>();
ThreadLocalRandom localRandom = ThreadLocalRandom.current(); ThreadLocalRandom localRandom = ThreadLocalRandom.current();

View File

@@ -1,25 +1,13 @@
package me.trouper.clonedupecore.utils; package me.trouper.clonedupecore.utils;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.damage.DamageSource; import org.bukkit.damage.DamageSource;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.*;
public class PlayerUtils { public class PlayerUtils {
private static float clampPitch(float pitch) { private static float clampPitch(float pitch) {