From f13aab01c8719144ea5723b4604367b0e728b0b3 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 07:09:42 -0800 Subject: [PATCH 1/9] build.gradle.kts - update Hytale to pre-release --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index f1bb078..0636e48 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ java.sourceCompatibility = JavaVersion.VERSION_25 group = "com.github.SkriptDev" val projectVersion = "1.3.0" -val hytaleVersion = "2026.02.19-1a311a592" +val hytaleVersion = "2026.03.05-9fdc5985d" // You can find Hytale versions on their maven repo: // https://maven.hytale.com/release/com/hypixel/hytale/Server/maven-metadata.xml // https://maven.hytale.com/pre-release/com/hypixel/hytale/Server/maven-metadata.xml From 6d60e6a27ee7b5ab6fb40d192e7693d000c9692c Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 08:34:08 -0800 Subject: [PATCH 2/9] EvtPlayerSetupConnect - switch to message --- .../events/player/EvtPlayerSetupConnect.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerSetupConnect.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerSetupConnect.java index f75152e..b46f95c 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerSetupConnect.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerSetupConnect.java @@ -4,7 +4,9 @@ import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; import com.github.skriptdev.skript.plugin.HySk; import com.hypixel.hytale.event.EventRegistration; +import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.event.events.player.PlayerSetupConnectEvent; +import com.hypixel.hytale.server.core.util.MessageUtil; import io.github.syst3ms.skriptparser.lang.Expression; import io.github.syst3ms.skriptparser.lang.TriggerContext; import io.github.syst3ms.skriptparser.lang.TriggerMap; @@ -28,8 +30,10 @@ public static void register(SkriptRegistration reg) { "name", PlayerSetupConnectContext::getUsername); reg.addSingleContextValue(PlayerSetupConnectContext.class, UUID.class, "uuid", PlayerSetupConnectContext::getUuid); - reg.addSingleContextValue(PlayerSetupConnectContext.class, String.class, + reg.addSingleContextValue(PlayerSetupConnectContext.class, Message.class, "reason", PlayerSetupConnectContext::getReason); + reg.addSingleContextValue(PlayerSetupConnectContext.class, String.class, + "reason-string", PlayerSetupConnectContext::getReasonString); } private static EventRegistration LISTENER; @@ -66,10 +70,14 @@ public UUID getUuid() { return this.event.getUuid(); } - public String getReason() { + public Message getReason() { return this.event.getReason(); } + public String getReasonString() { + return MessageUtil.toAnsiString(this.event.getReason()).toAnsi(); + } + @Override public boolean isCancelled() { return this.event.isCancelled(); From f22b9a35a2d3e77250694a8cfa33074a8c332d5e Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 08:36:00 -0800 Subject: [PATCH 3/9] EffKick - switch to message --- .../elements/effects/player/EffKick.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffKick.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffKick.java index e32723b..61e20e5 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffKick.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffKick.java @@ -1,5 +1,6 @@ package com.github.skriptdev.skript.plugin.elements.effects.player; +import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.entity.entities.Player; import com.hypixel.hytale.server.core.universe.PlayerRef; import io.github.syst3ms.skriptparser.lang.Effect; @@ -15,7 +16,7 @@ public class EffKick extends Effect { public static void register(SkriptRegistration registration) { registration.newEffect(EffKick.class, "kick %players/playerrefs%", - "kick %players/playerrefs% (for reason|due to|because) %string%") + "kick %players/playerrefs% (for reason|due to|because) %string/message%") .name("Kick Player") .description("Kicks the specified players with an optional reason.") .examples("kick all players due to \"Cheating!\"", @@ -26,24 +27,30 @@ public static void register(SkriptRegistration registration) { } private Expression players; - private Expression reason; + private Expression reason; - @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { this.players = expressions[0]; if (matchedPattern == 1) { - this.reason = (Expression) expressions[1]; + this.reason = expressions[1]; } return true; } @Override protected void execute(@NotNull TriggerContext ctx) { - String reason = "You were kicked."; + Message reason = Message.raw("You were kicked."); if (this.reason != null) { - Optional single = this.reason.getSingle(ctx); - if (single.isPresent()) reason = single.get(); + Optional single = this.reason.getSingle(ctx); + if (single.isPresent()) { + Object o = single.get(); + if (o instanceof Message message) { + reason = message; + } else if (o instanceof String s) { + reason = Message.raw(s); + } + } } for (Object o : this.players.getArray(ctx)) { @@ -58,7 +65,7 @@ public String toString(@NotNull TriggerContext ctx, boolean debug) { } @SuppressWarnings("removal") - public static void kick(Object player, String reason) { + public static void kick(Object player, Message reason) { if (player instanceof PlayerRef ref) { ref.getPacketHandler().disconnect(reason); } else if (player instanceof Player p) { From 7404367608e81f1fb5f61be1c2664bc186e611e7 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 08:37:09 -0800 Subject: [PATCH 4/9] EffBan - switch to message for kick --- .../skript/plugin/elements/effects/player/EffBan.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffBan.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffBan.java index d164f8d..672710f 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffBan.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffBan.java @@ -2,6 +2,7 @@ import com.github.skriptdev.skript.api.utils.ReflectionUtils; import com.github.skriptdev.skript.api.utils.Utils; +import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.command.system.CommandSender; import com.hypixel.hytale.server.core.console.ConsoleSender; import com.hypixel.hytale.server.core.entity.entities.Player; @@ -147,7 +148,7 @@ protected void execute(@NotNull TriggerContext ctx) { } bans.put(target, ban); - EffKick.kick(o, reason); + EffKick.kick(o, Message.raw(reason)); } // Put them all in at once From fadc52afc021e77af73b73f820d30f04c86ae986 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 08:55:08 -0800 Subject: [PATCH 5/9] Deprecate Inventory stuff --- .../expressions/item/ExprInventory.java | 6 +- .../item/ExprInventoryAmountOfItems.java | 3 +- .../expressions/item/ExprInventorySlot.java | 3 +- .../expressions/item/ExprInventorySlots.java | 3 +- .../expressions/item/ExprItemContainer.java | 102 ++++++++++++------ .../item/ExprItemsInInventory.java | 7 +- .../elements/functions/DefaultFunctions.java | 89 ++++++++------- .../plugin/elements/types/TypesItem.java | 4 +- 8 files changed, 133 insertions(+), 84 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java index c7ccd1d..1ec0505 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java @@ -12,6 +12,7 @@ import java.util.Optional; +@Deprecated(forRemoval = true, since = "INSERT VERSION") public class ExprInventory implements Expression { public static void register(SkriptRegistration registration) { @@ -19,7 +20,8 @@ public static void register(SkriptRegistration registration) { "inventory of %livingentity%") .name("Inventory") .description("Returns the inventory of a living entity.", - "An inventory can also be cleared.") + "An inventory can also be cleared.", + "**Deprecated as of `INSERT VERSION` and will be removed in the future.**") .examples("set {_inv} to inventory of player", "clear inventory of player") .since("1.0.0") @@ -31,6 +33,8 @@ public static void register(SkriptRegistration registration) { @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { + parseContext.getLogger().warn("'inventory of %livingentity%' has been deprecated. " + + "This may still work but will be removed in the future."); this.entity = (Expression) expressions[0]; return true; } diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventoryAmountOfItems.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventoryAmountOfItems.java index 7ed5224..a089adb 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventoryAmountOfItems.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventoryAmountOfItems.java @@ -22,7 +22,8 @@ public static void register(SkriptRegistration reg) { .description("Get the amount of a certain Item/ItemStack in an Inventory/ItemContainer.", "If you pass in an Item, it will compare the Item types of ItemStacks in the inventory.", "If you pass in an ItemStack, it will direct compare that the ItemStacks are the same " + - "(ie: same durability, max durability, metadata, etc), excluding stack size.") + "(ie: same durability, max durability, metadata, etc), excluding stack size.", + "**The inventory option has been deprecated and will be removed in a future version.**") .examples("set {_amount} to amount of ingredient_stick in inventory of player") .since("1.1.0") .register(); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlot.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlot.java index 8ba687e..69bfb98 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlot.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlot.java @@ -19,7 +19,8 @@ public static void register(SkriptRegistration reg) { "itemstack in slot %number% of %inventory/itemcontainer%") .name("Itemstack in Inventory Slot") .description("Get/set/delete the itemstack in a slot of an Inventory or ItemContainer.", - "When using Inventory, this will combine all ItemContainers in the inventory and grab from there.") + "When using Inventory, this will combine all ItemContainers in the inventory and grab from there.", + "**The inventory option has been deprecated and will be removed in a future version.**") .examples("set {_item} to itemstack in slot 3 of inventory of player", "delete itemstack in slot 3 of inventory of player", "delete itemstack in slot 2 of hotbar item container of inventory of player", diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlots.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlots.java index fbe6d48..e08705f 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlots.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventorySlots.java @@ -18,7 +18,8 @@ public static void register(SkriptRegistration reg) { reg.newExpression(ExprInventorySlots.class, Number.class, false, "slots (of|in) %inventory/itemcontainer%") .name("Inventory Slots") - .description("Returns all slots in an Inventory or ItemContainer as numbers.") + .description("Returns all slots in an Inventory or ItemContainer as numbers.", + "**The inventory option has been deprecated and will be removed in a future version.**") .examples("loop slots of inventory of player:", "loop slots of hotbar item container of inventory of player:") .since("1.0.0") diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemContainer.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemContainer.java index 3eb7082..1490f72 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemContainer.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemContainer.java @@ -1,8 +1,19 @@ package com.github.skriptdev.skript.plugin.elements.expressions.item; import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; +import com.hypixel.hytale.server.core.entity.LivingEntity; import com.hypixel.hytale.server.core.inventory.Inventory; +import com.hypixel.hytale.server.core.inventory.InventoryComponent; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Armor; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Backpack; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Hotbar; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Storage; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Tool; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Utility; import com.hypixel.hytale.server.core.inventory.container.ItemContainer; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import io.github.syst3ms.skriptparser.lang.Expression; import io.github.syst3ms.skriptparser.lang.TriggerContext; import io.github.syst3ms.skriptparser.parsing.ParseContext; @@ -14,53 +25,82 @@ public class ExprItemContainer implements Expression { public static void register(SkriptRegistration reg) { reg.newExpression(ExprItemContainer.class, ItemContainer.class, true, - "storage item container of %inventory%", - "armor item container of %inventory%", - "hot[ ]bar item container of %inventory%", - "utility item container of %inventory%", - "tools item container of %inventory%", - "backpack item container of %inventory%", - "combined everything item container of %inventory%", - "combined hotbar first item container of %inventory%", - "combined storage first item container of %inventory%", - "combined backpack storage hotbar item container of %inventory%") - .name("Item Container of Inventory") - .description("Returns different item containers of an inventory.", - "Theres also a few combined options (These are from Hytale).") + "storage [item] container of %inventory/livingentity%", + "armor [item] container of %inventory/livingentity%", + "hot[ ]bar [item] container of %inventory/livingentity%", + "utility [item] container of %inventory/livingentity%", + "tools [item] container of %inventory/livingentity%", + "backpack [item] container of %inventory/livingentity%", + "combined everything [item] container of %inventory/livingentity%", + "combined hotbar first [item] container of %inventory/livingentity%", + "combined storage first [item] container of %inventory/livingentity%", + "combined backpack storage hotbar [item] container of %inventory/livingentity%") + .name("Item Container of LivingEntity") + .description("Returns different item containers of an Inventory/LivingEntity.", + "Theres also a few combined options (These are from Hytale).", + "**The inventory option has been deprecated and will be removed in a future version.**") .since("1.0.0") .register(); } private int pattern; - private Expression inventory; + private Expression inventory; - @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { this.pattern = matchedPattern; - this.inventory = (Expression) expressions[0]; + this.inventory = expressions[0]; return true; } @Override public ItemContainer[] getValues(@NotNull TriggerContext ctx) { - Optional single = this.inventory.getSingle(ctx); + Optional single = this.inventory.getSingle(ctx); if (single.isEmpty()) return null; - Inventory inventory = single.get(); - ItemContainer container = switch (this.pattern) { - case 0 -> inventory.getStorage(); - case 1 -> inventory.getArmor(); - case 2 -> inventory.getHotbar(); - case 3 -> inventory.getUtility(); - case 4 -> inventory.getTools(); - case 5 -> inventory.getBackpack(); - case 6 -> inventory.getCombinedEverything(); - case 7 -> inventory.getCombinedHotbarFirst(); - case 8 -> inventory.getCombinedStorageFirst(); - case 9 -> inventory.getCombinedBackpackStorageHotbar(); - default -> null; - }; + Object object = single.get(); + + ItemContainer container = null; + if (object instanceof Inventory inventory) { + container = switch (this.pattern) { + case 0 -> inventory.getStorage(); + case 1 -> inventory.getArmor(); + case 2 -> inventory.getHotbar(); + case 3 -> inventory.getUtility(); + case 4 -> inventory.getTools(); + case 5 -> inventory.getBackpack(); + case 6 -> inventory.getCombinedEverything(); + case 7 -> inventory.getCombinedHotbarFirst(); + case 8 -> inventory.getCombinedStorageFirst(); + case 9 -> inventory.getCombinedBackpackStorageHotbar(); + default -> null; + }; + } else if (object instanceof LivingEntity livingEntity) { + Ref reference = livingEntity.getReference(); + if (reference == null) return null; + + Store store = reference.getStore(); + Object o = switch (this.pattern) { + case 0 -> store.getComponent(reference, Storage.getComponentType()); + case 1 -> store.getComponent(reference, Armor.getComponentType()); + case 2 -> store.getComponent(reference, Hotbar.getComponentType()); + case 3 -> store.getComponent(reference, Utility.getComponentType()); + case 4 -> store.getComponent(reference, Tool.getComponentType()); + case 5 -> store.getComponent(reference, Backpack.getComponentType()); + case 6 -> InventoryComponent.getCombined(store, reference, InventoryComponent.EVERYTHING); + case 7 -> InventoryComponent.getCombined(store, reference, InventoryComponent.HOTBAR_FIRST); + case 8 -> InventoryComponent.getCombined(store, reference, InventoryComponent.STORAGE_FIRST); + case 9 -> InventoryComponent.getCombined(store, reference, InventoryComponent.BACKPACK_STORAGE_HOTBAR); + default -> null; + }; + if (o instanceof InventoryComponent inventoryComponent) { + container = inventoryComponent.getInventory(); + } else if (o instanceof ItemContainer itemContainer) { + container = itemContainer; + } else { + return null; + } + } return new ItemContainer[]{container}; } diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemsInInventory.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemsInInventory.java index 5e7d6b6..d514bc8 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemsInInventory.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprItemsInInventory.java @@ -20,9 +20,10 @@ public static void register(SkriptRegistration reg) { reg.newExpression(ExprItemsInInventory.class, ItemStack.class, false, "itemstacks in %inventory/itemcontainer%") .name("Itemstacks in Inventory/ItemContainer") - .description("Returns all itemstacks in an Inventory or ItemContainer.") - .examples("set {_items::*} to itemstacks in inventory of player", - "loop itemstacks in inventory of player:") + .description("Returns all itemstacks in an Inventory or ItemContainer.", + "**The inventory option has been deprecated and will be removed in a future version.**") + .examples("set {_items::*} to itemstacks in combined everything container of player", + "loop itemstacks in storage item container of player:") .since("1.0.0") .register(); } diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/functions/DefaultFunctions.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/functions/DefaultFunctions.java index 136859e..728faa3 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/functions/DefaultFunctions.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/functions/DefaultFunctions.java @@ -7,8 +7,6 @@ import com.hypixel.hytale.math.vector.Vector3i; import com.hypixel.hytale.protocol.packets.worldmap.ContextMenuItem; import com.hypixel.hytale.server.core.asset.type.item.config.Item; -import com.hypixel.hytale.server.core.entity.LivingEntity; -import com.hypixel.hytale.server.core.inventory.Inventory; import com.hypixel.hytale.server.core.inventory.ItemStack; import com.hypixel.hytale.server.core.inventory.container.ItemContainer; import com.hypixel.hytale.server.core.inventory.container.SimpleItemContainer; @@ -117,49 +115,50 @@ private static void itemFunctions(SkriptRegistration reg) { .since("1.0.0") .register(); - reg.newJavaFunction("inventory", Inventory.class, true) - .parameter("storageCapacity", Number.class) - .parameter("armorCapacity", Number.class) - .parameter("hotbarCapacity", Number.class) - .parameter("utilityCapacity", Number.class) - .executeSingle(params -> { - short storage = (short) Math.max(((Number) params[0][0]).shortValue(), 0); - short armor = (short) Math.max(((Number) params[1][0]).shortValue(), 0); - short hotbar = (short) Math.max(((Number) params[2][0]).shortValue(), 0); - short utility = (short) Math.max(((Number) params[3][0]).shortValue(), 0); - Inventory inv = new Inventory(storage, armor, hotbar, utility, (short) 0); - // Unregister click listeners since there's no owner - inv.unregister(); - return inv; - }) - .name("Inventory") - .description("Create a new inventory with the given ItemContainer sizes.", - "This inventory will not have click events due to no owner.", - "See the `inventoryWithOwner` function for that.") - .since("1.1.0") - .register(); - - reg.newJavaFunction("inventoryWithOwner", Inventory.class, true) - .parameter("owner", LivingEntity.class) - .parameter("storageCapacity", Number.class) - .parameter("armorCapacity", Number.class) - .parameter("hotbarCapacity", Number.class) - .parameter("utilityCapacity", Number.class) - .executeSingle(params -> { - LivingEntity livingEntity = (LivingEntity) params[0][0]; - short storage = (short) Math.max(((Number) params[1][0]).shortValue(), 0); - short armor = (short) Math.max(((Number) params[2][0]).shortValue(), 0); - short hotbar = (short) Math.max(((Number) params[3][0]).shortValue(), 0); - short utility = (short) Math.max(((Number) params[4][0]).shortValue(), 0); - Inventory inv = new Inventory(storage, armor, hotbar, utility, (short) 0); - inv.setEntity(livingEntity); - return inv; - }) - .name("Inventory with Owner") - .description("Create a new inventory with the given ItemContainer capacities and an owner.", - "The owner is used for registered click events.") - .since("1.1.0") - .register(); + // Remove for now, may re-introduce something in the future +// reg.newJavaFunction("inventory", InventoryComponent.class, true) +// .parameter("storageCapacity", Number.class) +// .parameter("armorCapacity", Number.class) +// .parameter("hotbarCapacity", Number.class) +// .parameter("utilityCapacity", Number.class) +// .executeSingle(params -> { +// short storage = (short) Math.max(((Number) params[0][0]).shortValue(), 0); +// short armor = (short) Math.max(((Number) params[1][0]).shortValue(), 0); +// short hotbar = (short) Math.max(((Number) params[2][0]).shortValue(), 0); +// short utility = (short) Math.max(((Number) params[3][0]).shortValue(), 0); +// Inventory inv = new Inventory(storage, armor, hotbar, utility, (short) 0); +// // Unregister click listeners since there's no owner +// inv.unregister(); +// return inv; +// }) +// .name("Inventory") +// .description("Create a new inventory with the given ItemContainer sizes.", +// "This inventory will not have click events due to no owner.", +// "See the `inventoryWithOwner` function for that.") +// .since("1.1.0") +// .register(); +// +// reg.newJavaFunction("inventoryWithOwner", Inventory.class, true) +// .parameter("owner", LivingEntity.class) +// .parameter("storageCapacity", Number.class) +// .parameter("armorCapacity", Number.class) +// .parameter("hotbarCapacity", Number.class) +// .parameter("utilityCapacity", Number.class) +// .executeSingle(params -> { +// LivingEntity livingEntity = (LivingEntity) params[0][0]; +// short storage = (short) Math.max(((Number) params[1][0]).shortValue(), 0); +// short armor = (short) Math.max(((Number) params[2][0]).shortValue(), 0); +// short hotbar = (short) Math.max(((Number) params[3][0]).shortValue(), 0); +// short utility = (short) Math.max(((Number) params[4][0]).shortValue(), 0); +// Inventory inv = new Inventory(storage, armor, hotbar, utility, (short) 0); +// inv.setEntity(livingEntity); +// return inv; +// }) +// .name("Inventory with Owner") +// .description("Create a new inventory with the given ItemContainer capacities and an owner.", +// "The owner is used for registered click events.") +// .since("1.1.0") +// .register(); reg.newJavaFunction("itemContainer", ItemContainer.class, true) .parameter("capacity", Number.class) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesItem.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesItem.java index fa9e786..e9f6943 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesItem.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesItem.java @@ -27,7 +27,9 @@ static void register(SkriptRegistration reg) { // Please keep in alphabetical order reg.newType(Inventory.class, "inventory", "inventor@y@ies") .name("Inventory") - .description("Represents an inventory of an entity or block.") + .description("Represents an inventory of an entity or block.", + "**DEPRRECATED as of `INSERT VERSION` and will be removed in the future.**", + "Hytale no longer will be using Inventory.") .since("1.0.0") .toStringFunction(Inventory::toString) .serializer(new TypeSerializer<>() { From 76b77599c2c1c345f81cac9d22a6974f2331f36c Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 09:03:08 -0800 Subject: [PATCH 6/9] ExprInventory - decided to keep this, and just have it return an item container --- .../expressions/item/ExprInventory.java | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java index 1ec0505..f74aa44 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java @@ -1,8 +1,13 @@ package com.github.skriptdev.skript.plugin.elements.expressions.item; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; import com.hypixel.hytale.server.core.entity.LivingEntity; -import com.hypixel.hytale.server.core.inventory.Inventory; +import com.hypixel.hytale.server.core.inventory.InventoryComponent; import com.hypixel.hytale.server.core.inventory.ItemStack; +import com.hypixel.hytale.server.core.inventory.container.CombinedItemContainer; +import com.hypixel.hytale.server.core.inventory.container.ItemContainer; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import io.github.syst3ms.skriptparser.lang.Expression; import io.github.syst3ms.skriptparser.lang.TriggerContext; import io.github.syst3ms.skriptparser.parsing.ParseContext; @@ -10,20 +15,22 @@ import io.github.syst3ms.skriptparser.types.changers.ChangeMode; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; -@Deprecated(forRemoval = true, since = "INSERT VERSION") -public class ExprInventory implements Expression { +public class ExprInventory implements Expression { public static void register(SkriptRegistration registration) { - registration.newExpression(ExprInventory.class, Inventory.class, false, - "inventory of %livingentity%") - .name("Inventory") - .description("Returns the inventory of a living entity.", - "An inventory can also be cleared.", - "**Deprecated as of `INSERT VERSION` and will be removed in the future.**") + registration.newExpression(ExprInventory.class, ItemContainer.class, false, + "inventory of %livingentities%") + .name("Inventory of LivingEntity") + .description("While it is called \"inventory\" it will " + + "actually return the combined everything ItemContainer of a LivingEntity.", + "This is essentially a shortcut for the `combined everything item contatiner of` expression.") .examples("set {_inv} to inventory of player", - "clear inventory of player") + "clear inventory of player", + "add itemstack of ingredient_stick to inventory of player") .since("1.0.0") .register(); } @@ -40,11 +47,17 @@ public boolean init(Expression[] expressions, int matchedPattern, @NotNull Pa } @Override - public Inventory[] getValues(@NotNull TriggerContext ctx) { - Optional single = this.entity.getSingle(ctx); - if (single.isEmpty()) return null; - LivingEntity livingEntity = single.get(); - return new Inventory[]{livingEntity.getInventory()}; + public ItemContainer[] getValues(@NotNull TriggerContext ctx) { + List containers = new ArrayList<>(); + for (LivingEntity livingEntity : this.entity.getArray(ctx)) { + Ref reference = livingEntity.getReference(); + if (reference == null) continue; + + Store store = reference.getStore(); + CombinedItemContainer combined = InventoryComponent.getCombined(store, reference, InventoryComponent.EVERYTHING); + containers.add(combined); + } + return containers.toArray(new ItemContainer[0]); } @Override @@ -57,17 +70,17 @@ public Optional[]> acceptsChange(@NotNull ChangeMode mode) { @Override public void change(@NotNull TriggerContext ctx, @NotNull ChangeMode changeMode, Object @NotNull [] changeWith) { - Inventory[] toChange = getValues(ctx); + ItemContainer[] toChange = getValues(ctx); if (changeMode == ChangeMode.ADD) { - for (Inventory inventory : toChange) { + for (ItemContainer inventory : toChange) { for (Object o : changeWith) { if (o instanceof ItemStack itemStack) { - inventory.getCombinedEverything().addItemStack(itemStack); + inventory.addItemStack(itemStack); } } } } else if (changeMode == ChangeMode.DELETE) { - for (Inventory inventory : toChange) { + for (ItemContainer inventory : toChange) { inventory.clear(); } } From 97b3fff72955ea92e69c7ed354a6cc9406f9178d Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 09:27:40 -0800 Subject: [PATCH 7/9] ExprInventory - forgot to remove warning --- .../skript/plugin/elements/expressions/item/ExprInventory.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java index f74aa44..d38d844 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java @@ -40,8 +40,6 @@ public static void register(SkriptRegistration registration) { @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { - parseContext.getLogger().warn("'inventory of %livingentity%' has been deprecated. " + - "This may still work but will be removed in the future."); this.entity = (Expression) expressions[0]; return true; } From d405ae1be781221544a4e5995b71fa931026e5c5 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 10:10:24 -0800 Subject: [PATCH 8/9] ExprActiveSlot - more deprecation stuff --- .../expressions/entity/ExprActiveSlot.java | 56 +++++++++++++++---- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprActiveSlot.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprActiveSlot.java index 66cfed6..2af45d2 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprActiveSlot.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprActiveSlot.java @@ -1,8 +1,12 @@ package com.github.skriptdev.skript.plugin.elements.expressions.entity; +import com.github.skriptdev.skript.api.hytale.utils.EntityUtils; import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; import com.hypixel.hytale.server.core.entity.LivingEntity; -import com.hypixel.hytale.server.core.inventory.Inventory; +import com.hypixel.hytale.server.core.inventory.InventoryComponent; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Hotbar; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Tool; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Utility; import io.github.syst3ms.skriptparser.lang.Expression; import io.github.syst3ms.skriptparser.lang.TriggerContext; import io.github.syst3ms.skriptparser.parsing.ParseContext; @@ -41,13 +45,28 @@ public Number[] getValues(@NotNull TriggerContext ctx) { LivingEntity[] entityArray = this.entity.getArray(ctx); Byte[] s = new Byte[entityArray.length]; for (int i = 0; i < entityArray.length; i++) { - Inventory inventory = entityArray[i].getInventory(); + LivingEntity livingEntity = entityArray[i]; if (this.slot == 0) { - s[i] = inventory.getActiveHotbarSlot(); + Hotbar component = EntityUtils.getComponent(livingEntity, Hotbar.getComponentType()); + if (component != null) { + s[i] = component.getActiveSlot(); + } else { + s[i] = -1; + } } else if (this.slot == 1) { - s[i] = inventory.getActiveUtilitySlot(); + Utility component = EntityUtils.getComponent(livingEntity, Utility.getComponentType()); + if (component != null) { + s[i] = component.getActiveSlot(); + } else { + s[i] = -1; + } } else if (this.slot == 2) { - s[i] = inventory.getActiveToolsSlot(); + Tool component = EntityUtils.getComponent(livingEntity, Tool.getComponentType()); + if (component != null) { + s[i] = component.getActiveSlot(); + } else { + s[i] = -1; + } } } return s; @@ -68,17 +87,30 @@ public void change(@NotNull TriggerContext ctx, @NotNull ChangeMode changeMode, for (LivingEntity entity : this.entity.getArray(ctx)) { - Inventory inventory = entity.getInventory(); if (this.slot == 0) { - byte clamp = (byte) Math.clamp(slot, 0, Inventory.DEFAULT_HOTBAR_CAPACITY - 1); - inventory.setActiveHotbarSlot(clamp); + byte clamp = (byte) Math.clamp(slot, 0, InventoryComponent.DEFAULT_HOTBAR_CAPACITY - 1); + Hotbar component = EntityUtils.getComponent(entity, Hotbar.getComponentType()); + if (component != null) { + component.setActiveSlot(clamp); + component.markDirty(); + + } } else if (this.slot == 1) { - byte clamp = (byte) Math.clamp(slot, -1, Inventory.DEFAULT_UTILITY_CAPACITY - 1); - inventory.setActiveUtilitySlot(clamp); + byte clamp = (byte) Math.clamp(slot, -1, InventoryComponent.DEFAULT_UTILITY_CAPACITY - 1); + Utility component = EntityUtils.getComponent(entity, Utility.getComponentType()); + if (component != null) { + component.setActiveSlot(clamp); + component.markDirty(); + } } else if (this.slot == 2) { - byte clamp = (byte) Math.clamp(slot, -1, Inventory.DEFAULT_TOOLS_CAPACITY - 1); - inventory.setActiveToolsSlot(clamp); + byte clamp = (byte) Math.clamp(slot, -1, InventoryComponent.DEFAULT_TOOLS_CAPACITY - 1); + Tool component = EntityUtils.getComponent(entity, Tool.getComponentType()); + if (component != null) { + component.setActiveSlot(clamp); + component.markDirty(); + } } + entity.invalidateEquipmentNetwork(); } } From a9033655c2631b1fc70a5c1273f9865df893f20c Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 17:31:13 -0800 Subject: [PATCH 9/9] ExprInventory - change again --- .../expressions/item/ExprInventory.java | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java index d38d844..5822368 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/item/ExprInventory.java @@ -1,9 +1,16 @@ package com.github.skriptdev.skript.plugin.elements.expressions.item; +import com.github.skriptdev.skript.api.hytale.utils.EntityUtils; import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.component.Store; import com.hypixel.hytale.server.core.entity.LivingEntity; import com.hypixel.hytale.server.core.inventory.InventoryComponent; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Armor; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Backpack; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Hotbar; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Storage; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Tool; +import com.hypixel.hytale.server.core.inventory.InventoryComponent.Utility; import com.hypixel.hytale.server.core.inventory.ItemStack; import com.hypixel.hytale.server.core.inventory.container.CombinedItemContainer; import com.hypixel.hytale.server.core.inventory.container.ItemContainer; @@ -26,8 +33,9 @@ public static void register(SkriptRegistration registration) { "inventory of %livingentities%") .name("Inventory of LivingEntity") .description("While it is called \"inventory\" it will " + - "actually return the combined everything ItemContainer of a LivingEntity.", - "This is essentially a shortcut for the `combined everything item contatiner of` expression.") + "actually return the combined hotbar/storage ItemContainers of a LivingEntity.", + "This is essentially a shortcut for the `combined hotbar first item contatiner of` expression.", + "Clearing will clear all ItemContainers, not just the hotbar/storage.") .examples("set {_inv} to inventory of player", "clear inventory of player", "add itemstack of ingredient_stick to inventory of player") @@ -35,24 +43,24 @@ public static void register(SkriptRegistration registration) { .register(); } - private Expression entity; + private Expression entities; @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { - this.entity = (Expression) expressions[0]; + this.entities = (Expression) expressions[0]; return true; } @Override public ItemContainer[] getValues(@NotNull TriggerContext ctx) { List containers = new ArrayList<>(); - for (LivingEntity livingEntity : this.entity.getArray(ctx)) { - Ref reference = livingEntity.getReference(); - if (reference == null) continue; + for (LivingEntity livingEntity : this.entities.getArray(ctx)) { + Ref ref = livingEntity.getReference(); + if (ref == null) continue; - Store store = reference.getStore(); - CombinedItemContainer combined = InventoryComponent.getCombined(store, reference, InventoryComponent.EVERYTHING); + Store store = ref.getStore(); + CombinedItemContainer combined = InventoryComponent.getCombined(store, ref, InventoryComponent.HOTBAR_FIRST); containers.add(combined); } return containers.toArray(new ItemContainer[0]); @@ -70,16 +78,40 @@ public Optional[]> acceptsChange(@NotNull ChangeMode mode) { public void change(@NotNull TriggerContext ctx, @NotNull ChangeMode changeMode, Object @NotNull [] changeWith) { ItemContainer[] toChange = getValues(ctx); if (changeMode == ChangeMode.ADD) { - for (ItemContainer inventory : toChange) { + for (ItemContainer container : toChange) { for (Object o : changeWith) { if (o instanceof ItemStack itemStack) { - inventory.addItemStack(itemStack); + container.addItemStack(itemStack); } } } } else if (changeMode == ChangeMode.DELETE) { - for (ItemContainer inventory : toChange) { - inventory.clear(); + for (LivingEntity livingEntity : this.entities.getArray(ctx)) { + // Combined storage clearing is currently broken + Storage storage = EntityUtils.getComponent(livingEntity, Storage.getComponentType()); + if (storage != null) { + storage.getInventory().clear(); + } + Hotbar hotbar = EntityUtils.getComponent(livingEntity, Hotbar.getComponentType()); + if (hotbar != null) { + hotbar.getInventory().clear(); + } + Armor armor = EntityUtils.getComponent(livingEntity, Armor.getComponentType()); + if (armor != null) { + armor.getInventory().clear(); + } + Backpack backpack = EntityUtils.getComponent(livingEntity, Backpack.getComponentType()); + if (backpack != null) { + backpack.getInventory().clear(); + } + Utility utility = EntityUtils.getComponent(livingEntity, Utility.getComponentType()); + if (utility != null) { + utility.getInventory().clear(); + } + Tool tool = EntityUtils.getComponent(livingEntity, Tool.getComponentType()); + if (tool != null) { + tool.getInventory().clear(); + } } } } @@ -91,7 +123,7 @@ public boolean isSingle() { @Override public String toString(@NotNull TriggerContext ctx, boolean debug) { - return "inventory of " + this.entity.toString(ctx, debug); + return "inventory of " + this.entities.toString(ctx, debug); } }