mirror of
https://github.com/BlazingGames/blazing-games-plugin.git
synced 2025-02-03 21:26:41 -05:00
turned death crate keys into custom items
This commit is contained in:
parent
47a24cd04c
commit
395abd1cbd
7 changed files with 188 additions and 135 deletions
7
.idea/copyright/profiles_settings.xml
Normal file
7
.idea/copyright/profiles_settings.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<component name="CopyrightManager">
|
||||
<settings default="default">
|
||||
<module2copyright>
|
||||
<element module="All" copyright="default" />
|
||||
</module2copyright>
|
||||
</settings>
|
||||
</component>
|
|
@ -15,31 +15,21 @@
|
|||
*/
|
||||
package de.blazemcworld.blazinggames.crates;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import de.blazemcworld.blazinggames.BlazingGames;
|
||||
import de.blazemcworld.blazinggames.data.DataStorage;
|
||||
import de.blazemcworld.blazinggames.data.compression.GZipCompressionProvider;
|
||||
import de.blazemcworld.blazinggames.data.name.ULIDNameProvider;
|
||||
import de.blazemcworld.blazinggames.data.storage.GsonStorageProvider;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
|
||||
public class CrateManager {
|
||||
private CrateManager() {}
|
||||
private static final NamespacedKey KEY = BlazingGames.get().key("death_crate_key");
|
||||
private static final DataStorage<CrateData, String> crateStorage = DataStorage.forClass(
|
||||
CrateManager.class, null,
|
||||
new GsonStorageProvider<>(CrateData.class), new ULIDNameProvider(), new GZipCompressionProvider()
|
||||
|
@ -59,13 +49,11 @@ public class CrateManager {
|
|||
}
|
||||
|
||||
public static String getKeyULID(Location loc) {
|
||||
List<String> ids = crateStorage.query(data -> {
|
||||
return !data.opened &&
|
||||
List<String> ids = crateStorage.query(data -> !data.opened &&
|
||||
data.location.getWorld().getName().equals(loc.getWorld().getName()) &&
|
||||
data.location.blockX() == loc.getBlockX() &&
|
||||
data.location.blockY() == loc.getBlockY() &&
|
||||
data.location.blockZ() == loc.getBlockZ();
|
||||
});
|
||||
data.location.blockZ() == loc.getBlockZ());
|
||||
|
||||
if (ids.isEmpty()) {
|
||||
return null;
|
||||
|
@ -73,22 +61,17 @@ public class CrateManager {
|
|||
|
||||
if (ids.size() > 1) {
|
||||
// sort the ULIDs to find the newest
|
||||
ids.sort((a, b) -> {
|
||||
return b.compareTo(a);
|
||||
});
|
||||
ids.sort(Comparator.reverseOrder());
|
||||
}
|
||||
|
||||
return ids.get(0);
|
||||
return ids.getFirst();
|
||||
}
|
||||
|
||||
public static String createDeathCrate(UUID owner, PlayerInventory inventory, int exp, Location crateLocation) {
|
||||
ArrayList<ItemStack> items = new ArrayList<>();
|
||||
for (ItemStack item : inventory.getStorageContents()) {
|
||||
items.add(item);
|
||||
}
|
||||
ArrayList<ItemStack> items = new ArrayList<>(Arrays.asList(inventory.getStorageContents()));
|
||||
|
||||
List<ItemStack> hotbarItems = items.subList(0, 9).stream().filter(i -> i == null ? true : CrateManager.shouldStayOnDeath(i)).toList();
|
||||
List<ItemStack> inventoryItems = items.subList(9, 36).stream().filter(i -> i == null ? true : CrateManager.shouldStayOnDeath(i)).toList();
|
||||
List<ItemStack> hotbarItems = items.subList(0, 9).stream().filter(i -> i == null || CrateManager.shouldStayOnDeath(i)).toList();
|
||||
List<ItemStack> inventoryItems = items.subList(9, 36).stream().filter(i -> i == null || CrateManager.shouldStayOnDeath(i)).toList();
|
||||
|
||||
return crateStorage.storeNext(id -> new CrateData(
|
||||
id, owner, false,
|
||||
|
@ -109,26 +92,4 @@ public class CrateManager {
|
|||
public static void deleteCrate(String ulid) {
|
||||
crateStorage.deleteData(ulid);
|
||||
}
|
||||
|
||||
public static ItemStack makeKey(String ulid, Location location) {
|
||||
ItemStack item = new ItemStack(Material.TRIPWIRE_HOOK, 1);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.displayName(Component.text("Death Crate Key").color(NamedTextColor.DARK_RED).decoration(TextDecoration.ITALIC, false));
|
||||
meta.lore(List.of(
|
||||
Component.text("Location: %s, %s, %s in %s".formatted(location.getBlockX(), location.getBlockY(), location.getBlockZ(),
|
||||
location.getWorld().getName())).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true),
|
||||
Component.text("ULID: %s".formatted(ulid)).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true),
|
||||
Component.empty(),
|
||||
Component.text("Unlocks the crate at the location above. Can be used by anyone.").color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true)
|
||||
));
|
||||
meta.getPersistentDataContainer().set(KEY, PersistentDataType.STRING, ulid);
|
||||
item.setItemMeta(meta);
|
||||
return item;
|
||||
}
|
||||
|
||||
public static String getKeyULID(ItemStack item) {
|
||||
if (item == null) { return null; }
|
||||
if (!item.hasItemMeta()) { return null; }
|
||||
return item.getItemMeta().getPersistentDataContainer().get(KEY, PersistentDataType.STRING);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* Copyright 2025 The Blazing Games Maintainers
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package de.blazemcworld.blazinggames.crates;
|
||||
|
||||
import de.blazemcworld.blazinggames.BlazingGames;
|
||||
import de.blazemcworld.blazinggames.items.CustomItem;
|
||||
import de.blazemcworld.blazinggames.items.CustomItems;
|
||||
import de.blazemcworld.blazinggames.items.contexts.ItemContext;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DeathCrateKey extends CustomItem<DeathCrateKey.DeathCrateKeyContext> {
|
||||
private static final NamespacedKey crateKey = BlazingGames.get().key("death_crate_key");
|
||||
|
||||
@Override
|
||||
public @NotNull NamespacedKey getKey() {
|
||||
return crateKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @NotNull Component itemName() {
|
||||
return Component.text("Death Crate Key").color(NamedTextColor.DARK_RED);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @NotNull ItemStack modifyMaterial(ItemStack stack, DeathCrateKeyContext context) {
|
||||
String crateId = context.crateId();
|
||||
Location location = CrateManager.readCrate(crateId).location;
|
||||
|
||||
ItemMeta meta = stack.getItemMeta();
|
||||
|
||||
meta.getPersistentDataContainer().set(crateKey, PersistentDataType.STRING, crateId);
|
||||
meta.lore(List.of(
|
||||
Component.text("Location: %s, %s, %s in %s".formatted(location.getBlockX(), location.getBlockY(), location.getBlockZ(),
|
||||
location.getWorld().getName())).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true),
|
||||
Component.text("ULID: %s".formatted(crateId)).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true),
|
||||
Component.empty(),
|
||||
Component.text("Unlocks the crate at the location above. Can be used by anyone.").color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true)
|
||||
));
|
||||
|
||||
stack.setItemMeta(meta);
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
public static String getKeyULID(ItemStack item) {
|
||||
if(CustomItems.DEATH_CRATE_KEY.matchItem(item))
|
||||
{
|
||||
return item.getItemMeta().getPersistentDataContainer().get(crateKey, PersistentDataType.STRING);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public record DeathCrateKeyContext(String crateId) implements ItemContext {
|
||||
}
|
||||
}
|
|
@ -19,7 +19,6 @@ import de.blazemcworld.blazinggames.BlazingGames;
|
|||
import de.blazemcworld.blazinggames.computing.BootedComputer;
|
||||
import de.blazemcworld.blazinggames.computing.ComputerRegistry;
|
||||
import de.blazemcworld.blazinggames.computing.types.ComputerTypes;
|
||||
import de.blazemcworld.blazinggames.crates.CrateManager;
|
||||
import de.blazemcworld.blazinggames.items.CustomItem;
|
||||
import de.blazemcworld.blazinggames.items.CustomItems;
|
||||
import de.blazemcworld.blazinggames.items.CustomSlabs;
|
||||
|
@ -59,11 +58,6 @@ public class BlockPlaceEventListener implements Listener {
|
|||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
if (CrateManager.getKeyULID(event.getItemInHand()) != null) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getItemInHand().getType() == Material.SPAWNER) {
|
||||
CreatureSpawner spawner = (CreatureSpawner) event.getBlock().getState();
|
||||
CreatureSpawner item = (CreatureSpawner) ((BlockStateMeta) event.getItemInHand().getItemMeta()).getBlockState();
|
||||
|
|
|
@ -16,8 +16,10 @@
|
|||
package de.blazemcworld.blazinggames.events;
|
||||
|
||||
import de.blazemcworld.blazinggames.crates.CrateManager;
|
||||
import de.blazemcworld.blazinggames.crates.DeathCrateKey;
|
||||
import de.blazemcworld.blazinggames.discord.DiscordApp;
|
||||
import de.blazemcworld.blazinggames.discord.DiscordNotification;
|
||||
import de.blazemcworld.blazinggames.items.CustomItems;
|
||||
import de.blazemcworld.blazinggames.utils.TextUtils;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
|
@ -88,6 +90,6 @@ public class DeathEventListener implements Listener {
|
|||
event.setDroppedExp(0);
|
||||
event.getDrops().clear();
|
||||
String ulid = CrateManager.createDeathCrate(player.getUniqueId(), event.getPlayer().getInventory(), event.getPlayer().calculateTotalExperiencePoints(), crateLocation);
|
||||
event.getItemsToKeep().add(CrateManager.makeKey(ulid, crateLocation));
|
||||
event.getItemsToKeep().add(CustomItems.DEATH_CRATE_KEY.create(new DeathCrateKey.DeathCrateKeyContext(ulid)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ package de.blazemcworld.blazinggames.events;
|
|||
import de.blazemcworld.blazinggames.BlazingGames;
|
||||
import de.blazemcworld.blazinggames.crates.CrateData;
|
||||
import de.blazemcworld.blazinggames.crates.CrateManager;
|
||||
import de.blazemcworld.blazinggames.crates.DeathCrateKey;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.CustomEnchantments;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.EnchantmentHelper;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.altar.AltarInterface;
|
||||
|
@ -86,20 +87,35 @@ public class InteractEventListener implements Listener {
|
|||
|
||||
if (block != null && block.getType() == Material.VAULT) vaultShit(block);
|
||||
|
||||
if (eventItem != null && (CrateManager.getKeyULID(eventItem) != null)) {
|
||||
event.setCancelled(true);
|
||||
if (block != null && block.getType() == Material.END_PORTAL_FRAME && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
String crateId = CrateManager.getKeyULID(block.getLocation());
|
||||
|
||||
boolean allowOpening = false;
|
||||
|
||||
if(crateId != null) {
|
||||
if(CustomItems.DEATH_CRATE_KEY.matchItem(eventItem)) {
|
||||
String keyId = DeathCrateKey.getKeyULID(eventItem);
|
||||
|
||||
if(Objects.equals(crateId, keyId)) {
|
||||
allowOpening = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (block != null && block.getType() == Material.END_PORTAL_FRAME && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
ItemStack handItem = player.getInventory().getItem(hand);
|
||||
String ulid = (CustomItems.SKELETON_KEY.matchItem(handItem) || CustomItems.TO_GO_BOX.matchItem(handItem))
|
||||
? CrateManager.getKeyULID(block.getLocation()) : CrateManager.getKeyULID(handItem);
|
||||
if (CustomItems.SKELETON_KEY.matchItem(handItem) || CustomItems.TO_GO_BOX.matchItem(handItem)) player.setCooldown(handItem, 200);
|
||||
if (ulid != null) {
|
||||
CrateData data = CrateManager.readCrate(ulid);
|
||||
if(CustomItems.SKELETON_KEY.matchItem(eventItem) || CustomItems.TO_GO_BOX.matchItem(eventItem)) {
|
||||
assert eventItem != null;
|
||||
|
||||
if(!player.hasCooldown(eventItem)) {
|
||||
allowOpening = true;
|
||||
player.setCooldown(eventItem, 200);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (allowOpening) {
|
||||
CrateData data = CrateManager.readCrate(crateId);
|
||||
Location crateLocation = data.location;
|
||||
|
||||
if (CustomItems.TO_GO_BOX.matchItem(handItem)) {
|
||||
if (CustomItems.TO_GO_BOX.matchItem(eventItem)) {
|
||||
crateLocation.getBlock().breakNaturally();
|
||||
ItemStack filledToGoBox = new ItemStack(Material.BUNDLE);
|
||||
BundleMeta bundleMeta = (BundleMeta) filledToGoBox.getItemMeta();
|
||||
|
@ -117,20 +133,17 @@ public class InteractEventListener implements Listener {
|
|||
}
|
||||
|
||||
filledToGoBox.setItemMeta(bundleMeta);
|
||||
player.getInventory().getItem(hand).setAmount(player.getInventory().getItem(hand).getAmount() - 1);
|
||||
player.getInventory().getItem(hand).subtract(1);
|
||||
if (player.getInventory().firstEmpty() != -1) {
|
||||
player.getInventory().addItem(filledToGoBox);
|
||||
} else {
|
||||
player.getWorld().dropItemNaturally(player.getLocation(), filledToGoBox);
|
||||
}
|
||||
player.giveExp(data.exp);
|
||||
CrateManager.deleteCrate(ulid);
|
||||
CrateManager.deleteCrate(crateId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (crateLocation != null && (
|
||||
crateLocation.blockX() == block.getX() && crateLocation.blockY() == block.getY() && crateLocation.blockZ() == block.getZ()
|
||||
)) {
|
||||
PlayerInventory inventory = player.getInventory();
|
||||
|
||||
if (
|
||||
|
@ -144,13 +157,7 @@ public class InteractEventListener implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
if (handItem.getAmount() > 1) {
|
||||
ItemStack newStack = handItem;
|
||||
newStack.setAmount(handItem.getAmount() - 1);
|
||||
inventory.setItem(hand, newStack);
|
||||
} else {
|
||||
inventory.setItem(hand, new ItemStack(Material.AIR));
|
||||
}
|
||||
player.getInventory().getItem(hand).subtract(1);
|
||||
crateLocation.getBlock().breakNaturally(true);
|
||||
|
||||
if (data.offhand != null) inventory.setItemInOffHand(data.offhand);
|
||||
|
@ -189,8 +196,7 @@ public class InteractEventListener implements Listener {
|
|||
|
||||
player.giveExp(data.exp);
|
||||
|
||||
CrateManager.deleteCrate(ulid);
|
||||
}
|
||||
CrateManager.deleteCrate(crateId);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ package de.blazemcworld.blazinggames.items;
|
|||
|
||||
import de.blazemcworld.blazinggames.BlazingGames;
|
||||
import de.blazemcworld.blazinggames.builderwand.BuilderWand;
|
||||
import de.blazemcworld.blazinggames.crates.DeathCrateKey;
|
||||
import de.blazemcworld.blazinggames.crates.SkeletonKey;
|
||||
import de.blazemcworld.blazinggames.crates.ToGoBoxItem;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.CustomEnchantments;
|
||||
|
@ -36,6 +37,7 @@ public class CustomItems {
|
|||
public static final Blueprint BLUEPRINT = new Blueprint();
|
||||
public static final TomeAltar TOME_ALTAR = new TomeAltar();
|
||||
public static final List<CustomSlabs.CustomSlab> CUSTOM_SLABS = new CustomSlabs().slabs;
|
||||
public static final DeathCrateKey DEATH_CRATE_KEY = new DeathCrateKey();
|
||||
public static final SkeletonKey SKELETON_KEY = new SkeletonKey();
|
||||
public static final ToGoBoxItem TO_GO_BOX = new ToGoBoxItem();
|
||||
public static final NetherStarChunk NETHER_STAR_CHUNK = new NetherStarChunk();
|
||||
|
@ -51,13 +53,14 @@ public class CustomItems {
|
|||
public static final EnchantmentTome GREED_TOME = new EnchantmentTome(BlazingGames.get().key("greed_tome"), "Greed Tome", CustomEnchantments.SCAVENGER);
|
||||
public static final EnchantmentTome DIM_TOME = new EnchantmentTome(BlazingGames.get().key("dim_tome"), "Dim Tome", CustomEnchantments.UNSHINY);
|
||||
|
||||
public static Set<CustomItem> list() {
|
||||
Set<CustomItem> set = new java.util.HashSet<>(Set.of(
|
||||
public static Set<CustomItem<?>> list() {
|
||||
Set<CustomItem<?>> set = new java.util.HashSet<>(Set.of(
|
||||
BUILDER_WAND,
|
||||
PORTABLE_CRAFTING_TABLE,
|
||||
TELEPORT_ANCHOR,
|
||||
BLUEPRINT,
|
||||
TOME_ALTAR,
|
||||
DEATH_CRATE_KEY,
|
||||
SKELETON_KEY,
|
||||
TO_GO_BOX,
|
||||
NETHER_STAR_CHUNK,
|
||||
|
@ -77,8 +80,8 @@ public class CustomItems {
|
|||
return set;
|
||||
}
|
||||
|
||||
public static @Nullable CustomItem getByKey(NamespacedKey key) {
|
||||
for(CustomItem curr : list()) {
|
||||
public static @Nullable CustomItem<?> getByKey(NamespacedKey key) {
|
||||
for(CustomItem<?> curr : list()) {
|
||||
if(curr.getKey().equals(key)) {
|
||||
return curr;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue