diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index 6c8c3d4d3..ccc9c42cc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -89,11 +89,10 @@ public class BukkitFurniture implements Furniture { List minimizedPackets = new ArrayList<>(); List colliders = new ArrayList<>(); WorldPosition position = position(); - Integer dyedColor = this.extraData.dyedColor().orElse(null); for (FurnitureElement element : placement.elements()) { int entityId = CoreReflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); fakeEntityIds.add(entityId); - element.initPackets(entityId, position, conjugated, dyedColor, packet -> { + element.initPackets(this, entityId, conjugated, packet -> { packets.add(packet); if (this.minimized) minimizedPackets.add(packet); }); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java index b87e63107..4970c0467 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.entity.furniture; +import it.unimi.dsi.fastutil.ints.IntArrayList; import net.momirealms.craftengine.bukkit.entity.data.ItemDisplayEntityData; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; @@ -8,14 +9,19 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityType import net.momirealms.craftengine.core.entity.Billboard; import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.entity.furniture.AbstractFurnitureElement; +import net.momirealms.craftengine.core.entity.furniture.Furniture; import net.momirealms.craftengine.core.entity.furniture.FurnitureElement; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.data.FireworkExplosion; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.WorldPosition; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -45,16 +51,24 @@ public class BukkitFurnitureElement extends AbstractFurnitureElement { } @Override - public void initPackets(int entityId, @NotNull WorldPosition position, @NotNull Quaternionf conjugated, Integer dyedColor, Consumer packets) { + public void initPackets(Furniture furniture, int entityId, @NotNull Quaternionf conjugated, Consumer packets) { + WorldPosition position = furniture.position(); Vector3f offset = conjugated.transform(new Vector3f(position())); packets.accept(FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket( entityId, UUID.randomUUID(), position.x() + offset.x, position.y() + offset.y, position.z() - offset.z, 0, position.xRot(), MEntityTypes.ITEM_DISPLAY, 0, CoreReflections.instance$Vec3$Zero, 0 )); - packets.accept(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId, getCachedValues(dyedColor))); + if (applyDyedColor()) { + packets.accept(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId, getCachedValues( + furniture.extraData().dyedColor().orElse(null), + furniture.extraData().fireworkExplosionColors().orElse(null) + ))); + } else { + packets.accept(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId, getCachedValues(null, null))); + } } - private synchronized List getCachedValues(Integer color) { + private synchronized List getCachedValues(@Nullable Integer color, int @Nullable [] colors) { List cachedValues = new ArrayList<>(this.commonValues); Item item = BukkitItemManager.instance().createWrappedItem(item(), null); if (item == null) { @@ -64,6 +78,15 @@ public class BukkitFurnitureElement extends AbstractFurnitureElement { if (color != null) { item.dyedColor(color); } + if (colors != null) { + item.fireworkExplosion(new FireworkExplosion( + FireworkExplosion.Shape.SMALL_BALL, + new IntArrayList(colors), + new IntArrayList(), + false, + false + )); + } } ItemDisplayEntityData.DisplayedItem.addEntityDataIfNotDefaultValue(item.getLiteralObject(), cachedValues); return cachedValues; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java index 740cae24a..a2384b429 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java @@ -29,6 +29,7 @@ public class ComponentTypes { public static final Object PROFILE = getComponentType(ComponentKeys.PROFILE); public static final Object DYED_COLOR = getComponentType(ComponentKeys.DYED_COLOR); public static final Object DEATH_PROTECTION = getComponentType(ComponentKeys.DEATH_PROTECTION); + public static final Object FIREWORK_EXPLOSION = getComponentType(ComponentKeys.FIREWORK_EXPLOSION); private ComponentTypes() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 054c9302f..ff545d711 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -135,6 +135,7 @@ public class FurnitureItemBehavior extends ItemBehavior { .item(item.copyWithCount(1)) .anchorType(anchorType) .dyedColor(item.dyedColor().orElse(null)) + .fireworkExplosionColors(item.fireworkExplosion().map(explosion -> explosion.colors().toIntArray()).orElse(null)) .build(), false); FurniturePlaceEvent placeEvent = new FurniturePlaceEvent(bukkitPlayer, bukkitFurniture, furnitureLocation, context.getHand()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index fd7467d98..f5ad7bf9c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -5,7 +5,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect import net.momirealms.craftengine.bukkit.util.ItemTags; import net.momirealms.craftengine.core.item.ItemFactory; import net.momirealms.craftengine.core.item.ItemWrapper; -import net.momirealms.craftengine.core.item.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.Key; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java index d995d84a2..ba7ca035c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.item.factory; import com.google.gson.JsonElement; +import it.unimi.dsi.fastutil.ints.IntArrayList; import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper; import net.momirealms.craftengine.bukkit.item.ComponentTypes; import net.momirealms.craftengine.bukkit.nms.FastNMS; @@ -9,18 +10,17 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInReg import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.EnchantmentUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; -import net.momirealms.craftengine.core.item.Enchantment; -import net.momirealms.craftengine.core.item.Trim; +import net.momirealms.craftengine.core.item.data.Enchantment; +import net.momirealms.craftengine.core.item.data.FireworkExplosion; +import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.inventory.ItemStack; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; public class ComponentItemFactory1_20_5 extends BukkitItemFactory { @@ -479,6 +479,41 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory fireworkExplosion(ComponentItemWrapper item) { + Optional optionalExplosion = item.getJavaComponent(ComponentTypes.FIREWORK_EXPLOSION); + if (optionalExplosion.isEmpty()) return Optional.empty(); + Map explosions = MiscUtils.castToMap(optionalExplosion.get(), false); + FireworkExplosion.Shape shape = Optional.ofNullable(FireworkExplosion.Shape.byName((String) explosions.get("shape"))).orElse(FireworkExplosion.Shape.SMALL_BALL); + boolean hasTrail = (boolean) explosions.getOrDefault("has_trail", false); + boolean hasTwinkler = (boolean) explosions.getOrDefault("has_twinkle", false); + List colors = (List) Optional.ofNullable(explosions.get("colors")).orElse(new IntArrayList()); + List fadeColors = (List) Optional.ofNullable(explosions.get("fade_colors")).orElse(new IntArrayList()); + return Optional.of(new FireworkExplosion( + shape, + new IntArrayList(colors), + new IntArrayList(fadeColors), + hasTrail, + hasTwinkler + )); + } + + @Override + protected void fireworkExplosion(ComponentItemWrapper item, FireworkExplosion explosion) { + if (explosion == null) { + item.resetComponent(ComponentTypes.FIREWORK_EXPLOSION); + } else { + item.setJavaComponent(ComponentTypes.FIREWORK_EXPLOSION, Map.of( + "shape", explosion.shape().getName(), + "has_trail", explosion.hasTrail(), + "has_twinkle", explosion.hasTwinkle(), + "colors", explosion.colors(), + "fade_colors", explosion.fadeColors() + )); + } + } + @Override protected ComponentItemWrapper mergeCopy(ComponentItemWrapper item1, ComponentItemWrapper item2) { Object itemStack1 = item1.getLiteralObject(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21.java index c0825fa78..c59058968 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.item.factory; import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper; import net.momirealms.craftengine.bukkit.item.ComponentTypes; -import net.momirealms.craftengine.core.item.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.plugin.CraftEngine; import java.util.Map; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java index aba395cee..af0981b60 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java @@ -5,7 +5,7 @@ import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper; import net.momirealms.craftengine.bukkit.item.ComponentTypes; -import net.momirealms.craftengine.core.item.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.GsonHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index aa71360c2..9d802d265 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -1,11 +1,13 @@ package net.momirealms.craftengine.bukkit.item.factory; +import it.unimi.dsi.fastutil.ints.IntArrayList; import net.momirealms.craftengine.bukkit.item.LegacyItemWrapper; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.bukkit.util.KeyUtils; -import net.momirealms.craftengine.core.item.Enchantment; -import net.momirealms.craftengine.core.item.Trim; +import net.momirealms.craftengine.core.item.data.Enchantment; +import net.momirealms.craftengine.core.item.data.FireworkExplosion; +import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.item.modifier.IdModifier; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.Key; @@ -260,6 +262,38 @@ public class UniversalItemFactory extends BukkitItemFactory { item.setTag(trim.pattern(), "Trim", "pattern"); } + @Override + protected Optional fireworkExplosion(LegacyItemWrapper item) { + Map explosionObj = item.getJavaTag("Explosion"); + if (explosionObj == null) return Optional.empty(); + IntArrayList colors = (IntArrayList) explosionObj.get("Colors"); + IntArrayList fadeColors = (IntArrayList) explosionObj.get("FadeColors"); + return Optional.of( + new FireworkExplosion( + FireworkExplosion.Shape.byId((Integer) explosionObj.getOrDefault("Type", 0)), + colors == null ? new IntArrayList() : new IntArrayList(colors), + fadeColors == null ? new IntArrayList() : new IntArrayList(fadeColors), + (boolean) explosionObj.getOrDefault("Trail", false), + (boolean) explosionObj.getOrDefault("Flicker", false) + ) + ); + } + + @Override + protected void fireworkExplosion(LegacyItemWrapper item, FireworkExplosion explosion) { + if (explosion == null) { + item.remove("Explosion"); + } else { + item.setTag(Map.of( + "Type", explosion.shape().id(), + "Colors", explosion.colors(), + "FadeColors", explosion.fadeColors(), + "Trail", explosion.hasTrail(), + "Flicker", explosion.hasTwinkle() + ), "Explosion"); + } + } + @Override protected Optional trim(LegacyItemWrapper item) { String material = item.getJavaTag("Trim", "material"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index 34ab95ee7..3d3ab0837 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -758,7 +758,7 @@ public class RecipeEventListener implements Listener { int newItemDamage = Math.max(0, newItem.maxDamage() - remainingDurability); newItem.damage(newItemDamage); inventory.setResult(newItem.getItem()); - } else if (CoreReflections.clazz$ArmorDyeRecipe.isInstance(mcRecipe)) { + } else if (CoreReflections.clazz$ArmorDyeRecipe.isInstance(mcRecipe) || CoreReflections.clazz$FireworkStarFadeRecipe.isInstance(mcRecipe)) { ItemStack[] itemStacks = inventory.getMatrix(); for (ItemStack itemStack : itemStacks) { if (itemStack == null) continue; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index f54df7ae9..ee3439b35 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -2257,6 +2257,27 @@ public final class CoreReflections { ) ); + public static final Class clazz$FireworkRocketRecipe = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.item.crafting.RecipeFireworks", + "world.item.crafting.FireworkRocketRecipe" + ) + ); + + public static final Class clazz$FireworkStarRecipe = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.item.crafting.RecipeFireworksStar", + "world.item.crafting.FireworkStarRecipe" + ) + ); + + public static final Class clazz$FireworkStarFadeRecipe = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.item.crafting.RecipeFireworksFade", + "world.item.crafting.FireworkStarFadeRecipe" + ) + ); + public static final Class clazz$AnvilMenu = requireNonNull( BukkitReflectionUtils.findReobfOrMojmapClass( "world.inventory.ContainerAnvil", diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java index f997ce0fe..3e1876ff4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java @@ -28,7 +28,7 @@ public interface FurnitureElement { Vector3f position(); - void initPackets(int entityId, @NotNull WorldPosition position, @NotNull Quaternionf conjugated, @Nullable Integer dyedColor, Consumer packets); + void initPackets(Furniture furniture, int entityId, @NotNull Quaternionf conjugated, Consumer packets); interface Builder { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureExtraData.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureExtraData.java index 1e5f9b1f1..520c4ecd3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureExtraData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureExtraData.java @@ -12,6 +12,7 @@ import java.util.Optional; public class FurnitureExtraData { public static final String ITEM = "item"; public static final String DYED_COLOR = "dyed_color"; + public static final String FIREWORK_EXPLOSION_COLORS = "firework_explosion_colors"; public static final String ANCHOR_TYPE = "anchor_type"; private final CompoundTag data; @@ -45,6 +46,11 @@ public class FurnitureExtraData { } } + public Optional fireworkExplosionColors() { + if (this.data.containsKey(FIREWORK_EXPLOSION_COLORS)) return Optional.of(this.data.getIntArray(FIREWORK_EXPLOSION_COLORS)); + return Optional.empty(); + } + public Optional dyedColor() { if (this.data.containsKey(DYED_COLOR)) return Optional.of(this.data.getInt(DYED_COLOR)); return Optional.empty(); @@ -94,6 +100,12 @@ public class FurnitureExtraData { return this; } + public Builder fireworkExplosionColors(int[] colors) { + if (colors == null) return this; + this.data.putIntArray(FIREWORK_EXPLOSION_COLORS, colors); + return this; + } + public Builder anchorType(AnchorType type) { this.data.putInt(ANCHOR_TYPE, type.getId()); return this; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index cd80b22cb..fc3cc6e25 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -3,6 +3,10 @@ package net.momirealms.craftengine.core.item; import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.data.Enchantment; +import net.momirealms.craftengine.core.item.data.FireworkExplosion; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.util.Key; import net.momirealms.sparrow.nbt.Tag; @@ -107,6 +111,17 @@ public class AbstractItem, I> implements Item { return this.factory.dyedColor(this.item); } + @Override + public Item fireworkExplosion(FireworkExplosion explosion) { + this.factory.fireworkExplosion(this.item, explosion); + return this; + } + + @Override + public Optional fireworkExplosion() { + return this.factory.fireworkExplosion(this.item); + } + @SuppressWarnings("unchecked") @Override public Optional> getCustomItem() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 62bf5eb1e..8452d6334 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -2,6 +2,8 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; +import net.momirealms.craftengine.core.item.data.Enchantment; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.item.modifier.*; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.item.setting.ItemEquipment; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java index 40e402bff..d527aac2f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java @@ -27,4 +27,5 @@ public final class ComponentKeys { public static final Key DYED_COLOR = Key.of("minecraft", "dyed_color"); public static final Key DEATH_PROTECTION = Key.of("minecraft", "death_protection"); public static final Key FOOD = Key.of("minecraft", "food"); + public static final Key FIREWORK_EXPLOSION = Key.of("minecraft", "firework_explosion"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/EmptyItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/EmptyItem.java deleted file mode 100644 index 5fcfdbefb..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/item/EmptyItem.java +++ /dev/null @@ -1,342 +0,0 @@ -//package net.momirealms.craftengine.core.item; -// -//import com.google.gson.JsonElement; -//import net.momirealms.craftengine.core.item.behavior.ItemBehavior; -//import net.momirealms.craftengine.core.util.Key; -// -//import java.util.List; -//import java.util.Optional; -// -//public class EmptyItem implements Item { -// private final I item; -// -// public EmptyItem(I item) { -// this.item = item; -// } -// -// @Override -// public Item addEnchantment(Enchantment enchantment) { -// return this; -// } -// -// @Override -// public Optional> getCustomItem() { -// return Optional.empty(); -// } -// -// @Override -// public Optional> getItemBehavior() { -// return Optional.empty(); -// } -// -// @Override -// public boolean isCustomItem() { -// return false; -// } -// -// @Override -// public boolean isBlockItem() { -// return false; -// } -// -// @Override -// public Key id() { -// return ItemKeys.AIR; -// } -// -// @Override -// public Key vanillaId() { -// return ItemKeys.AIR; -// } -// -// @Override -// public Optional customId() { -// return Optional.empty(); -// } -// -// @Override -// public Item customId(Key id) { -// return this; -// } -// -// @Override -// public int count() { -// return 0; -// } -// -// @Override -// public Item count(int amount) { -// return this; -// } -// -// @Override -// public Item trim(Trim trim) { -// return this; -// } -// -// @Override -// public Optional trim() { -// return Optional.empty(); -// } -// -// @Override -// public Item customModelData(Integer data) { -// return this; -// } -// -// @Override -// public Optional customModelData() { -// return Optional.empty(); -// } -// -// @Override -// public Item damage(Integer data) { -// return this; -// } -// -// @Override -// public Optional damage() { -// return Optional.empty(); -// } -// -// @Override -// public Item repairCost(Integer data) { -// return this; -// } -// -// @Override -// public Optional repairCost() { -// return Optional.empty(); -// } -// -// @Override -// public Item maxDamage(Integer data) { -// return this; -// } -// -// @Override -// public Optional maxDamage() { -// return Optional.empty(); -// } -// -// @Override -// public Item dyedColor(Integer data) { -// return this; -// } -// -// @Override -// public Optional dyedColor() { -// return Optional.empty(); -// } -// -// @Override -// public Item customName(String displayName) { -// return this; -// } -// -// @Override -// public Optional customName() { -// return Optional.empty(); -// } -// -// @Override -// public Item itemName(String itemName) { -// return this; -// } -// -// @Override -// public Optional itemName() { -// return Optional.empty(); -// } -// -// @Override -// public Item itemModel(String itemModel) { -// return this; -// } -// -// @Override -// public Optional itemModel() { -// return Optional.empty(); -// } -// -// @Override -// public Item tooltipStyle(String tooltipStyle) { -// return this; -// } -// -// @Override -// public Optional tooltipStyle() { -// return Optional.empty(); -// } -// -// @Override -// public Item lore(List lore) { -// return this; -// } -// -// @Override -// public Optional jukeboxSong() { -// return Optional.empty(); -// } -// -// @Override -// public Item jukeboxSong(JukeboxPlayable song) { -// return this; -// } -// -// @Override -// public Optional equippable() { -// return Optional.empty(); -// } -// -// @Override -// public Item equippable(EquipmentData equipmentData) { -// return this; -// } -// -// @Override -// public Optional> lore() { -// return Optional.empty(); -// } -// -// @Override -// public Item unbreakable(boolean unbreakable) { -// return this; -// } -// -// @Override -// public boolean unbreakable() { -// return false; -// } -// -// @Override -// public Item skull(String data) { -// return this; -// } -// -// @Override -// public Optional getEnchantment(Key enchantmentId) { -// return Optional.empty(); -// } -// -// @Override -// public Item setEnchantments(List enchantments) { -// return this; -// } -// -// @Override -// public Item setStoredEnchantments(List enchantments) { -// return this; -// } -// -// @Override -// public Item addStoredEnchantment(Enchantment enchantment) { -// return this; -// } -// -// @Override -// public Item itemFlags(List flags) { -// return this; -// } -// -// @Override -// public Object getTag(Object... path) { -// return null; -// } -// -// @Override -// public Item setTag(Object value, Object... path) { -// return this; -// } -// -// @Override -// public boolean hasTag(Object... path) { -// return false; -// } -// -// @Override -// public boolean removeTag(Object... path) { -// return false; -// } -// -// @Override -// public boolean hasComponent(Object type) { -// return false; -// } -// -// @Override -// public void removeComponent(Object type) { -// } -// -// @Override -// public Object getComponent(Object type) { -// return null; -// } -// -// @Override -// public Object getJavaTypeComponent(Object type) { -// return null; -// } -// -// @Override -// public JsonElement getJsonTypeComponent(Object type) { -// return null; -// } -// -// @Override -// public void setComponent(Object type, Object value) { -// } -// -// @Override -// public void resetComponent(Object type) { -// } -// -// @Override -// public I getItem() { -// return this.item; -// } -// -// @Override -// public I load() { -// return this.item; -// } -// -// @Override -// public int maxStackSize() { -// return 0; -// } -// -// @Override -// public Item maxStackSize(int amount) { -// return this; -// } -// -// @Override -// public Item copyWithCount(int count) { -// return this; -// } -// -// @Override -// public boolean is(Key itemTag) { -// return false; -// } -// -// @Override -// public Object getLiteralObject() { -// return null; -// } -// -// @Override -// public Item mergeCopy(Item another) { -// return this; -// } -// -// @Override -// public void merge(Item another) { -// } -// -// @Override -// public byte[] toByteArray() { -// return new byte[0]; -// } -//} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java index 504975498..237eb3d0e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -3,6 +3,10 @@ package net.momirealms.craftengine.core.item; import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.data.Enchantment; +import net.momirealms.craftengine.core.item.data.FireworkExplosion; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.util.Key; @@ -64,6 +68,10 @@ public interface Item { Optional dyedColor(); + Item fireworkExplosion(FireworkExplosion explosion); + + Optional fireworkExplosion(); + Item customNameJson(String displayName); Item customNameComponent(Component displayName); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java index 49f0dbb60..f0af10fe0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -2,6 +2,10 @@ package net.momirealms.craftengine.core.item; import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.item.data.Enchantment; +import net.momirealms.craftengine.core.item.data.FireworkExplosion; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.AdventureHelper; @@ -181,6 +185,10 @@ public abstract class ItemFactory, I> { protected abstract Optional equippable(W item); + protected abstract void fireworkExplosion(W item, FireworkExplosion explosion); + + protected abstract Optional fireworkExplosion(W item); + protected abstract byte[] toByteArray(W item); protected abstract void setJavaComponent(W item, Object type, Object value); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java b/core/src/main/java/net/momirealms/craftengine/core/item/data/Enchantment.java similarity index 66% rename from core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java rename to core/src/main/java/net/momirealms/craftengine/core/item/data/Enchantment.java index 80cb64a05..99e054ffc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/data/Enchantment.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.item; +package net.momirealms.craftengine.core.item.data; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/data/FireworkExplosion.java b/core/src/main/java/net/momirealms/craftengine/core/item/data/FireworkExplosion.java new file mode 100644 index 000000000..bad976667 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/data/FireworkExplosion.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.data; + +import it.unimi.dsi.fastutil.ints.IntList; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +public record FireworkExplosion(Shape shape, IntList colors, IntList fadeColors, boolean hasTrail, boolean hasTwinkle) { + + public enum Shape { + SMALL_BALL(0, "small_ball"), + LARGE_BALL(1, "large_ball"), + STAR(2, "star"), + CREEPER(3, "creeper"), + BURST(4, "burst"); + + private final int id; + private final String name; + + Shape(int id, String name) { + this.id = id; + this.name = name; + } + + public int id() { + return id; + } + + @NotNull + public String getName() { + return name; + } + + private static final Shape[] BY_ID = values(); + private static final Map BY_NAME = new HashMap<>(); + + static { + for (Shape shape : BY_ID) { + BY_NAME.put(shape.getName(), shape); + BY_NAME.put(shape.name, shape); + } + } + + public static Shape byName(String name) { + return BY_NAME.get(name); + } + + public static Shape byId(int id) { + return BY_ID[id]; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/JukeboxPlayable.java b/core/src/main/java/net/momirealms/craftengine/core/item/data/JukeboxPlayable.java similarity index 58% rename from core/src/main/java/net/momirealms/craftengine/core/item/JukeboxPlayable.java rename to core/src/main/java/net/momirealms/craftengine/core/item/data/JukeboxPlayable.java index cfa87b8dd..12974eb0d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/JukeboxPlayable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/data/JukeboxPlayable.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.item; +package net.momirealms.craftengine.core.item.data; public record JukeboxPlayable(String song, boolean showInToolTip) { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Trim.java b/core/src/main/java/net/momirealms/craftengine/core/item/data/Trim.java similarity index 52% rename from core/src/main/java/net/momirealms/craftengine/core/item/Trim.java rename to core/src/main/java/net/momirealms/craftengine/core/item/data/Trim.java index 4832e81fe..a1e9d2e6f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Trim.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/data/Trim.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.item; +package net.momirealms.craftengine.core.item.data; public record Trim(String pattern, String material) { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java index 5c617a814..baf4e6caf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.*; +import net.momirealms.craftengine.core.item.data.Enchantment; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java index 2513d6f3a..6ccd1ec12 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.item.JukeboxPlayable; +import net.momirealms.craftengine.core.item.data.JukeboxPlayable; public class JukeboxSongModifier implements ItemDataModifier { private final JukeboxPlayable song; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java index 99ac6a9df..a86adda9b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.*; +import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java index ddca1c41d..734322c73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.loot.function; -import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.data.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java index 0be266bd5..a27774af1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; -import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.data.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java index 780643a19..a53ebe386 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; -import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.data.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; diff --git a/gradle.properties b/gradle.properties index 3d48e0dba..f29b46424 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.58.5 +project_version=0.0.59 config_version=40 lang_version=21 project_group=net.momirealms