Skip to content
6 changes: 6 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,9 @@ publishing {
}
}
}

tasks.withType<GenerateModuleMetadata>().configureEach {
// This resolves the "implicit dependency" failure by forcing
// metadata generation to wait for the JAR task.
mustRunAfter(tasks.named("jar"))
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.github.skriptdev.skript.api.hytale;
package com.github.skriptdev.skript.api.hytale.objects;

import com.github.skriptdev.skript.api.hytale.utils.StoreUtils;
import com.hypixel.hytale.component.CommandBuffer;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.github.skriptdev.skript.api.hytale;
package com.github.skriptdev.skript.api.hytale.objects;

import com.github.skriptdev.skript.api.hytale.utils.LocationUtils;
import com.hypixel.hytale.math.vector.Location;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.github.skriptdev.skript.api.hytale.objects;

import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.protocol.packets.worldmap.ContextMenuItem;
import com.hypixel.hytale.protocol.packets.worldmap.MapMarker;
import com.hypixel.hytale.server.core.universe.world.worldmap.markers.user.UserMapMarker;

import java.util.ArrayList;
import java.util.List;

/**
* Override of {@link UserMapMarker}.
* <br>Hytale lacks y-coordinates in map markers, so this class adds them.
* <br>This class also adds context menu items.
*/
public class UserMapMarkerOverride extends UserMapMarker {

private float blockY;
private MapMarker cachedMarker;
private final List<ContextMenuItem> contextMenuItems = new ArrayList<>();

public void setPosition(Vector3d pos) {
this.blockY = (float) pos.getY();
super.setPosition((float) pos.getX(), (float) pos.getZ());
}

public void addContextMenuItem(ContextMenuItem contextMenuItem) {
this.contextMenuItems.add(contextMenuItem);
}

@Override
public MapMarker toProtocolMarker() {
if (this.cachedMarker == null) {
this.cachedMarker = super.toProtocolMarker();

assert this.cachedMarker.transform.position != null;
this.cachedMarker.transform.position.y = this.blockY;
if (!this.contextMenuItems.isEmpty()) {
this.cachedMarker.contextMenuItems = this.contextMenuItems.toArray(new ContextMenuItem[0]);
}
}

return this.cachedMarker;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import com.github.skriptdev.skript.plugin.HySk;
import com.hypixel.hytale.codec.ExtraInfo;
import com.hypixel.hytale.codec.util.RawJsonReader;
import com.hypixel.hytale.common.plugin.AuthorInfo;
import com.hypixel.hytale.common.plugin.PluginManifest;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;
import io.github.syst3ms.skriptparser.log.ErrorType;
import io.github.syst3ms.skriptparser.log.LogEntry;
import io.github.syst3ms.skriptparser.registration.SkriptAddon;

import java.io.File;
import java.io.IOException;
Expand All @@ -16,14 +18,24 @@
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class AddonLoader {

private final Map<String, HySkriptAddon> loadedAddons = new LinkedHashMap<>();
private int addonCount = 0;

public void loadAddons() {
loadAddonsFromFolder();
startAddons();
}

public void loadAddonsFromFolder() {
Utils.log("Loading addons...");
Path resolve = HySk.getInstance().getDataDirectory().resolve("addons");
Expand All @@ -47,13 +59,14 @@ public void loadAddonsFromFolder() {
.filter(File::isFile)
.filter(f -> f.getName().endsWith(".jar"))
.toList()) {
loadAddon(file);
loadAddonFromFile(file);
}
String plural = this.addonCount == 1 ? "" : "s";
Utils.log("Finished loading %s addon%s!", this.addonCount, plural);
}

private void loadAddon(File file) {
@SuppressWarnings("unchecked")
private void loadAddonFromFile(File file) {
try (JarFile jarFile = new JarFile(file)) {
JarEntry jarEntry = jarFile.getJarEntry("manifest.json");
if (jarEntry == null) {
Expand Down Expand Up @@ -81,33 +94,64 @@ private void loadAddon(File file) {
Utils.error("Main class not found in addon " + file.getName());
return;
}
Object mainClassIntance;
try {
mainClassIntance = externalClass.getDeclaredConstructor(String.class).newInstance(manifest.getName());
} catch (ReflectiveOperationException e) {
Utils.error("Failed to create instance of addon " + file.getName(), ErrorType.EXCEPTION);
if (!HySkriptAddon.class.isAssignableFrom(externalClass)) {
Utils.error("Main class is not an instance of HySkriptAddon in addon " + file.getName());
return;
}
if (mainClassIntance instanceof HySkriptAddon addon) {
addon.setManifest(manifest);
addon.start();
this.addonCount++;
// Finalize registration and logging
for (LogEntry logEntry : addon.getSkriptRegistration().register()) {
Utils.log(null, logEntry);
}
}
initializeAddon((Class<HySkriptAddon>) externalClass, manifest);

} catch (IOException e) {
Utils.error("Failed to load addon " + file.getName(), ErrorType.EXCEPTION);
}
}

public void shutdownAddons() {
for (SkriptAddon addon : SkriptAddon.getAddons()) {
if (addon instanceof HySkriptAddon hySkriptAddon) {
hySkriptAddon.shutdown();
private void startAddons() {
this.loadedAddons.forEach((_, addon) -> {
addon.start();
// Finalize registration and logging
for (LogEntry logEntry : addon.getSkriptRegistration().register()) {
Utils.log(null, logEntry);
}
});
}

public <T extends HySkriptAddon> T registerAddon(JavaPlugin plugin, Class<T> addonClass) {
PluginManifest pluginManifest = plugin.getManifest();
String name = pluginManifest.getName();
List<String> authors = new ArrayList<>();
for (AuthorInfo author : pluginManifest.getAuthors()) {
authors.add(author.getName());
}
Manifest addonManifest = new Manifest(null,
name,
pluginManifest.getVersion().toString(),
pluginManifest.getDescription(),
authors.toArray(new String[0]),
pluginManifest.getWebsite());

return initializeAddon(addonClass, addonManifest);
}

@SuppressWarnings("unchecked")
private <T extends HySkriptAddon> T initializeAddon(Class<T> externalClass, Manifest manifest) {
HySkriptAddon mainClassIntance;
String name = manifest.getName();
try {
mainClassIntance = externalClass.getDeclaredConstructor(String.class).newInstance(name);
} catch (ReflectiveOperationException e) {
Utils.error("Failed to create instance of addon " + name, ErrorType.EXCEPTION);
return null;
}
HySkriptAddon addon = mainClassIntance;
addon.setManifest(manifest);
this.loadedAddons.put(name, addon);
this.addonCount++;
return (T) addon;
}

public void shutdownAddons() {
this.loadedAddons.forEach((name, addon) -> addon.shutdown());
this.loadedAddons.clear();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ public class Manifest {
private String[] authors;
private String website;

private Manifest() {
}

public Manifest(String mainClass, String name, String version, String description, String[] authors, String website) {
this.mainClass = mainClass;
this.name = name;
this.version = version;
this.description = description;
this.authors = authors;
this.website = website;
}

@ApiStatus.Internal
public String getMainClass() {
return this.mainClass;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.skriptdev.skript.api.skript.event;

import com.github.skriptdev.skript.api.hytale.Block;
import com.github.skriptdev.skript.api.hytale.objects.Block;
import io.github.syst3ms.skriptparser.lang.TriggerContext;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.github.skriptdev.skript.api.skript.event;

import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.event.events.entity.LivingEntityInventoryChangeEvent;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
import com.hypixel.hytale.server.core.inventory.transaction.ActionType;
import com.hypixel.hytale.server.core.inventory.transaction.SlotTransaction;

public abstract class SlotTransactionContext implements PlayerContext {

private final LivingEntityInventoryChangeEvent event;
private final SlotTransaction slotTransaction;
private final Player player;

public SlotTransactionContext(LivingEntityInventoryChangeEvent event,
SlotTransaction slotTransaction, Player player) {
this.event = event;
this.slotTransaction = slotTransaction;
this.player = player;
}

public ItemContainer getContainer() {
return this.event.getItemContainer();
}

public ActionType getActionType() {
return this.slotTransaction.getAction();
}

public int getSlot() {
return this.slotTransaction.getSlot();
}

public ItemStack getSlotBefore() {
return this.slotTransaction.getSlotBefore();
}

public ItemStack getSlotAfter() {
return this.slotTransaction.getSlotAfter();
}

public ItemStack getOutput() {
return this.slotTransaction.getOutput();
}

@Override
public Player getPlayer() {
return this.player;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.util.HashMap;
import java.util.Map;

public class BstatsMetrics {
class BstatsMetrics {

static void registerMetrics(HySk plugin) {
Metrics metrics = new Metrics(plugin, 29735);
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/com/github/skriptdev/skript/plugin/HySk.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,17 @@ public HySk(@NotNull JavaPluginInit init) {
*/
@Override
protected void setup() {
// Unused - for now
// Setup early so addons can register from this
this.skript = new Skript(this);
}

/**
* @hidden
*/
@Override
protected void start() {
this.skript = new Skript(this);
// After addons load, startup Skript
this.skript.start();
new SkriptCommand(getCommandRegistry());
BstatsMetrics.registerMetrics(this);
}
Expand Down
Loading
Loading