diff --git a/src/main/java/com/mmodding/mmodding_lib/client/ClientPacketReceivers.java b/src/main/java/com/mmodding/mmodding_lib/client/ClientPacketReceivers.java index 0424a35..484d3d3 100644 --- a/src/main/java/com/mmodding/mmodding_lib/client/ClientPacketReceivers.java +++ b/src/main/java/com/mmodding/mmodding_lib/client/ClientPacketReceivers.java @@ -11,8 +11,9 @@ public class ClientPacketReceivers { public static void register() { - ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.CONFIGS, ((client, handler, buf, responseSender) -> ClientOperations.receiveConfigOnClient(buf))); - ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.GLINT_PACKS, ((client, handler, buf, responseSender) -> ClientOperations.receiveGlintPackOnClient(buf))); - ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.STELLAR_STATUS, (((client, handler, buf, responseSender) -> ClientOperations.receiveStellarStatusOnClient(handler, buf)))); + ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.LIVING_ENTITY_STUCK_ARROW_TYPES, (((client, handler, buf, sender) -> ClientOperations.receiveLivingEntityStuckArrowTypesToClient(client, buf)))); + ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.CONFIGS, ((client, handler, buf, sender) -> ClientOperations.receiveConfigOnClient(buf))); + ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.GLINT_PACKS, ((client, handler, buf, sender) -> ClientOperations.receiveGlintPackOnClient(buf))); + ClientPlayNetworking.registerGlobalReceiver(MModdingPackets.STELLAR_STATUS, (((client, handler, buf, sender) -> ClientOperations.receiveStellarStatusOnClient(handler, buf)))); } } diff --git a/src/main/java/com/mmodding/mmodding_lib/client/MModdingLibClient.java b/src/main/java/com/mmodding/mmodding_lib/client/MModdingLibClient.java index 8656588..436ff63 100644 --- a/src/main/java/com/mmodding/mmodding_lib/client/MModdingLibClient.java +++ b/src/main/java/com/mmodding/mmodding_lib/client/MModdingLibClient.java @@ -4,7 +4,7 @@ import com.mmodding.mmodding_lib.library.base.AdvancedModContainer; import com.mmodding.mmodding_lib.library.base.MModdingClientModInitializer; import com.mmodding.mmodding_lib.library.config.Config; -import com.mmodding.mmodding_lib.library.events.client.MModdingClientInitializationEvents; +import com.mmodding.mmodding_lib.library.events.initialization.client.MModdingClientInitializationEvents; import org.apache.commons.lang3.StringUtils; import org.quiltmc.loader.api.ModContainer; import org.quiltmc.loader.api.QuiltLoader; diff --git a/src/main/java/com/mmodding/mmodding_lib/ducks/LivingEntityDuckInterface.java b/src/main/java/com/mmodding/mmodding_lib/ducks/LivingEntityDuckInterface.java new file mode 100644 index 0000000..fd563e2 --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/ducks/LivingEntityDuckInterface.java @@ -0,0 +1,14 @@ +package com.mmodding.mmodding_lib.ducks; + +import net.minecraft.util.Identifier; + +import java.util.Map; + +public interface LivingEntityDuckInterface { + + Map mmodding_lib$getStuckArrowTypes(); + + void mmodding_lib$setStuckArrowTypes(Map stuckArrowTypes); + + void mmodding_lib$putStuckArrowType(int index, Identifier arrowEntityId); +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/entities/data/MModdingTrackedDataHandlers.java b/src/main/java/com/mmodding/mmodding_lib/library/entities/data/MModdingTrackedDataHandlers.java new file mode 100644 index 0000000..64153bb --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/library/entities/data/MModdingTrackedDataHandlers.java @@ -0,0 +1,21 @@ +package com.mmodding.mmodding_lib.library.entities.data; + +import com.mmodding.mmodding_lib.library.utils.MModdingIdentifier; +import com.mmodding.mmodding_lib.library.utils.TrackedDataHandlerUtils; +import net.minecraft.entity.data.TrackedDataHandler; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.Identifier; +import org.quiltmc.qsl.entity.networking.api.tracked_data.QuiltTrackedDataHandlerRegistry; + +import java.util.List; + +public class MModdingTrackedDataHandlers { + + public static final TrackedDataHandler> STRING_LIST = TrackedDataHandlerUtils.createTrackedDataListHandler(PacketByteBuf::writeString, PacketByteBuf::readString); + public static final TrackedDataHandler> IDENTIFIER_LIST = TrackedDataHandlerUtils.createTrackedDataListHandler(PacketByteBuf::writeIdentifier, PacketByteBuf::readIdentifier); + + static { + QuiltTrackedDataHandlerRegistry.register(new MModdingIdentifier("string_list"), MModdingTrackedDataHandlers.STRING_LIST); + QuiltTrackedDataHandlerRegistry.register(new MModdingIdentifier("identifier_list"), MModdingTrackedDataHandlers.IDENTIFIER_LIST); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/client/MModdingClientInitializationEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/initialization/client/MModdingClientInitializationEvents.java similarity index 92% rename from src/main/java/com/mmodding/mmodding_lib/library/events/client/MModdingClientInitializationEvents.java rename to src/main/java/com/mmodding/mmodding_lib/library/events/initialization/client/MModdingClientInitializationEvents.java index 64b5c17..e97cc55 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/events/client/MModdingClientInitializationEvents.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/initialization/client/MModdingClientInitializationEvents.java @@ -1,4 +1,4 @@ -package com.mmodding.mmodding_lib.library.events.client; +package com.mmodding.mmodding_lib.library.events.initialization.client; import com.mmodding.mmodding_lib.library.base.AdvancedModContainer; import org.quiltmc.loader.api.minecraft.ClientOnly; diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/server/MModdingServerInitializationEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/initialization/server/MModdingServerInitializationEvents.java similarity index 92% rename from src/main/java/com/mmodding/mmodding_lib/library/events/server/MModdingServerInitializationEvents.java rename to src/main/java/com/mmodding/mmodding_lib/library/events/initialization/server/MModdingServerInitializationEvents.java index 90ace8e..7632aac 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/events/server/MModdingServerInitializationEvents.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/initialization/server/MModdingServerInitializationEvents.java @@ -1,4 +1,4 @@ -package com.mmodding.mmodding_lib.library.events.server; +package com.mmodding.mmodding_lib.library.events.initialization.server; import com.mmodding.mmodding_lib.library.base.AdvancedModContainer; import org.quiltmc.loader.api.minecraft.DedicatedServerOnly; diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/networking/LivingEntityNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/LivingEntityNetworkingEvents.java new file mode 100644 index 0000000..fbf64ad --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/LivingEntityNetworkingEvents.java @@ -0,0 +1,34 @@ +package com.mmodding.mmodding_lib.library.events.networking; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; +import org.quiltmc.qsl.base.api.event.Event; + +import java.util.Map; + +public class LivingEntityNetworkingEvents { + + public static final Event BEFORE_STUCK_ARROW_TYPES = Event.create(BeforeStuckArrowTypes.class, callbacks -> (livingEntity, stuckArrowTypes) -> { + for (BeforeStuckArrowTypes callback : callbacks) { + callback.beforeStuckArrowTypesSent(livingEntity, stuckArrowTypes); + } + }); + + public static final Event AFTER_STUCK_ARROW_TYPES = Event.create(AfterStuckArrowTypes.class, callbacks -> (livingEntity, stuckArrowTypes) -> { + for (AfterStuckArrowTypes callback : callbacks) { + callback.afterStuckArrowTypesSent(livingEntity, stuckArrowTypes); + } + }); + + @FunctionalInterface + public interface BeforeStuckArrowTypes { + + void beforeStuckArrowTypesSent(LivingEntity livingEntity, Map stuckArrowTypes); + } + + @FunctionalInterface + public interface AfterStuckArrowTypes { + + void afterStuckArrowTypesSent(LivingEntity livingEntity, Map stuckArrowTypes); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/client/ClientConfigNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientConfigNetworkingEvents.java similarity index 92% rename from src/main/java/com/mmodding/mmodding_lib/library/events/client/ClientConfigNetworkingEvents.java rename to src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientConfigNetworkingEvents.java index 59ccfd5..8a97bac 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/events/client/ClientConfigNetworkingEvents.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientConfigNetworkingEvents.java @@ -1,4 +1,4 @@ -package com.mmodding.mmodding_lib.library.events.client; +package com.mmodding.mmodding_lib.library.events.networking.client; import com.mmodding.mmodding_lib.library.config.StaticConfig; import org.quiltmc.loader.api.minecraft.ClientOnly; diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/client/ClientGlintPackNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientGlintPackNetworkingEvents.java similarity index 93% rename from src/main/java/com/mmodding/mmodding_lib/library/events/client/ClientGlintPackNetworkingEvents.java rename to src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientGlintPackNetworkingEvents.java index fd39ead..8b45c7f 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/events/client/ClientGlintPackNetworkingEvents.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientGlintPackNetworkingEvents.java @@ -1,4 +1,4 @@ -package com.mmodding.mmodding_lib.library.events.client; +package com.mmodding.mmodding_lib.library.events.networking.client; import com.mmodding.mmodding_lib.library.glint.client.GlintPack; import net.minecraft.item.Item; diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientLivingEntityNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientLivingEntityNetworkingEvents.java new file mode 100644 index 0000000..6af8bef --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientLivingEntityNetworkingEvents.java @@ -0,0 +1,36 @@ +package com.mmodding.mmodding_lib.library.events.networking.client; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; +import org.quiltmc.loader.api.minecraft.ClientOnly; +import org.quiltmc.qsl.base.api.event.Event; + +import java.util.Map; + +@ClientOnly +public class ClientLivingEntityNetworkingEvents { + + public static final Event BEFORE_STUCK_ARROW_TYPES = Event.create(BeforeStuckArrowTypes.class, callbacks -> (livingEntity, stuckArrowTypes) -> { + for (BeforeStuckArrowTypes callback : callbacks) { + callback.beforeStuckArrowTypesReceived(livingEntity, stuckArrowTypes); + } + }); + + public static final Event AFTER_STUCK_ARROW_TYPES = Event.create(AfterStuckArrowTypes.class, callbacks -> (livingEntity, stuckArrowTypes) -> { + for (AfterStuckArrowTypes callback : callbacks) { + callback.afterStuckArrowTypesReceived(livingEntity, stuckArrowTypes); + } + }); + + @FunctionalInterface + public interface BeforeStuckArrowTypes { + + void beforeStuckArrowTypesReceived(LivingEntity livingEntity, Map stuckArrowTypes); + } + + @FunctionalInterface + public interface AfterStuckArrowTypes { + + void afterStuckArrowTypesReceived(LivingEntity livingEntity, Map stuckArrowTypes); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientStellarStatusNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientStellarStatusNetworkingEvents.java new file mode 100644 index 0000000..3b1278c --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/client/ClientStellarStatusNetworkingEvents.java @@ -0,0 +1,36 @@ +package com.mmodding.mmodding_lib.library.events.networking.client; + +import com.mmodding.mmodding_lib.library.stellar.client.ClientStellarStatus; +import net.minecraft.util.Identifier; +import org.quiltmc.loader.api.minecraft.ClientOnly; +import org.quiltmc.qsl.base.api.event.Event; + +@ClientOnly +public class ClientStellarStatusNetworkingEvents { + + public static final Event BEFORE = Event.create(Before.class, callbacks -> (identifier, status) -> { + for (Before callback : callbacks) { + callback.beforeStellarStatusReceived(identifier, status); + } + }); + + public static final Event AFTER = Event.create(After.class, callbacks -> (identifier, status) -> { + for (After callback : callbacks) { + callback.afterStellarStatusReceived(identifier, status); + } + }); + + @ClientOnly + @FunctionalInterface + public interface Before { + + void beforeStellarStatusReceived(Identifier identifier, ClientStellarStatus status); + } + + @ClientOnly + @FunctionalInterface + public interface After { + + void afterStellarStatusReceived(Identifier identifier, ClientStellarStatus status); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/server/ServerConfigNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerConfigNetworkingEvents.java similarity index 95% rename from src/main/java/com/mmodding/mmodding_lib/library/events/server/ServerConfigNetworkingEvents.java rename to src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerConfigNetworkingEvents.java index 1dfe411..8db4821 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/events/server/ServerConfigNetworkingEvents.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerConfigNetworkingEvents.java @@ -1,4 +1,4 @@ -package com.mmodding.mmodding_lib.library.events.server; +package com.mmodding.mmodding_lib.library.events.networking.server; import com.mmodding.mmodding_lib.library.config.Config; import org.quiltmc.loader.api.minecraft.DedicatedServerOnly; diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/server/ServerGlintPackNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerGlintPackNetworkingEvents.java similarity index 96% rename from src/main/java/com/mmodding/mmodding_lib/library/events/server/ServerGlintPackNetworkingEvents.java rename to src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerGlintPackNetworkingEvents.java index d2e6de2..145f9ff 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/events/server/ServerGlintPackNetworkingEvents.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerGlintPackNetworkingEvents.java @@ -1,4 +1,4 @@ -package com.mmodding.mmodding_lib.library.events.server; +package com.mmodding.mmodding_lib.library.events.networking.server; import com.mmodding.mmodding_lib.library.glint.GlintPackView; import net.minecraft.item.Item; diff --git a/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerStellarStatusNetworkingEvents.java b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerStellarStatusNetworkingEvents.java new file mode 100644 index 0000000..45a19ac --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/library/events/networking/server/ServerStellarStatusNetworkingEvents.java @@ -0,0 +1,64 @@ +package com.mmodding.mmodding_lib.library.events.networking.server; + +import com.mmodding.mmodding_lib.library.stellar.StellarStatus; +import net.minecraft.util.Identifier; +import org.quiltmc.loader.api.minecraft.DedicatedServerOnly; +import org.quiltmc.qsl.base.api.event.Event; + +import java.util.Map; + +@DedicatedServerOnly +public class ServerStellarStatusNetworkingEvents { + + public static final Event BEFORE = Event.create(Before.class, callbacks -> (identifier, status) -> { + for (Before callback : callbacks) { + callback.beforeStellarStatusSent(identifier, status); + } + }); + + public static final Event AFTER = Event.create(After.class, callbacks -> (identifier, status) -> { + for (After callback : callbacks) { + callback.afterStellarStatusSent(identifier, status); + } + }); + + public static final Event BEFORE_ALL = Event.create(BeforeAll.class, callbacks -> stellarStatus -> { + for (BeforeAll callback : callbacks) { + callback.beforeAllStellarStatusSent(stellarStatus); + } + }); + + public static final Event AFTER_ALL = Event.create(AfterAll.class, callbacks -> stellarStatus -> { + for (AfterAll callback : callbacks) { + callback.afterAllStellarStatusSent(stellarStatus); + } + }); + + @DedicatedServerOnly + @FunctionalInterface + public interface Before { + + void beforeStellarStatusSent(Identifier identifier, StellarStatus status); + } + + @DedicatedServerOnly + @FunctionalInterface + public interface After { + + void afterStellarStatusSent(Identifier identifier, StellarStatus status); + } + + @DedicatedServerOnly + @FunctionalInterface + public interface BeforeAll { + + void beforeAllStellarStatusSent(Map stellarStatus); + } + + @DedicatedServerOnly + @FunctionalInterface + public interface AfterAll { + + void afterAllStellarStatusSent(Map stellarStatus); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/utils/TrackedDataHandlerUtils.java b/src/main/java/com/mmodding/mmodding_lib/library/utils/TrackedDataHandlerUtils.java new file mode 100644 index 0000000..4c58bff --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/library/utils/TrackedDataHandlerUtils.java @@ -0,0 +1,76 @@ +package com.mmodding.mmodding_lib.library.utils; + +import net.minecraft.entity.data.TrackedDataHandler; +import net.minecraft.network.PacketByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public class TrackedDataHandlerUtils { + + public static TrackedDataHandler> createTrackedDataListHandler(WriteAction writeAction, ReadAction readAction) { + + return new TrackedDataHandler<>() { + + @Override + public void write(PacketByteBuf buf, List value) { + buf.writeVarInt(value.size()); + value.forEach(element -> writeAction.write(buf, element)); + } + + @Override + public List read(PacketByteBuf buf) { + int size = buf.readVarInt(); + List value = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + value.add(readAction.read(buf)); + } + return value; + } + + @Override + public List copy(List value) { + return new ArrayList<>(value); + } + }; + } + + public static TrackedDataHandler createTrackedDataHandler(WriteAction writeAction, ReadAction readAction, CopyAction copyAction) { + + return new TrackedDataHandler<>() { + + @Override + public void write(PacketByteBuf buf, T value) { + writeAction.write(buf, value); + } + + @Override + public T read(PacketByteBuf buf) { + return readAction.read(buf); + } + + @Override + public T copy(T value) { + return copyAction.copy(value); + } + }; + } + + @FunctionalInterface + public interface WriteAction { + + void write(PacketByteBuf buf, T value); + } + + @FunctionalInterface + public interface ReadAction { + + T read(PacketByteBuf buf); + } + + @FunctionalInterface + public interface CopyAction { + + T copy(T value); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/LivingEntityMixin.java b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/LivingEntityMixin.java index aff6417..5ba74f2 100644 --- a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/LivingEntityMixin.java +++ b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/LivingEntityMixin.java @@ -1,8 +1,66 @@ package com.mmodding.mmodding_lib.mixin.injectors; +import com.mmodding.mmodding_lib.ducks.LivingEntityDuckInterface; +import com.mmodding.mmodding_lib.networking.CommonOperations; import net.minecraft.entity.LivingEntity; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.HashMap; +import java.util.Map; @Mixin(LivingEntity.class) -public abstract class LivingEntityMixin extends EntityMixin { +public abstract class LivingEntityMixin extends EntityMixin implements LivingEntityDuckInterface { + + @Unique + private Map stuckArrowTypes = new HashMap<>(); + + @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;setStuckArrowCount(I)V")) + private void tick(CallbackInfo ci) { + this.deleteStuckArrowType(); + } + + @Override + public Map mmodding_lib$getStuckArrowTypes() { + return new HashMap<>(this.stuckArrowTypes); + } + + @Override + public void mmodding_lib$setStuckArrowTypes(Map stuckArrowTypes) { + this.stuckArrowTypes = stuckArrowTypes; + this.syncStuckArrowTypes(); + } + + @Override + public void mmodding_lib$putStuckArrowType(int index, Identifier arrowEntityId) { + this.stuckArrowTypes.put(index, arrowEntityId); + this.syncStuckArrowTypes(); + } + + @Unique + private void deleteStuckArrowType() { + Map oldStuckArrowTypes = this.mmodding_lib$getStuckArrowTypes(); + Map newStuckArrowTypes = new HashMap<>(); + int smallest = !oldStuckArrowTypes.isEmpty() ? Integer.MAX_VALUE : 0; + for (int current : oldStuckArrowTypes.keySet()) { + smallest = Math.min(smallest, current); + } + oldStuckArrowTypes.remove(smallest); + oldStuckArrowTypes.forEach((index, arrowEntityId) -> newStuckArrowTypes.put(index - 1, arrowEntityId)); + this.mmodding_lib$setStuckArrowTypes(newStuckArrowTypes); + } + + @Unique + private void syncStuckArrowTypes() { + if (!this.world.isClient()) { + this.world.getPlayers().forEach(playerEntity -> CommonOperations.sendLivingEntityStuckArrowTypesToClient( + (LivingEntity) (Object) this, this.stuckArrowTypes, (ServerPlayerEntity) playerEntity + )); + } + } } diff --git a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/PersistentProjectileEntityMixin.java b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/PersistentProjectileEntityMixin.java new file mode 100644 index 0000000..6657d3a --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/PersistentProjectileEntityMixin.java @@ -0,0 +1,28 @@ +package com.mmodding.mmodding_lib.mixin.injectors; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mmodding.mmodding_lib.ducks.LivingEntityDuckInterface; +import com.mmodding.mmodding_lib.library.entities.projectiles.StuckArrowDisplay; +import com.mmodding.mmodding_lib.library.utils.Self; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.projectile.PersistentProjectileEntity; +import net.minecraft.util.hit.EntityHitResult; +import net.minecraft.util.registry.Registry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(PersistentProjectileEntity.class) +public class PersistentProjectileEntityMixin implements Self { + + @Inject(method = "onEntityHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;setStuckArrowCount(I)V")) + private void onEntityHit(EntityHitResult entityHitResult, CallbackInfo ci, @Local LivingEntity livingEntity) { + if (this.getObject() instanceof StuckArrowDisplay) { + ((LivingEntityDuckInterface) livingEntity).mmodding_lib$putStuckArrowType( + livingEntity.getStuckArrowCount(), + Registry.ENTITY_TYPE.getId(this.getObject().getType()) + ); + } + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckArrowsFeatureRendererMixin.java b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckArrowsFeatureRendererMixin.java index 229612c..2960bfb 100644 --- a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckArrowsFeatureRendererMixin.java +++ b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckArrowsFeatureRendererMixin.java @@ -1,13 +1,17 @@ package com.mmodding.mmodding_lib.mixin.injectors.client; +import com.mmodding.mmodding_lib.ducks.LivingEntityDuckInterface; import com.mmodding.mmodding_lib.library.entities.projectiles.StuckArrowDisplay; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.feature.StuckArrowsFeatureRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity; +import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -15,8 +19,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Map; + @Mixin(StuckArrowsFeatureRenderer.class) -public class StuckArrowsFeatureRendererMixin { +public class StuckArrowsFeatureRendererMixin extends StuckObjectsFeatureRendererMixin { @Shadow @Final @@ -24,15 +30,22 @@ public class StuckArrowsFeatureRendererMixin { @Inject(method = "renderObject", at = @At(value = "HEAD"), cancellable = true) private void renderObject(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, Entity entity, float directionX, float directionY, float directionZ, float tickDelta, CallbackInfo ci) { - if (entity instanceof StuckArrowDisplay display) { - float f = MathHelper.sqrt(directionX * directionX + directionZ * directionZ); - PersistentProjectileEntity persistentProjectileEntity = display.getArrowInstance(entity.world, entity.getX(), entity.getY(), entity.getZ()); - persistentProjectileEntity.setYaw((float) Math.atan2(directionX, directionZ * 180.0f / Math.PI)); - persistentProjectileEntity.setPitch((float) Math.atan2(directionY, (f * 180.0f / Math.PI))); - persistentProjectileEntity.prevYaw = persistentProjectileEntity.getYaw(); - persistentProjectileEntity.prevPitch = persistentProjectileEntity.getPitch(); - this.dispatcher.render(persistentProjectileEntity, 0.0, 0.0, 0.0, 0.0F, tickDelta, matrices, vertexConsumers, light); - ci.cancel(); + if (entity instanceof LivingEntity livingEntity) { + Map map = ((LivingEntityDuckInterface) livingEntity).mmodding_lib$getStuckArrowTypes(); + Entity check = Registry.ENTITY_TYPE.get(map.get(this.currentIndex)).create(entity.world); + if (check != null) { + if (check instanceof StuckArrowDisplay display) { + float f = MathHelper.sqrt(directionX * directionX + directionZ * directionZ); + PersistentProjectileEntity persistentProjectileEntity = display.getArrowInstance(entity.world, entity.getX(), entity.getY(), entity.getZ()); + persistentProjectileEntity.setYaw((float) (Math.atan2(directionX, directionZ) * 180.0f / Math.PI)); + persistentProjectileEntity.setPitch((float) (Math.atan2(directionY, f) * 180.0f / Math.PI)); + persistentProjectileEntity.prevYaw = persistentProjectileEntity.getYaw(); + persistentProjectileEntity.prevPitch = persistentProjectileEntity.getPitch(); + this.dispatcher.render(persistentProjectileEntity, 0.0, 0.0, 0.0, 0.0f, tickDelta, matrices, vertexConsumers, light); + ci.cancel(); + } + check.remove(Entity.RemovalReason.DISCARDED); + } } } } diff --git a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckObjectsFeatureRendererMixin.java b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckObjectsFeatureRendererMixin.java new file mode 100644 index 0000000..3a3399c --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/client/StuckObjectsFeatureRendererMixin.java @@ -0,0 +1,25 @@ +package com.mmodding.mmodding_lib.mixin.injectors.client; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mmodding.mmodding_lib.ducks.LivingEntityDuckInterface; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.feature.StuckObjectsFeatureRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(StuckObjectsFeatureRenderer.class) +public class StuckObjectsFeatureRendererMixin { + + @Unique + protected int currentIndex; + + @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/feature/StuckObjectsFeatureRenderer;renderObject(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/Entity;FFFF)V")) + private void renderObject(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci, @Local(ordinal = 2) int n) { + this.currentIndex = n; + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/networking/CommonOperations.java b/src/main/java/com/mmodding/mmodding_lib/networking/CommonOperations.java new file mode 100644 index 0000000..89f8568 --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/networking/CommonOperations.java @@ -0,0 +1,27 @@ +package com.mmodding.mmodding_lib.networking; + +import com.mmodding.mmodding_lib.library.events.networking.LivingEntityNetworkingEvents; +import net.minecraft.entity.LivingEntity; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import org.quiltmc.qsl.networking.api.PacketByteBufs; +import org.quiltmc.qsl.networking.api.ServerPlayNetworking; + +import java.util.Map; + +public class CommonOperations { + + public static void sendLivingEntityStuckArrowTypesToClient(LivingEntity livingEntity, Map stuckArrowTypes, ServerPlayerEntity player) { + PacketByteBuf packet = PacketByteBufs.create(); + + packet.writeVarInt(livingEntity.getId()); + packet.writeMap(stuckArrowTypes, PacketByteBuf::writeVarInt, PacketByteBuf::writeIdentifier); + + LivingEntityNetworkingEvents.BEFORE_STUCK_ARROW_TYPES.invoker().beforeStuckArrowTypesSent(livingEntity, stuckArrowTypes); + + ServerPlayNetworking.send(player, MModdingPackets.LIVING_ENTITY_STUCK_ARROW_TYPES, packet); + + LivingEntityNetworkingEvents.AFTER_STUCK_ARROW_TYPES.invoker().afterStuckArrowTypesSent(livingEntity, stuckArrowTypes); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/networking/MModdingPackets.java b/src/main/java/com/mmodding/mmodding_lib/networking/MModdingPackets.java index f108533..df62af9 100644 --- a/src/main/java/com/mmodding/mmodding_lib/networking/MModdingPackets.java +++ b/src/main/java/com/mmodding/mmodding_lib/networking/MModdingPackets.java @@ -4,6 +4,8 @@ public class MModdingPackets { + public static final MModdingIdentifier LIVING_ENTITY_STUCK_ARROW_TYPES = new MModdingIdentifier("networking/entity/living/stuck_arrow_types"); + public static final MModdingIdentifier CONFIGS = new MModdingIdentifier("networking/configs"); public static final MModdingIdentifier GLINT_PACKS = new MModdingIdentifier("networking/glint_packs"); diff --git a/src/main/java/com/mmodding/mmodding_lib/networking/client/ClientOperations.java b/src/main/java/com/mmodding/mmodding_lib/networking/client/ClientOperations.java index 98587f2..8773a98 100644 --- a/src/main/java/com/mmodding/mmodding_lib/networking/client/ClientOperations.java +++ b/src/main/java/com/mmodding/mmodding_lib/networking/client/ClientOperations.java @@ -4,23 +4,45 @@ import com.mmodding.mmodding_lib.MModdingLib; import com.mmodding.mmodding_lib.client.ClientCaches; import com.mmodding.mmodding_lib.ducks.ClientStellarStatusDuckInterface; +import com.mmodding.mmodding_lib.ducks.LivingEntityDuckInterface; import com.mmodding.mmodding_lib.library.config.StaticConfig; +import com.mmodding.mmodding_lib.library.events.networking.client.ClientLivingEntityNetworkingEvents; +import com.mmodding.mmodding_lib.library.events.networking.client.ClientStellarStatusNetworkingEvents; import com.mmodding.mmodding_lib.library.glint.client.GlintPack; import com.mmodding.mmodding_lib.library.client.utils.MModdingClientGlobalMaps; import com.mmodding.mmodding_lib.library.config.ConfigObject; -import com.mmodding.mmodding_lib.library.events.client.ClientConfigNetworkingEvents; -import com.mmodding.mmodding_lib.library.events.client.ClientGlintPackNetworkingEvents; +import com.mmodding.mmodding_lib.library.events.networking.client.ClientConfigNetworkingEvents; +import com.mmodding.mmodding_lib.library.events.networking.client.ClientGlintPackNetworkingEvents; import com.mmodding.mmodding_lib.library.stellar.client.ClientStellarStatus; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; import net.minecraft.network.PacketByteBuf; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import org.quiltmc.loader.api.minecraft.ClientOnly; +import java.util.Map; + @ClientOnly public class ClientOperations { + public static void receiveLivingEntityStuckArrowTypesToClient(MinecraftClient client, PacketByteBuf packet) { + int entityId = packet.readVarInt(); + Map stuckArrowTypes = packet.readMap(PacketByteBuf::readVarInt, PacketByteBuf::readIdentifier); + + assert client.world != null; + LivingEntity livingEntity = (LivingEntity) client.world.getEntityById(entityId); + + ClientLivingEntityNetworkingEvents.BEFORE_STUCK_ARROW_TYPES.invoker().beforeStuckArrowTypesReceived(livingEntity, stuckArrowTypes); + + assert livingEntity != null; + ((LivingEntityDuckInterface) livingEntity).mmodding_lib$setStuckArrowTypes(stuckArrowTypes); + + ClientLivingEntityNetworkingEvents.AFTER_STUCK_ARROW_TYPES.invoker().afterStuckArrowTypesReceived(livingEntity, stuckArrowTypes); + } + public static void receiveConfigOnClient(PacketByteBuf packet) { String qualifier = packet.readString(); String content = packet.readString(); @@ -50,10 +72,12 @@ public static void receiveStellarStatusOnClient(ClientPlayNetworkHandler handler long currentTime = packet.readLong(); long totalTime = packet.readLong(); - // TODO : Before Event + ClientStellarStatus status = ClientStellarStatus.of(currentTime, totalTime); + + ClientStellarStatusNetworkingEvents.BEFORE.invoker().beforeStellarStatusReceived(identifier, status); ((ClientStellarStatusDuckInterface) handler.getWorld()).mmodding_lib$setStellarStatus(identifier, ClientStellarStatus.of(currentTime, totalTime)); - // TODO : After Event + ClientStellarStatusNetworkingEvents.AFTER.invoker().afterStellarStatusReceived(identifier, status); } } diff --git a/src/main/java/com/mmodding/mmodding_lib/networking/server/ServerOperations.java b/src/main/java/com/mmodding/mmodding_lib/networking/server/ServerOperations.java index e3ae75c..a596dfc 100644 --- a/src/main/java/com/mmodding/mmodding_lib/networking/server/ServerOperations.java +++ b/src/main/java/com/mmodding/mmodding_lib/networking/server/ServerOperations.java @@ -2,11 +2,12 @@ import com.mmodding.mmodding_lib.MModdingLib; import com.mmodding.mmodding_lib.ducks.ServerStellarStatusDuckInterface; +import com.mmodding.mmodding_lib.library.events.networking.server.ServerStellarStatusNetworkingEvents; import com.mmodding.mmodding_lib.library.glint.GlintPackView; import com.mmodding.mmodding_lib.library.config.Config; import com.mmodding.mmodding_lib.library.config.ConfigObject; -import com.mmodding.mmodding_lib.library.events.server.ServerConfigNetworkingEvents; -import com.mmodding.mmodding_lib.library.events.server.ServerGlintPackNetworkingEvents; +import com.mmodding.mmodding_lib.library.events.networking.server.ServerConfigNetworkingEvents; +import com.mmodding.mmodding_lib.library.events.networking.server.ServerGlintPackNetworkingEvents; import com.mmodding.mmodding_lib.library.stellar.StellarStatus; import com.mmodding.mmodding_lib.networking.MModdingPackets; import net.minecraft.item.Item; @@ -85,21 +86,21 @@ public static void sendStellarStatusToClient(Identifier identifier, StellarStatu packet.writeLong(status.getCurrentTime()); packet.writeLong(status.getFullTime()); - // TODO : Before Event + ServerStellarStatusNetworkingEvents.BEFORE.invoker().beforeStellarStatusSent(identifier, status); ServerPlayNetworking.send(player, MModdingPackets.STELLAR_STATUS, packet); - // TODO : After Event + ServerStellarStatusNetworkingEvents.AFTER.invoker().afterStellarStatusSent(identifier, status); } public static void sendAllStellarStatusToClient(ServerPlayerEntity player) { - // TODO : Before All Event + Map stellarStatus = new HashMap<>(((ServerStellarStatusDuckInterface) player.getWorld()).mmodding_lib$getAllStellarStatus()); - ((ServerStellarStatusDuckInterface) player.getWorld()).mmodding_lib$getAllStellarStatus().forEach((identifier, stellarStatus) -> { - ServerOperations.sendStellarStatusToClient(identifier, stellarStatus, player); - }); + ServerStellarStatusNetworkingEvents.BEFORE_ALL.invoker().beforeAllStellarStatusSent(stellarStatus); + + stellarStatus.forEach((identifier, status) -> ServerOperations.sendStellarStatusToClient(identifier, status, player)); - // TODO : After All Event + ServerStellarStatusNetworkingEvents.AFTER_ALL.invoker().afterAllStellarStatusSent(stellarStatus); } } diff --git a/src/main/java/com/mmodding/mmodding_lib/server/MModdingLibServer.java b/src/main/java/com/mmodding/mmodding_lib/server/MModdingLibServer.java index 6184f0d..549c23b 100644 --- a/src/main/java/com/mmodding/mmodding_lib/server/MModdingLibServer.java +++ b/src/main/java/com/mmodding/mmodding_lib/server/MModdingLibServer.java @@ -4,7 +4,7 @@ import com.mmodding.mmodding_lib.library.base.AdvancedModContainer; import com.mmodding.mmodding_lib.library.base.MModdingServerModInitializer; import com.mmodding.mmodding_lib.library.config.Config; -import com.mmodding.mmodding_lib.library.events.server.MModdingServerInitializationEvents; +import com.mmodding.mmodding_lib.library.events.initialization.server.MModdingServerInitializationEvents; import org.apache.commons.lang3.StringUtils; import org.quiltmc.loader.api.ModContainer; import org.quiltmc.loader.api.QuiltLoader; diff --git a/src/main/resources/mmodding_lib.mixins.json b/src/main/resources/mmodding_lib.mixins.json index 6fdfad2..f108e27 100644 --- a/src/main/resources/mmodding_lib.mixins.json +++ b/src/main/resources/mmodding_lib.mixins.json @@ -64,6 +64,7 @@ "injectors.NoiseChunkGeneratorMixin", "injectors.PassiveEntityMixin", "injectors.PathAwareEntityMixin", + "injectors.PersistentProjectileEntityMixin", "injectors.PlayerEntityMixin", "injectors.PointedDripstoneBlockMixin", "injectors.PortalForcerMixin", @@ -99,6 +100,7 @@ "injectors.client.ItemRenderContextMixin", "injectors.client.ItemRendererMixin", "injectors.client.StuckArrowsFeatureRendererMixin", + "injectors.client.StuckObjectsFeatureRendererMixin", "injectors.client.TridentEntityRendererMixin", "injectors.client.WorldRendererMixin" ],