diff --git a/package.sh b/package.sh
new file mode 100644
index 0000000..9dd5845
--- /dev/null
+++ b/package.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+mvn package
+mv ./target/HytaleDemo-0.1.0.jar /home/tikaiz/.var/app/com.hypixel.HytaleLauncher/data/Hytale/UserData/Mods/
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 26bc55a..591a3a1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,9 +4,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- dev.hytalemodding
- ExamplePlugin
- 1.0-SNAPSHOT
+ com.tikaiz
+ HytaleDemo
+ 0.1.0
25
diff --git a/src/main/java/com/tikaiz/AddDefaultComponentTickSystem.java b/src/main/java/com/tikaiz/AddDefaultComponentTickSystem.java
new file mode 100644
index 0000000..f4687bb
--- /dev/null
+++ b/src/main/java/com/tikaiz/AddDefaultComponentTickSystem.java
@@ -0,0 +1,48 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.component.*;
+import com.hypixel.hytale.component.query.Query;
+import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
+import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+import java.util.logging.Level;
+
+public class AddDefaultComponentTickSystem extends EntityTickingSystem {
+ private final ComponentType customComponentType;
+
+ public AddDefaultComponentTickSystem(ComponentType poisonComponentType) {
+ this.customComponentType = poisonComponentType;
+ }
+ @Override
+ public void tick(float dt,
+ int i,
+ @NonNullDecl ArchetypeChunk archetypeChunk,
+ @NonNullDecl Store store,
+ @NonNullDecl CommandBuffer commandBuffer) {
+ Ref ref = archetypeChunk.getReferenceTo(i);
+ CustomComponent component = store.getComponent(ref, customComponentType);
+ if (component != null) {
+ return;
+ }
+ DisplayNameComponent displayNameComponent = store.getComponent(ref, DisplayNameComponent.getComponentType());
+ if (displayNameComponent == null || displayNameComponent.getDisplayName() == null) {
+// LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("Added Component to ref!");
+ return;
+ }
+ var displayName = displayNameComponent.getDisplayName().getAnsiMessage();
+ if (!"Bunny".equals(displayName)){
+ return;
+ }
+ commandBuffer.addComponent(ref, customComponentType, new CustomComponent());
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("Added Component to ref: " + displayName);
+ }
+
+ @NullableDecl
+ @Override
+ public Query getQuery() {
+ return Query.any();
+ }
+}
diff --git a/src/main/java/com/tikaiz/CustomComponent.java b/src/main/java/com/tikaiz/CustomComponent.java
new file mode 100644
index 0000000..063602c
--- /dev/null
+++ b/src/main/java/com/tikaiz/CustomComponent.java
@@ -0,0 +1,14 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.component.Component;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import javax.annotation.Nullable;
+
+public class CustomComponent implements Component {
+
+ @Nullable
+ @Override
+ public Component clone() {
+ return new CustomComponent();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/tikaiz/CustomComponentTickSystem.java b/src/main/java/com/tikaiz/CustomComponentTickSystem.java
new file mode 100644
index 0000000..db4b827
--- /dev/null
+++ b/src/main/java/com/tikaiz/CustomComponentTickSystem.java
@@ -0,0 +1,46 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.component.*;
+import com.hypixel.hytale.component.query.Query;
+import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
+import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+import java.util.logging.Level;
+
+public class CustomComponentTickSystem extends EntityTickingSystem {
+ private final ComponentType customComponentType;
+
+ public CustomComponentTickSystem(ComponentType poisonComponentType) {
+ this.customComponentType = poisonComponentType;
+ }
+ @Override
+ public void tick(float dt,
+ int i,
+ @NonNullDecl ArchetypeChunk archetypeChunk,
+ @NonNullDecl Store store,
+ @NonNullDecl CommandBuffer commandBuffer) {
+ Ref ref = archetypeChunk.getReferenceTo(i);
+ CustomComponent component = store.getComponent(ref, customComponentType);
+ if (component == null) {
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("This should never happen! ");
+ return;
+ }
+ DisplayNameComponent displayNameComponent = store.getComponent(ref, DisplayNameComponent.getComponentType());
+ if (displayNameComponent == null || displayNameComponent.getDisplayName() == null) {
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("new Event Ticking system called on : " + ref);
+ return;
+ }
+ var displayName = displayNameComponent.getDisplayName().getAnsiMessage();
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("new Event Ticking system called on : " + displayName);
+
+ }
+
+ @NullableDecl
+ @Override
+ public Query getQuery() {
+ return Query.and(customComponentType);
+ }
+}
diff --git a/src/main/java/com/tikaiz/DamageEventSystem.java b/src/main/java/com/tikaiz/DamageEventSystem.java
new file mode 100644
index 0000000..f103f1a
--- /dev/null
+++ b/src/main/java/com/tikaiz/DamageEventSystem.java
@@ -0,0 +1,73 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.component.ArchetypeChunk;
+import com.hypixel.hytale.component.CommandBuffer;
+import com.hypixel.hytale.component.Ref;
+import com.hypixel.hytale.component.Store;
+import com.hypixel.hytale.component.query.Query;
+import com.hypixel.hytale.component.system.EntityEventSystem;
+import com.hypixel.hytale.math.vector.Vector3d;
+import com.hypixel.hytale.math.vector.Vector3f;
+import com.hypixel.hytale.server.core.entity.UUIDComponent;
+import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
+import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
+import com.hypixel.hytale.server.core.modules.entity.damage.Damage;
+import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import com.hypixel.hytale.server.core.util.NotificationUtil;
+import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+import java.util.logging.Level;
+
+public class DamageEventSystem extends EntityEventSystem {
+ protected DamageEventSystem() {
+ super(Damage.class);
+ }
+
+ @Override
+ public void handle(int i,
+ @NonNullDecl ArchetypeChunk archetypeChunk,
+ @NonNullDecl Store store,
+ @NonNullDecl CommandBuffer commandBuffer,
+ @NonNullDecl Damage damage) {
+ Ref ref = archetypeChunk.getReferenceTo(i);
+ TransformComponent component = store.getComponent(ref, TransformComponent.getComponentType());
+ if (component == null) {
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("Transform was Null");
+ return;
+ }
+ var displayNameComponent = store.getComponent(ref, DisplayNameComponent.getComponentType());
+ if (displayNameComponent == null) {
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("Display name was Null");
+ return;
+ }
+
+ NotificationUtil.sendNotificationToUniverse(displayNameComponent.getDisplayName());
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("Display name: " + displayNameComponent.getDisplayName());
+
+ var uuidComponent = store.getComponent(ref, UUIDComponent.getComponentType());
+ if (uuidComponent == null) {
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("UUID was Null");
+ return;
+ }
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("UUID: " + uuidComponent.getUuid());
+ var transform = component.getTransform();
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("Transform: "+transform);
+
+ Vector3d addPos = new Vector3d((Math.random()*20)-10, 3, (Math.random()*20)-10);
+
+ var newPos = transform.getPosition().add(addPos);
+
+ Teleport teleportForPlayer = Teleport.createForPlayer(newPos, new Vector3f());
+ new Thread(()->{
+ store.addComponent(ref,Teleport.getComponentType(),teleportForPlayer);
+ }).start();
+ }
+
+ @NullableDecl
+ @Override
+ public Query getQuery() {
+ return Query.any();
+ }
+}
diff --git a/src/main/java/com/tikaiz/EntitySpawnEventSystem.java b/src/main/java/com/tikaiz/EntitySpawnEventSystem.java
new file mode 100644
index 0000000..b97235b
--- /dev/null
+++ b/src/main/java/com/tikaiz/EntitySpawnEventSystem.java
@@ -0,0 +1,94 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.component.ArchetypeChunk;
+import com.hypixel.hytale.component.CommandBuffer;
+import com.hypixel.hytale.component.Ref;
+import com.hypixel.hytale.component.Store;
+import com.hypixel.hytale.component.query.Query;
+import com.hypixel.hytale.component.system.EntityEventSystem;
+import com.hypixel.hytale.math.vector.Vector3d;
+import com.hypixel.hytale.math.vector.Vector3f;
+import com.hypixel.hytale.server.core.entity.UUIDComponent;
+import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
+import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
+import com.hypixel.hytale.server.core.modules.entity.damage.Damage;
+import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import com.hypixel.hytale.server.core.util.NotificationUtil;
+import com.hypixel.hytale.server.npc.AllNPCsLoadedEvent;
+import com.hypixel.hytale.server.spawning.LoadedNPCEvent;
+import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+import java.util.logging.Level;
+
+//public class EntitySpawnEventSystem extends EntityEventSystem {
+// protected EntitySpawnEventSystem() {
+// super(LoadedNPCEvent.class);
+// }
+//
+//// @Override
+//// public void handle(int i,
+//// @NonNullDecl ArchetypeChunk archetypeChunk,
+//// @NonNullDecl Store store,
+//// @NonNullDecl CommandBuffer commandBuffer,
+//// @NonNullDecl Damage damage) {
+//// Ref ref = archetypeChunk.getReferenceTo(i);
+//// TransformComponent component = store.getComponent(ref, TransformComponent.getComponentType());
+//// if (component == null) {
+//// LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("Transform was Null");
+//// return;
+//// }
+//// var displayNameComponent = store.getComponent(ref, DisplayNameComponent.getComponentType());
+//// if (displayNameComponent == null) {
+//// LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("Display name was Null");
+//// return;
+//// }
+////
+//// NotificationUtil.sendNotificationToUniverse(displayNameComponent.getDisplayName());
+//// LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("Display name: " + displayNameComponent.getDisplayName());
+////
+//// var uuidComponent = store.getComponent(ref, UUIDComponent.getComponentType());
+//// if (uuidComponent == null) {
+//// LoggerSingleton.getInstance().getHytaleLogger().at(Level.SEVERE).log("UUID was Null");
+//// return;
+//// }
+//// LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("UUID: " + uuidComponent.getUuid());
+//// var transform = component.getTransform();
+//// LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("Transform: "+transform);
+////
+//// Vector3d addPos = new Vector3d((Math.random()*20)-10, 3, (Math.random()*20)-10);
+////
+//// var newPos = transform.getPosition().add(addPos);
+////
+//// Teleport teleportForPlayer = Teleport.createForPlayer(newPos, new Vector3f());
+//// new Thread(()->{
+//// store.addComponent(ref,Teleport.getComponentType(),teleportForPlayer);
+//// }).start();
+//// }
+//
+// @NullableDecl
+// @Override
+// public Query getQuery() {
+// return Query.any();
+// }
+//
+//
+// @Override
+// public void handle(int i,
+// @NonNullDecl ArchetypeChunk archetypeChunk,
+// @NonNullDecl Store store,
+// @NonNullDecl CommandBuffer commandBuffer,
+// @NonNullDecl LoadedNPCEvent loadedNPCEvent) {
+// Ref ref = archetypeChunk.getReferenceTo(i);
+// var transformComponent = store.getComponent(ref, TransformComponent.getComponentType());
+// NotificationUtil.sendNotificationToUniverse(transformComponent != null ? transformComponent.getTransform().toString() : "null");
+// LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log(transformComponent != null ? transformComponent.getTransform().toString() : "null");
+// var displayNameComponent = store.getComponent(ref, DisplayNameComponent.getComponentType());
+// NotificationUtil.sendNotificationToUniverse(displayNameComponent != null ? displayNameComponent.getDisplayName() != null ? displayNameComponent.getDisplayName().getAnsiMessage() : "null" : "null");
+// LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log(displayNameComponent != null ? displayNameComponent.getDisplayName() != null ? displayNameComponent.getDisplayName().getAnsiMessage() : "null" : "null");
+//
+//// loadedNPCEvent.getBuilderInfo().getKeyName()
+//
+// }
+//}
diff --git a/src/main/java/com/tikaiz/HytaleDemo.java b/src/main/java/com/tikaiz/HytaleDemo.java
new file mode 100644
index 0000000..dbd9a7c
--- /dev/null
+++ b/src/main/java/com/tikaiz/HytaleDemo.java
@@ -0,0 +1,64 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.component.Ref;
+import com.hypixel.hytale.component.SystemType;
+import com.hypixel.hytale.component.query.Query;
+import com.hypixel.hytale.component.system.CancellableEcsEvent;
+import com.hypixel.hytale.component.system.EcsEvent;
+import com.hypixel.hytale.server.core.event.events.BootEvent;
+import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
+import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
+import com.hypixel.hytale.server.core.modules.entity.damage.Damage;
+import com.hypixel.hytale.server.core.plugin.JavaPlugin;
+import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
+import com.hypixel.hytale.server.core.universe.Universe;
+import com.hypixel.hytale.server.core.universe.world.World;
+import com.hypixel.hytale.server.core.universe.world.events.AllWorldsLoadedEvent;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import com.hypixel.hytale.server.core.util.NotificationUtil;
+import com.hypixel.hytale.server.npc.AllNPCsLoadedEvent;
+import com.hypixel.hytale.server.spawning.LoadedNPCEvent;
+import com.hypixel.hytale.server.spawning.assets.spawns.config.NPCSpawn;
+import com.tikaiz.commands.ExampleCommand;
+import jdk.jfr.EventType;
+
+import javax.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Queue;
+import java.util.logging.Level;
+
+public class HytaleDemo extends JavaPlugin {
+
+ public HytaleDemo(@Nonnull JavaPluginInit init) {
+ super(init);
+ LoggerSingleton.getInstance().setHytaleLogger(this.getLogger());
+ }
+
+ @Override
+ protected void setup() {
+ this.getCommandRegistry().registerCommand(new ExampleCommand());
+ this.getEntityStoreRegistry().registerSystem(new DamageEventSystem());
+ var type = this.getEntityStoreRegistry()
+ .registerComponent(CustomComponent.class, CustomComponent::new);
+ this.getEntityStoreRegistry().registerSystem(new AddDefaultComponentTickSystem(type));
+ this.getEntityStoreRegistry().registerSystem(new CustomComponentTickSystem(type));
+// var list = new ArrayList();
+ this.getEventRegistry().registerGlobal(AllWorldsLoadedEvent.class, (x)->{
+ LoggerSingleton.getInstance().getHytaleLogger().at(Level.INFO).log("World has loaded!");
+ });
+// Universe.get().getDefaultWorld().getEntityStore().getStore().fetch(new SystemType<>(), Query.any(),list);
+// EntityStore.REGISTRY.assertInStoreThread();
+// this.getEventRegistry().registerGlobal(LoadedNPCEvent.class, (x)->{
+// String id = x.getBuilderInfo().;
+// Arrays.stream(x.getNPCs()).forEach(x->x.getFlockDefinition().);
+// x.getAllNPCs().forEach((integer, builderInfo) -> {
+// builderInfo.
+// });
+// NotificationUtil.sendNotificationToUniverse(x.getBuilderInfo().getKeyName());
+// });
+// this.getEventRegistry().register(Damage.class,(x)->{
+// Damage.Source source = x.getSource();
+// });
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/tikaiz/LoggerSingleton.java b/src/main/java/com/tikaiz/LoggerSingleton.java
new file mode 100644
index 0000000..49e2968
--- /dev/null
+++ b/src/main/java/com/tikaiz/LoggerSingleton.java
@@ -0,0 +1,25 @@
+package com.tikaiz;
+
+import com.hypixel.hytale.logger.HytaleLogger;
+
+public class LoggerSingleton {
+ private HytaleLogger hytaleLogger;
+ private static LoggerSingleton instance;
+ public static LoggerSingleton getInstance() {
+ if (instance == null) {
+ instance = new LoggerSingleton();
+ }
+ return instance;
+ }
+
+ private LoggerSingleton() {
+ }
+
+ public HytaleLogger getHytaleLogger() {
+ return hytaleLogger;
+ }
+
+ public void setHytaleLogger(HytaleLogger hytaleLogger) {
+ this.hytaleLogger = hytaleLogger;
+ }
+}
diff --git a/src/main/java/com/tikaiz/commands/ExampleCommand.java b/src/main/java/com/tikaiz/commands/ExampleCommand.java
new file mode 100644
index 0000000..5026d18
--- /dev/null
+++ b/src/main/java/com/tikaiz/commands/ExampleCommand.java
@@ -0,0 +1,92 @@
+package com.tikaiz.commands;
+
+import com.hypixel.hytale.component.Ref;
+import com.hypixel.hytale.component.Store;
+import com.hypixel.hytale.component.query.Query;
+import com.hypixel.hytale.math.vector.Vector3d;
+import com.hypixel.hytale.math.vector.Vector3f;
+import com.hypixel.hytale.server.core.Message;
+import com.hypixel.hytale.server.core.command.system.CommandContext;
+import com.hypixel.hytale.server.core.command.system.arguments.system.DefaultArg;
+import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg;
+import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
+import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;
+import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
+import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
+import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
+import com.hypixel.hytale.server.core.modules.physics.component.PhysicsValues;
+import com.hypixel.hytale.server.core.universe.PlayerRef;
+import com.hypixel.hytale.server.core.universe.Universe;
+import com.hypixel.hytale.server.core.universe.world.World;
+import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
+import com.tikaiz.LoggerSingleton;
+
+import javax.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.logging.Level;
+
+public class ExampleCommand extends AbstractPlayerCommand {
+
+ public ExampleCommand() {
+ super("tel", "Super test command!");
+ }
+
+ DefaultArg> arg = this.withListDefaultArg("Pos", "Position", ArgTypes.DOUBLE,new ArrayList(),"Tell the Player the Position");
+
+ @Override
+ protected void execute(@Nonnull CommandContext commandContext,
+ @Nonnull Store store,
+ @Nonnull Ref ref,
+ @Nonnull PlayerRef playerRef,
+ @Nonnull World world) {
+ int size = arg.get(commandContext).size();
+ playerRef.sendMessage(Message.raw("Arg size: " + size));
+ if (!(size == 3 || size == 0)){
+
+ playerRef.sendMessage(Message.raw("Either specify 0 or 3 Arguments"));
+ return;
+ }
+
+
+ var transform = store.getComponent(ref, TransformComponent.getComponentType());
+ if (transform == null) return;
+ if (size == 0){
+ var pos = transform.getPosition();
+ playerRef.sendMessage(Message.raw("Player Position: " + pos));
+ return;
+ }
+ var x = arg.get(commandContext).get(0);
+ var y = arg.get(commandContext).get(1);
+ var z = arg.get(commandContext).get(2);
+
+ var newPos = new Vector3d(x,y,z);
+
+ Teleport teleportForPlayer = Teleport.createForPlayer(newPos, new Vector3f());
+ store.addComponent(ref,Teleport.getComponentType(),teleportForPlayer);
+// var results = new ArrayList