Skip to content
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ java.sourceCompatibility = JavaVersion.VERSION_25

group = "com.github.SkriptDev"
val projectVersion = "1.4.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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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!\"",
Expand All @@ -26,24 +27,30 @@ public static void register(SkriptRegistration registration) {
}

private Expression<?> players;
private Expression<String> 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<String>) 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<? extends String> 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)) {
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Void, PlayerSetupConnectEvent> LISTENER;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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();
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,46 +1,69 @@
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.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.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;
import io.github.syst3ms.skriptparser.registration.SkriptRegistration;
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;

public class ExprInventory implements Expression<Inventory> {
public class ExprInventory implements Expression<ItemContainer> {

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.")
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 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")
"clear inventory of player",
"add itemstack of ingredient_stick to inventory of player")
.since("1.0.0")
.register();
}

private Expression<LivingEntity> entity;
private Expression<LivingEntity> entities;

@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, @NotNull ParseContext parseContext) {
this.entity = (Expression<LivingEntity>) expressions[0];
this.entities = (Expression<LivingEntity>) expressions[0];
return true;
}

@Override
public Inventory[] getValues(@NotNull TriggerContext ctx) {
Optional<? extends LivingEntity> 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<ItemContainer> containers = new ArrayList<>();
for (LivingEntity livingEntity : this.entities.getArray(ctx)) {
Ref<EntityStore> ref = livingEntity.getReference();
if (ref == null) continue;

Store<EntityStore> store = ref.getStore();
CombinedItemContainer combined = InventoryComponent.getCombined(store, ref, InventoryComponent.HOTBAR_FIRST);
containers.add(combined);
}
return containers.toArray(new ItemContainer[0]);
}

@Override
Expand All @@ -53,18 +76,42 @@ public Optional<Class<?>[]> 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 container : toChange) {
for (Object o : changeWith) {
if (o instanceof ItemStack itemStack) {
inventory.getCombinedEverything().addItemStack(itemStack);
container.addItemStack(itemStack);
}
}
}
} else if (changeMode == ChangeMode.DELETE) {
for (Inventory 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();
}
}
}
}
Expand All @@ -76,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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Loading
Loading