diff --git a/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java b/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java index b659b3d..1832bb1 100644 --- a/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java +++ b/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java @@ -1,6 +1,7 @@ package tschipp.carryon.common.scripting; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; public class CarryOnOverride { @@ -46,16 +47,14 @@ public class CarryOnOverride private boolean isBlock; private boolean isEntity; - private final String path; + private String resourceLocation; public CarryOnOverride(String path) { - this.path = path; + this.resourceLocation = path; } - - public String getCommandInit() { return commandInit; @@ -131,7 +130,7 @@ public class CarryOnOverride { final int prime = 31; int result = 1; - result = prime * result + ((path == null) ? 0 : path.hashCode()); + result = prime * result + ((resourceLocation == null) ? 0 : resourceLocation.hashCode()); return result; } @@ -225,12 +224,12 @@ public class CarryOnOverride return false; if (isEntity != other.isEntity) return false; - if (path == null) + if (resourceLocation == null) { - if (other.path != null) + if (other.resourceLocation != null) return false; } - else if (!path.equals(other.path)) + else if (!resourceLocation.equals(other.resourceLocation)) return false; if (renderLeftArm != other.renderLeftArm) return false; @@ -620,6 +619,100 @@ public class CarryOnOverride this.commandPlace = commandPlace; } + public void serialize(PacketBuffer buf) + { + // BLOCKS + buf.writeCompoundTag(typeBlockTag); + buf.writeString(typeNameBlock); + buf.writeString(typeMaterial); + buf.writeString(typeHardness); + buf.writeString(typeResistance); + + // ENTITIES + buf.writeCompoundTag(typeEntityTag); + buf.writeString(typeNameEntity); + buf.writeString(typeHeight); + buf.writeString(typeWidth); + buf.writeString(typeHealth); + + // CONDITIONS + buf.writeString(conditionGamestage); + buf.writeString(conditionAchievement); + buf.writeString(conditionXp); + buf.writeString(conditionGamemode); + buf.writeString(conditionScoreboard); + buf.writeString(conditionPosition); + buf.writeString(conditionEffects); + + // RENDER + buf.writeString(renderNameBlock); + buf.writeString(renderNameEntity); + buf.writeCompoundTag(renderNBT); + buf.writeString(renderTranslation); + buf.writeString(renderRotation); + buf.writeString(renderscaled); + buf.writeString(renderRotationLeftArm); + buf.writeString(renderRotationRightArm); + buf.writeBoolean(renderLeftArm); + buf.writeBoolean(renderRightArm); + + //EFFECTS + buf.writeString(commandInit); + buf.writeString(commandLoop); + buf.writeString(commandPlace); + + buf.writeBoolean(isBlock); + buf.writeBoolean(isEntity); + buf.writeString(resourceLocation); + } + public static CarryOnOverride deserialize(PacketBuffer buf) + { + CarryOnOverride override = new CarryOnOverride(""); + override.typeBlockTag = buf.readCompoundTag(); + override.typeNameBlock = buf.readString(); + override.typeMaterial = buf.readString(); + override.typeHardness = buf.readString(); + override.typeResistance = buf.readString(); + + // ENTITIES + override.typeEntityTag = buf.readCompoundTag(); + override.typeNameEntity = buf.readString(); + override.typeHeight = buf.readString(); + override.typeWidth = buf.readString(); + override.typeHealth = buf.readString(); + + // CONDITIONS + override.conditionGamestage = buf.readString(); + override.conditionAchievement = buf.readString(); + override.conditionXp = buf.readString(); + override.conditionGamemode = buf.readString(); + override.conditionScoreboard = buf.readString(); + override.conditionPosition = buf.readString(); + override.conditionEffects = buf.readString(); + + // RENDER + override.renderNameBlock = buf.readString(); + override.renderNameEntity = buf.readString(); + override.renderNBT = buf.readCompoundTag(); + override.renderTranslation = buf.readString(); + override.renderRotation = buf.readString(); + override.renderscaled = buf.readString(); + override.renderRotationLeftArm = buf.readString(); + override.renderRotationRightArm = buf.readString(); + override.renderLeftArm = buf.readBoolean(); + override.renderRightArm = buf.readBoolean(); + + //EFFECTS + override.commandInit = buf.readString(); + override.commandLoop = buf.readString(); + override.commandPlace = buf.readString(); + + override.isBlock = buf.readBoolean(); + override.isEntity = buf.readBoolean(); + override.resourceLocation = buf.readString(); + + return override; + } } diff --git a/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java b/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java new file mode 100644 index 0000000..bfa44fb --- /dev/null +++ b/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java @@ -0,0 +1,52 @@ +package tschipp.carryon.common.scripting; + +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + +import net.minecraft.client.resources.JsonReloadListener; +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.common.thread.EffectiveSide; +import net.minecraftforge.fml.network.PacketDistributor; +import net.minecraftforge.fml.server.ServerLifecycleHooks; +import tschipp.carryon.CarryOn; +import tschipp.carryon.network.client.ScriptReloadPacket; + +@EventBusSubscriber(modid = CarryOn.MODID, bus = Bus.FORGE) +public class ScriptReloadListener extends JsonReloadListener +{ + private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create(); + + public ScriptReloadListener() + { + super(GSON, "carryon/scripts"); + } + + @Override + protected void apply(Map objects, IResourceManager manager, IProfiler profiler) + { + ScriptReader.OVERRIDES.clear(); + + objects.forEach((path, jsonObj) -> { + CarryOnOverride override = GSON.fromJson(jsonObj, CarryOnOverride.class); + ScriptReader.OVERRIDES.put(override.hashCode(), override); + }); + + if (EffectiveSide.get().isServer() && ServerLifecycleHooks.getCurrentServer() != null) + { + CarryOn.network.send(PacketDistributor.ALL.noArg(), new ScriptReloadPacket(ScriptReader.OVERRIDES.values())); + } + } + + public static void onDatapackRegister(AddReloadListenerEvent event) + { + + } + +} diff --git a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java b/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java index b8be2a2..7143586 100644 --- a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java +++ b/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java @@ -1,39 +1,58 @@ package tschipp.carryon.network.client; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.function.Supplier; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketBuffer; import net.minecraftforge.fml.network.NetworkEvent; -import tschipp.carryon.CarryOn; +import tschipp.carryon.common.scripting.CarryOnOverride; import tschipp.carryon.common.scripting.ScriptReader; public class ScriptReloadPacket { + private List overrides = new ArrayList(); public ScriptReloadPacket() { } - - public ScriptReloadPacket(ByteBuf buf) + + public ScriptReloadPacket(Collection collection) { + overrides.addAll(collection); } - public void toBytes(ByteBuf buf) + public ScriptReloadPacket(PacketBuffer buf) { + int size = buf.readInt(); + for(int i = 0; i < size; i++) + { + overrides.add(CarryOnOverride.deserialize(buf)); + } + } + + public void toBytes(PacketBuffer buf) + { + buf.writeInt(overrides.size()); + overrides.forEach(override -> override.serialize(buf)); } public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { + if (ctx.get().getDirection().getReceptionSide().isClient()) + { + ctx.get().enqueueWork(() -> { - PlayerEntity player = CarryOn.proxy.getPlayer(); + ScriptReader.OVERRIDES.clear(); + + overrides.forEach(override -> { + ScriptReader.OVERRIDES.put(override.hashCode(), override); + }); - if (player != null) - ScriptReader.reloadScripts(); - - ctx.get().setPacketHandled(true); - }); + ctx.get().setPacketHandled(true); + }); + } } }