merged BetterHoppers and DailyQuests
All checks were successful
Gitea Actions Demo / Build-Gradle (push) Successful in 4m32s

This commit is contained in:
Your Name
2025-07-30 02:33:02 +02:00
parent 232b7a395c
commit 899d256773
35 changed files with 2477 additions and 729 deletions

View File

@@ -1,2 +1,2 @@
#Wed Jul 02 13:24:00 CEST 2025
#Wed Jul 30 01:48:01 CEST 2025
gradle.version=8.14.2

View File

@@ -1,2 +1,2 @@
Command: /opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -Xmx1G -classpath /Users/janik/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.11.1/6c1f29838864ba8f495855edfc8ef17706fedb5d/tiny-remapper-0.11.1-fat.jar net.fabricmc.tinyremapper.Main /Users/janik/Desktop/MCPlugins/environmentex-1.0-SNAPSHOT.jar /Users/janik/Desktop/MCPlugins/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/reobfMappings.tiny mojang spigot /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/mappedServerJar.jar --threads=1
[INFO] Finished after 896,39 ms.
[INFO] Finished after 1133,52 ms.

View File

@@ -650,7 +650,7 @@ code + .copy-button {
<script type="text/javascript">
function configurationCacheProblems() { return (
// begin-report-data
{"diagnostics":[{"locations":[{"path":"/Users/janik/Desktop/MCPlugins/environmentex/src/main/java/de/hessj/environmentex/App.java"},{"taskPath":":compileJava"}],"problem":[{"text":"Einige Eingabedateien verwenden oder überschreiben eine veraltete API."}],"severity":"ADVICE","problemDetails":[{"text":"Hinweis: Einige Eingabedateien verwenden oder überschreiben eine veraltete API."}],"contextualLabel":"Einige Eingabedateien verwenden oder überschreiben eine veraltete API.","problemId":[{"name":"java","displayName":"Java compilation"},{"name":"compilation","displayName":"Compilation"},{"name":"compiler.note.deprecated.plural","displayName":"Einige Eingabedateien verwenden oder überschreiben eine veraltete API."}]},{"locations":[{"path":"/Users/janik/Desktop/MCPlugins/environmentex/src/main/java/de/hessj/environmentex/App.java"},{"taskPath":":compileJava"}],"problem":[{"text":"Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten."}],"severity":"ADVICE","problemDetails":[{"text":"Hinweis: Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten."}],"contextualLabel":"Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten.","problemId":[{"name":"java","displayName":"Java compilation"},{"name":"compilation","displayName":"Compilation"},{"name":"compiler.note.deprecated.recompile","displayName":"Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten."}]}],"problemsReport":{"totalProblemCount":2,"buildName":"environmentex","requestedTasks":"build","documentationLink":"https://docs.gradle.org/8.14.2/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
{"diagnostics":[{"locations":[{"path":"/Users/janik/Desktop/MCPlugins/environmentex/src/main/java/de/hessj/environmentex/MobHeads.java"},{"taskPath":":compileJava"}],"problem":[{"text":"Einige Eingabedateien verwenden oder überschreiben eine veraltete API."}],"severity":"ADVICE","problemDetails":[{"text":"Hinweis: Einige Eingabedateien verwenden oder überschreiben eine veraltete API."}],"contextualLabel":"Einige Eingabedateien verwenden oder überschreiben eine veraltete API.","problemId":[{"name":"java","displayName":"Java compilation"},{"name":"compilation","displayName":"Compilation"},{"name":"compiler.note.deprecated.plural","displayName":"Einige Eingabedateien verwenden oder überschreiben eine veraltete API."}]},{"locations":[{"path":"/Users/janik/Desktop/MCPlugins/environmentex/src/main/java/de/hessj/environmentex/MobHeads.java"},{"taskPath":":compileJava"}],"problem":[{"text":"Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten."}],"severity":"ADVICE","problemDetails":[{"text":"Hinweis: Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten."}],"contextualLabel":"Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten.","problemId":[{"name":"java","displayName":"Java compilation"},{"name":"compilation","displayName":"Compilation"},{"name":"compiler.note.deprecated.recompile","displayName":"Wiederholen Sie die Kompilierung mit -Xlint:deprecation, um Details zu erhalten."}]}],"problemsReport":{"totalProblemCount":2,"buildName":"environmentex","requestedTasks":"build","documentationLink":"https://docs.gradle.org/8.14.2/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
// end-report-data
);}
</script>

View File

@@ -27,4 +27,7 @@ commands:
usage: /<command>
r3load:
description: ----
usage: /<command>
quest:
description: Zeigt die heutigen Quests an
usage: /<command>

View File

@@ -6,6 +6,9 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.ScoreboardManager;
import de.hessj.helper.Helper.Type;
import net.kyori.adventure.text.Component;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.NamespacedKey;
@@ -22,12 +25,20 @@ import org.bukkit.inventory.RecipeChoice.MaterialChoice;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.components.CustomModelDataComponent;
import org.bukkit.persistence.PersistentDataType;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.scoreboard.Scoreboard;
import java.time.*;
import java.util.Map.Entry;
public class App extends JavaPlugin {
public static de.hessj.helper.Helper helper = new de.hessj.helper.Helper();
@@ -44,11 +55,21 @@ public class App extends JavaPlugin {
public NamespacedKey nsk4;
public NamespacedKey nskEmptyExpBottle;
public NamespacedKey nskGlow;
public static final String DIAMOND_DUST_KEY = "R3SDiamondDust";
public static final String DIAMOND_DUST_RECIPE_KEY = "R3S_SR_DIAMONDDUST";
public static final long TICKS_PER_SECOND = 20L;
public static final long SECONDS_PER_DAY = 86400L;
public ArrayList<ItemStack> rewardList = new ArrayList<>();
public ItemStack diamondDust;
public NamespacedKey nskdiamondDust;
public NamespacedKey nskDD;
public ItemMeta meta;
public ItemMeta meta2;
public ItemStack eBottle;
public final List<NamespacedKey> recipeKeys = new ArrayList<>();
public NamespacedKey nskHopper;
private final String name = "Trichterfilter";
public static boolean coordinateRunner = false;
public PluginManager pM = Bukkit.getPluginManager();
public HashMap<Player, Boolean> hmActionbar = new HashMap<Player, Boolean>();
@@ -56,13 +77,61 @@ public class App extends JavaPlugin {
public NamespacedKey nskLockedChest = new NamespacedKey(this, "R3SLockedChest");
public NamespacedKey nskLockedChestRecipe = new NamespacedKey(this, "R3SLockedChestRecipe");
public ItemStack lockedChest;
public boolean checkFilterHopper(ItemStack is) {
if (is == null) return false;
if (!is.hasItemMeta()) return false;
if (is.getItemMeta().displayName() == null) return false;
return is.getItemMeta().displayName().toString().contains(name);
}
public String getHopperConfigPath(org.bukkit.Location loc) {
return "hoppers." + loc.getWorld().getName() + "." + loc.getBlockX() + "~" + loc.getBlockY() + "~" + loc.getBlockZ() + ".filterinventory";
}
private void registerHopperRecipe() {
if (getServer().getRecipe(nskHopper) != null) return;
ItemStack hopper = new ItemStack(Material.HOPPER);
ItemMeta im = hopper.getItemMeta();
im.displayName(Component.text(ChatColor.WHITE + name));
im.lore(Arrays.asList(
Component.text(ChatColor.GRAY + "STRG + Rechtsklick auf den platzierten Filter"),
Component.text(ChatColor.GRAY + "ohne Item in der Hand, um den Filter zu öffnen")
));
im.setCustomModelData(1000021);
CustomModelDataComponent cmdc = im.getCustomModelDataComponent();
cmdc.setStrings(List.of("filter_hopper"));
im.setCustomModelDataComponent(cmdc);
hopper.setItemMeta(im);
ShapelessRecipe srHopper = new ShapelessRecipe(nskHopper, hopper);
srHopper.addIngredient(Material.HOPPER);
srHopper.addIngredient(Material.COMPARATOR);
getServer().addRecipe(srHopper);
}
@Override
public void onEnable() {
SquidPrevention.removeSquidReceipes();
SquidPrevention.addCustomSquidRecipes();
nskHopper = new NamespacedKey(this, "R3SFILTERHOPPER");
registerHopperRecipe();
nskdiamondDust = new NamespacedKey(this, DIAMOND_DUST_KEY);
nskDD = new NamespacedKey(this, DIAMOND_DUST_RECIPE_KEY);
setupRewards();
scheduleMidnightReset();
main = this;
DailyQuests.getTodaysQuest();
lockedChest = new ItemStack(Material.CHEST);
ItemMeta imlockedChest = lockedChest.getItemMeta();
imlockedChest.displayName(Component.translatable(ChatColor.AQUA + "Verschlossene Truhe"));
@@ -464,6 +533,8 @@ public class App extends JavaPlugin {
pM.registerEvents(new ChestEx(), this);
pM.registerEvents(new Backpacks(), this);
pM.registerEvents(new DeathLoc(), this);
pM.registerEvents(new BetterHoppers(), this);
pM.registerEvents(new DailyQuests(), this);
getCommand("test").setExecutor(new EnvironmentExCommands());
getCommand("y").setExecutor(new EnvironmentExCommands());
getCommand("n").setExecutor(new EnvironmentExCommands());
@@ -473,12 +544,121 @@ public class App extends JavaPlugin {
getCommand("pin").setTabCompleter(new PinFeature());
getCommand("ignorevote").setExecutor(new EnvironmentExCommands());
getCommand("r3load").setExecutor(new EnvironmentExCommands());
getCommand("quest").setExecutor(new EnvironmentExCommands());
}
public void log(Object msg) {
App.main.getLogger().info(msg.toString());
}
private void scheduleMidnightReset() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime nextMidnight = now.plusDays(1).withHour(0).withMinute(0).withSecond(0);
ZonedDateTime zdt = ZonedDateTime.of(nextMidnight, ZoneId.of("Europe/Berlin"));
Duration duration = Duration.between(now, zdt);
long secondsUntilMidnight = duration.getSeconds();
Bukkit.getScheduler().runTaskLater(this, this::startQuestResetScheduler, secondsUntilMidnight * TICKS_PER_SECOND);
}
private void startQuestResetScheduler() {
new BukkitRunnable() {
@Override
public void run() {
resetDailyQuestsForAllPlayers();
}
}.runTaskTimer(this, 0L, SECONDS_PER_DAY * TICKS_PER_SECOND);
}
private void resetDailyQuestsForAllPlayers() {
getConfig().set("players", null);
saveConfig();
for (Player player : Bukkit.getOnlinePlayers()) {
DailyQuests.getDailyQuests(player);
updatePlayerScoreboard(player);
player.sendMessage(helper.R3SMessage(Type.INFO, "[DailyQuests] Du hast eine neue Quest erhalten!"));
}
saveConfig();
}
private void updatePlayerScoreboard(Player player) {
Entry<Scoreboard, Boolean> entry = EnvironmentExCommands.boards.get(player.getName());
Scoreboard board = entry.getKey();
boolean isActive = entry.getValue();
ScoreboardManager manager = Bukkit.getScoreboardManager();
player.setScoreboard(manager.getNewScoreboard());
if (isActive) {
player.setScoreboard(board);
}
EnvironmentExCommands.boards.put(player.getName(), new SimpleEntry<>(board, isActive));
}
private void setupRewards() {
createDiamondDustItem();
registerDiamondDustRecipe();
initializeRewardList();
}
private void createDiamondDustItem() {
diamondDust = new ItemStack(Material.BARRIER);
ItemMeta meta = diamondDust.getItemMeta();
meta.setCustomModelData(1000010);
CustomModelDataComponent cmdc = meta.getCustomModelDataComponent();
cmdc.setStrings(Collections.singletonList("diamond_dust"));
meta.setCustomModelDataComponent(cmdc);
meta.displayName(Component.translatable(ChatColor.WHITE + "Diamant-Staub"));
meta.getPersistentDataContainer().set(nskdiamondDust, PersistentDataType.STRING, DIAMOND_DUST_KEY);
diamondDust.setItemMeta(meta);
}
private void registerDiamondDustRecipe() {
RecipeChoice choice = new RecipeChoice.ExactChoice(diamondDust);
ShapedRecipe recipe = new ShapedRecipe(nskDD, new ItemStack(Material.DIAMOND));
recipe.shape("** ", "** ", " ");
recipe.setIngredient('*', choice);
if (getServer().getRecipe(nskDD) == null) {
getServer().addRecipe(recipe);
}
}
private void initializeRewardList() {
rewardList.addAll(List.of(
new ItemStack(Material.EXPERIENCE_BOTTLE, 1),
new ItemStack(Material.APPLE, 10),
new ItemStack(Material.POTATO, 5),
new ItemStack(Material.CARROT, 5),
new ItemStack(Material.COOKED_BEEF, 10),
new ItemStack(Material.COOKED_CHICKEN, 10),
new ItemStack(Material.COOKED_COD, 10),
new ItemStack(Material.COOKED_MUTTON, 10),
new ItemStack(Material.COOKED_PORKCHOP, 10),
new ItemStack(Material.COOKED_RABBIT, 10),
new ItemStack(Material.COOKED_SALMON, 10),
new ItemStack(Material.IRON_INGOT, 5),
new ItemStack(Material.COPPER_INGOT, 5),
new ItemStack(Material.GOLD_NUGGET, 5),
new ItemStack(Material.FIREWORK_ROCKET, 5),
new ItemStack(Material.SADDLE, 1),
new ItemStack(Material.MELON_SEEDS, 5),
new ItemStack(Material.PUMPKIN_SEEDS, 5),
new ItemStack(Material.BEETROOT_SEEDS, 5),
new ItemStack(Material.DIAMOND, 1),
new ItemStack(Material.CAKE, 1),
new ItemStack(Material.ENDER_PEARL, 5)
));
}
public static Boolean isDay() {
// wenn zeit kleiner als 24000 && zeit größer gleich 12575

View File

@@ -0,0 +1,251 @@
//GPT'd
package de.hessj.environmentex;
import java.io.IOException;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import de.hessj.helper.Helper;
import net.kyori.adventure.text.Component;
public class BetterHoppers implements Listener {
private static final Component inventoryName = Component.text("Items zum filtern:");
@EventHandler
public void onLogin(final PlayerJoinEvent event) {
event.getPlayer().discoverRecipe(App.main.nskHopper);
}
@EventHandler
public void onBlockPlace(final org.bukkit.event.block.BlockPlaceEvent e) {
if (App.main.checkFilterHopper(e.getItemInHand())) {
final Location loc = e.getBlockPlaced().getLocation();
final InventoryHolder invHolder = (InventoryHolder) e.getBlockPlaced().getState();
final Inventory newHopperInv = Bukkit.createInventory(invHolder, 9);
App.main.getConfig()
.set(App.main.getHopperConfigPath(loc), Helper.itemStackArrayToBase64(newHopperInv.getContents()));
App.main.saveConfig();
}
}
@EventHandler
public void onPlayerInteract(final PlayerInteractEvent e) {
try {
if (e.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR
&& e.getAction() == Action.RIGHT_CLICK_BLOCK
&& e.getPlayer().isSneaking()
&& e.getClickedBlock() != null
&& e.getClickedBlock().getType() == Material.HOPPER) {
e.setCancelled(true);
final Location loc = e.getClickedBlock().getLocation();
final String path = App.main.getHopperConfigPath(loc);
if (App.main.getConfig().contains(path)) {
final InventoryHolder invHolder = (InventoryHolder) e.getClickedBlock().getState();
final Inventory hopperInv = Bukkit.createInventory(invHolder, 9, inventoryName);
hopperInv.setContents(Helper.itemStackArrayFromBase64(App.main.getConfig().getString(path)));
e.getPlayer().openInventory(hopperInv);
}
}
} catch (IllegalArgumentException | IOException ex) {
ex.printStackTrace();
}
}
@EventHandler
public void onInventoryClose(final InventoryCloseEvent e) {
if (e.getView().title().equals(inventoryName)) {
final Inventory invToSave = e.getInventory();
final InventoryHolder invHolder = invToSave.getHolder();
if (invHolder == null)
return;
final Location loc = invHolder.getInventory().getLocation();
if (loc != null) {
App.main.getConfig().set(App.main.getHopperConfigPath(loc),
Helper.itemStackArrayToBase64(invToSave.getContents()));
App.main.saveConfig();
}
}
}
@EventHandler
public void onInventoryClick(final InventoryClickEvent e) {
final Inventory top = e.getView().getTopInventory();
final Inventory bottom = e.getView().getBottomInventory();
if (e.getView().title().equals(inventoryName)) {
e.setCancelled(true);
if (e.getClickedInventory() == top) {
if (top.getItem(e.getSlot()) != null) {
top.setItem(e.getSlot(), null);
}
} else if (e.getClickedInventory() == bottom) {
if (bottom.getItem(e.getSlot()) != null && top.firstEmpty() != -1) {
final ItemStack is = bottom.getItem(e.getSlot()).clone();
is.setAmount(1);
if (!top.containsAtLeast(is, 1)) {
top.addItem(is);
}
}
}
}
}
@EventHandler
public void onBlockBreak(final BlockBreakEvent e) {
if (e.getPlayer() != null && e.getPlayer().getGameMode() == GameMode.SURVIVAL) {
final Block block = e.getBlock();
if (block.getType() == Material.HOPPER) {
if (removeFilterHopperData(block)) {
e.setCancelled(true);
}
}
}
}
@EventHandler
public void onEntityExplode(final EntityExplodeEvent e) {
for (final Block block : e.blockList()) {
if (block.getType() == Material.HOPPER) {
removeFilterHopperData(block);
}
}
}
private boolean removeFilterHopperData(final Block block) {
final Location loc = block.getLocation();
final String path = App.main.getHopperConfigPath(loc).replace(".filterinventory", "");
if (App.main.getConfig().contains(path + ".filterinventory")) {
App.main.getConfig().set(path, null);
App.main.saveConfig();
block.setType(Material.AIR);
block.getWorld().dropItemNaturally(loc, new ItemStack(Material.HOPPER));
block.getWorld().dropItemNaturally(loc, new ItemStack(Material.COMPARATOR));
return true;
}
return false;
}
@EventHandler
public void onInventoryPickupItem(final InventoryPickupItemEvent event) {
try {
final Inventory dest = event.getInventory();
final Location loc = dest.getLocation();
if (loc == null)
return;
final String path = App.main.getHopperConfigPath(loc);
if (App.main.getConfig().contains(path)) {
final InventoryHolder invHolder = (InventoryHolder) loc.getWorld().getBlockAt(loc).getState();
final Inventory hopperInv = Bukkit.createInventory(invHolder, 9, inventoryName);
hopperInv.setContents(Helper.itemStackArrayFromBase64(App.main.getConfig().getString(path)));
if (!checkSimilarity(event.getItem().getItemStack().getType(), hopperInv)) {
event.setCancelled(true);
}
}
} catch (IllegalArgumentException | IOException ex) {
ex.printStackTrace();
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInventoryMoveItem(final InventoryMoveItemEvent e) {
try {
final Inventory dest = e.getDestination();
final Location destLoc = dest.getLocation();
if (destLoc == null)
return;
final String path = App.main.getHopperConfigPath(destLoc);
if (App.main.getConfig().contains(path)) {
final InventoryHolder invHolder = (InventoryHolder) destLoc.getWorld().getBlockAt(destLoc).getState();
final Inventory filterInv = Bukkit.createInventory(invHolder, 9, inventoryName);
filterInv.setContents(Helper.itemStackArrayFromBase64(App.main.getConfig().getString(path)));
if (!filterInv.contains(e.getItem().getType())) {
e.setCancelled(true);
final Inventory source = e.getSource();
for (int slot = 0; slot < source.getSize(); slot++) {
final ItemStack sourceItem = source.getItem(slot);
if (sourceItem != null) {
final ItemStack temp = sourceItem.clone();
temp.setAmount(1);
if (filterInv.containsAtLeast(temp, 1)) {
moveItem(source, slot, dest);
return;
}
}
}
}
}
} catch (IllegalArgumentException | IOException ex) {
ex.printStackTrace();
}
}
private void moveItem(final Inventory source, final int slot, final Inventory dest) {
final ItemStack i = source.getItem(slot);
if (i == null)
return;
boolean freeSpace = false;
for (final ItemStack is : dest.getContents()) {
if (is != null) {
if (is.isSimilar(i)) {
if (is.getAmount() < is.getMaxStackSize()) {
is.setAmount(is.getAmount() + 1);
i.setAmount(i.getAmount() - 1);
source.setItem(slot, i.getAmount() > 0 ? i : null);
return;
}
}
} else {
freeSpace = true;
}
}
if (freeSpace) {
final ItemStack iClone = i.clone();
iClone.setAmount(1);
dest.setItem(dest.firstEmpty(), iClone);
i.setAmount(i.getAmount() - 1);
source.setItem(slot, i.getAmount() > 0 ? i : null);
}
}
private boolean checkSimilarity(final Material m, final Inventory filterInv) {
for (final ItemStack is : filterInv.getContents()) {
if (is != null && is.getType() == m) {
return true;
}
}
return false;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
@@ -25,12 +26,29 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import de.hessj.helper.Helper.Type;
import org.bukkit.scheduler.BukkitTask;
import java.util.ArrayList;
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import com.destroystokyo.paper.profile.PlayerProfile;
import com.destroystokyo.paper.profile.ProfileProperty;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import net.kyori.adventure.text.Component;
import net.md_5.bungee.api.ChatColor;
public class EnvironmentExCommands implements CommandExecutor, Listener {
public de.hessj.helper.Helper helper = new de.hessj.helper.Helper();
private final Map<UUID, Map<String, Location>> playerPins = new HashMap<>();
public static final Map<UUID, BukkitTask> playerTasks = new HashMap<>();
public static HashMap<UUID, BossBar> bossBars = new HashMap<>();
public static HashMap<String, Entry<Scoreboard, Boolean>> boards = new HashMap<String, Entry<Scoreboard, Boolean>>();
public static NamespacedKey nsksurpriseBox;
public static ItemStack surpriseBox;
public static de.hessj.helper.Helper helper = new de.hessj.helper.Helper();
int taskId;
public boolean isPlayerOnlineByName(String name) {
@@ -38,6 +56,150 @@ public class EnvironmentExCommands implements CommandExecutor, Listener {
return player != null && player.isOnline();
}
public static void updateSB(Player p) {
if (!(boards.containsKey(p.getName()))) {
Scoreboard board = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
boards.put(p.getName(), new SimpleEntry<Scoreboard, Boolean>(board, false));
}
Entry<Scoreboard, Boolean> actionMapEntry = boards.get(p.getName());
Scoreboard board = actionMapEntry.getKey();
if (board.getObjective(DisplaySlot.SIDEBAR) != null) {
board.getObjective(DisplaySlot.SIDEBAR).unregister();
}
Objective o = board.registerNewObjective("test", "dummy", Component.text("Quest:"));
o.setDisplaySlot(DisplaySlot.SIDEBAR);
Score score;
for (Object obj : App.main.getConfig().getConfigurationSection("players." + p.getUniqueId() + ".currentQuests")
.getKeys(false).toArray()) {
if (!obj.toString().equals("null")) {
String desc = "";
if (!App.main.getConfig().get("quests." + obj.toString() + ".tool").equals("none")) {
desc = (App.main.getConfig().get("quests." + obj.toString() + ".description")).toString()
.replace("[x]",
App.main.getConfig()
.get("players." + p.getUniqueId() + ".currentQuests." + obj.toString()
+ ".countneeded")
.toString()/*
* App.main.getConfig().get("quests." + obj.toString() +
* ".count").toString()
*/)
.replace("[b]", App.main.getConfig().get("quests." + obj.toString() + ".target").toString())
.replace("[t]", App.main.getConfig().get("quests." + obj.toString() + ".tool").toString()
.replace("Material.", ""));
} else {
desc = App.main.getConfig().get("quests." + obj.toString() + ".description").toString()
.replace("[x]",
App.main.getConfig()
.get("players." + p.getUniqueId() + ".currentQuests." + obj.toString()
+ ".countneeded")
.toString())
.replace("[b]",
App.main.getConfig().get("quests." + obj.toString() + ".target").toString());
}
desc = desc.replace("Material.", "");
if (desc.length() >= 39) {
desc = desc.substring(0, 39);
}
if (App.main.getConfig()
.get("players." + p.getUniqueId() + ".currentQuests." + obj.toString() + ".state")
.equals("finished")) {
board.resetScores(desc);
score = o.getScore(ChatColor.STRIKETHROUGH + "" + desc);
} else {
score = o.getScore(desc);
}
score.setScore(App.main.getConfig()
.getInt("players." + p.getUniqueId() + ".currentQuests." + obj.toString() + ".currentcount"));
checkForCompletion(p);
}
}
if (actionMapEntry.getValue()) {
boards.put(p.getName(), new SimpleEntry<Scoreboard, Boolean>(board, true));
} else {
boards.put(p.getName(), new SimpleEntry<Scoreboard, Boolean>(board, false));
}
}
static void checkForCompletion(Player p) {
int completed = 0;
int all = 0;
for (Object questIDs : App.main.getConfig().getConfigurationSection("quests").getKeys(false).toArray()) {
if (App.main.getConfig()
.contains("players." + p.getUniqueId().toString() + ".currentQuests." + questIDs.toString())) {
if (App.main.getConfig().get(
"players." + p.getUniqueId().toString() + ".currentQuests." + questIDs.toString() + ".state")
.equals("finished")) {
completed++;
}
all++;
}
}
if (completed == all) {
if (!App.main.getConfig().get("players." + p.getUniqueId().toString() + ".rewards").equals("claimed")) {
surpriseBox = new ItemStack(Material.PLAYER_HEAD, 1);
SkullMeta im = (SkullMeta) surpriseBox.getItemMeta();
im.displayName(Component.translatable(ChatColor.WHITE + "Überraschungsbox"));
im.setPlayerProfile(Bukkit.createProfile(UUID.randomUUID(), null));
PlayerProfile playerProfile = im.getPlayerProfile();
playerProfile.getProperties().add(new ProfileProperty("textures",
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDQxZmJlYTljMmQxOTA0MGU1NjdmMzg3YWI0NmIyZjhhM2ExZGE4ZWVjOWQzOTllMmU0YWRjZjA1YWRhOGEyYSJ9fX0="));
im.setPlayerProfile(playerProfile);
nsksurpriseBox = new NamespacedKey(App.main, "R3SSurpriseBox");
im.getPersistentDataContainer().set(nsksurpriseBox, PersistentDataType.STRING, "R3S_SurpriseBox");
ArrayList<Component> lore = new ArrayList<Component>();
lore.add(Component.translatable("Quest Belohnung"));
im.lore(lore);
surpriseBox.setItemMeta(im);
Boolean freeSpace = false;
Boolean given = false;
for (ItemStack i : p.getInventory().getStorageContents()) {
if (i != null) {
if (i.getType() == surpriseBox.getType() && i.hasItemMeta()
&& i.getItemMeta().getPersistentDataContainer() != null) {
if (i.getItemMeta().getPersistentDataContainer().has(nsksurpriseBox,
PersistentDataType.STRING)) {
if (i.getAmount() < 64) {
i.setAmount(i.getAmount() + 1);
given = true;
break;
}
}
}
} else {
if (i == null) {
freeSpace = true;
}
}
}
if (!freeSpace && !given) {
p.sendMessage(helper.R3SMessage(Type.ERROR, "[DailyQuests] Dein Inventar ist voll, schaffe Platz und logge dich ein, deine Questbelohnung zu erhalten!"));
} else {
if (!given && freeSpace) {
p.getInventory().addItem(surpriseBox);
}
p.sendMessage(
helper.R3SMessage(Type.SUCCESS,"[DailyQuests] Du hast 1x Überraschungsbox als Questbelohnung erhalten!"));
App.main.getConfig().set("players." + p.getUniqueId() + ".rewards", "claimed");
App.main.saveConfig();
}
}
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (sender instanceof Player) {
@@ -57,6 +219,19 @@ public class EnvironmentExCommands implements CommandExecutor, Listener {
}
}
if (label.equalsIgnoreCase("quest")) {
updateSB((Player) sender);
Entry<Scoreboard, Boolean> actionMapEntry = boards.get(((Player) sender).getName());
Scoreboard board = actionMapEntry.getKey();
if (actionMapEntry.getValue()) {
((Player) sender).setScoreboard(Bukkit.getServer().getScoreboardManager().getNewScoreboard());
boards.put(((Player) sender).getName(), new SimpleEntry<Scoreboard, Boolean>(board, false));
} else {
((Player) sender).setScoreboard(board);
boards.put(((Player) sender).getName(), new SimpleEntry<Scoreboard, Boolean>(board, true));
}
}
if (label.equalsIgnoreCase("afk")) {
Player p = (Player) sender;
p.playerListName(App.helper.R3SMessage(Type.ERROR, "[AFK] " + p.getName()));

View File

@@ -27,4 +27,7 @@ commands:
usage: /<command>
r3load:
description: ----
usage: /<command>
quest:
description: Zeigt die heutigen Quests an
usage: /<command>