From bb35c94d12146ab2f90eb9e76b8d4235cf8c5ac3 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Sat, 18 Apr 2020 17:27:06 -0400 Subject: [PATCH] 1.0.26 Improve Teleportation Restrictor --- CHANGELOG.md | 3 ++ gradle.properties | 2 +- .../block/TeleportationRestrictorBlock.java | 2 ++ .../reliccraft/client/RelicCraftClient.java | 2 ++ .../reliccraft/mixin/MixinEntity.java | 33 +++++++++++++++++-- .../mixin/MixinServerPlayerEntity.java | 16 +++++++++ .../UpdateTeleportCooldownS2CPacket.java | 30 +++++++++++++++++ src/main/resources/reliccraft.mixins.json | 1 + 8 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/thebrokenrail/reliccraft/mixin/MixinServerPlayerEntity.java create mode 100644 src/main/java/com/thebrokenrail/reliccraft/packet/UpdateTeleportCooldownS2CPacket.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4721d8b..ccfdb6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +**1.0.26** +* Improve Teleportation Restrictor + **1.0.25** * Improve Teleportation Restrictor diff --git a/gradle.properties b/gradle.properties index f1e430e..5337bd6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs = -Xmx1G fabric_loader_version = 0.7.10+build.191 # Mod Properties - mod_version = 1.0.25 + mod_version = 1.0.26 maven_group = com.thebrokenrail archives_base_name = reliccraft diff --git a/src/main/java/com/thebrokenrail/reliccraft/block/TeleportationRestrictorBlock.java b/src/main/java/com/thebrokenrail/reliccraft/block/TeleportationRestrictorBlock.java index 2cc7f3e..c2d0e32 100644 --- a/src/main/java/com/thebrokenrail/reliccraft/block/TeleportationRestrictorBlock.java +++ b/src/main/java/com/thebrokenrail/reliccraft/block/TeleportationRestrictorBlock.java @@ -19,6 +19,8 @@ public class TeleportationRestrictorBlock extends AbstractDragonEggHolderBlock { boolean cannotTeleport(); void resetTeleportCooldown(); + + void setTeleportCooldown(byte cooldown); } public TeleportationRestrictorBlock() { diff --git a/src/main/java/com/thebrokenrail/reliccraft/client/RelicCraftClient.java b/src/main/java/com/thebrokenrail/reliccraft/client/RelicCraftClient.java index 5bfb94c..cc55f8a 100644 --- a/src/main/java/com/thebrokenrail/reliccraft/client/RelicCraftClient.java +++ b/src/main/java/com/thebrokenrail/reliccraft/client/RelicCraftClient.java @@ -3,6 +3,7 @@ package com.thebrokenrail.reliccraft.client; import com.thebrokenrail.reliccraft.RelicCraft; import com.thebrokenrail.reliccraft.client.entity.RelicEntityRenderer; import com.thebrokenrail.reliccraft.item.RelicItem; +import com.thebrokenrail.reliccraft.packet.UpdateTeleportCooldownS2CPacket; import com.thebrokenrail.reliccraft.packet.UpdateTimeDilationS2CPacket; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; @@ -56,5 +57,6 @@ public class RelicCraftClient implements ClientModInitializer { EntityRendererRegistry.INSTANCE.register(RelicCraft.RELIC_ENTITY, (entityRenderDispatcher, context) -> new RelicEntityRenderer(entityRenderDispatcher)); ClientSidePacketRegistryImpl.INSTANCE.register(new Identifier(RelicCraft.NAMESPACE, "update_time_dilation"), UpdateTimeDilationS2CPacket::handle); + ClientSidePacketRegistryImpl.INSTANCE.register(new Identifier(RelicCraft.NAMESPACE, "update_teleport_cooldown"), UpdateTeleportCooldownS2CPacket::handle); } } diff --git a/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinEntity.java b/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinEntity.java index 49da41c..50da2e4 100644 --- a/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinEntity.java +++ b/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinEntity.java @@ -2,7 +2,9 @@ package com.thebrokenrail.reliccraft.mixin; import com.thebrokenrail.reliccraft.block.TeleportationRestrictorBlock; import net.minecraft.entity.Entity; +import net.minecraft.nbt.CompoundTag; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,22 +13,38 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @SuppressWarnings("unused") @Mixin(Entity.class) -public class MixinEntity implements TeleportationRestrictorBlock.TeleportingEntity { +public abstract class MixinEntity implements TeleportationRestrictorBlock.TeleportingEntity { + @Shadow + protected boolean inNetherPortal; + @Unique - private int teleportCooldown = 0; + protected byte teleportCooldown = 2; @Override public void resetTeleportCooldown() { teleportCooldown = 4; } + @Override + public void setTeleportCooldown(byte teleportCooldown) { + this.teleportCooldown = teleportCooldown; + } + @Inject(at = @At("HEAD"), method = "tick") public void tick(CallbackInfo info) { + updateNetherPortal(); if (teleportCooldown > 0) { teleportCooldown--; } } + @Unique + private void updateNetherPortal() { + if (cannotTeleport()) { + inNetherPortal = false; + } + } + @Inject(at = @At("HEAD"), method = "canUsePortals", cancellable = true) public void canUsePortals(CallbackInfoReturnable info) { if (cannotTeleport()) { @@ -38,4 +56,15 @@ public class MixinEntity implements TeleportationRestrictorBlock.TeleportingEnti public boolean cannotTeleport() { return teleportCooldown > 0; } + + @Inject(at = @At("HEAD"), method = "toTag") + public void toTag(CompoundTag tag, CallbackInfoReturnable info) { + tag.putByte("RelicCraftTeleportCooldown", teleportCooldown); + } + + @Inject(at = @At("HEAD"), method = "fromTag") + public void fromTag(CompoundTag tag, CallbackInfo info) { + teleportCooldown = tag.getByte("RelicCraftTeleportCooldown"); + updateNetherPortal(); + } } diff --git a/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinServerPlayerEntity.java b/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinServerPlayerEntity.java new file mode 100644 index 0000000..34eee80 --- /dev/null +++ b/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinServerPlayerEntity.java @@ -0,0 +1,16 @@ +package com.thebrokenrail.reliccraft.mixin; + +import com.thebrokenrail.reliccraft.packet.UpdateTeleportCooldownS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; +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(ServerPlayerEntity.class) +public class MixinServerPlayerEntity extends MixinEntity { + @Inject(at = @At("RETURN"), method = "playerTick") + public void playerTick(CallbackInfo info) { + UpdateTeleportCooldownS2CPacket.send((ServerPlayerEntity) (Object) this, teleportCooldown); + } +} diff --git a/src/main/java/com/thebrokenrail/reliccraft/packet/UpdateTeleportCooldownS2CPacket.java b/src/main/java/com/thebrokenrail/reliccraft/packet/UpdateTeleportCooldownS2CPacket.java new file mode 100644 index 0000000..fe36e39 --- /dev/null +++ b/src/main/java/com/thebrokenrail/reliccraft/packet/UpdateTeleportCooldownS2CPacket.java @@ -0,0 +1,30 @@ +package com.thebrokenrail.reliccraft.packet; + +import com.thebrokenrail.reliccraft.RelicCraft; +import com.thebrokenrail.reliccraft.block.TeleportationRestrictorBlock; +import io.netty.buffer.Unpooled; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.network.PacketContext; +import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import net.minecraft.util.PacketByteBuf; + +@SuppressWarnings("unused") +public class UpdateTeleportCooldownS2CPacket { + public static void send(ServerPlayerEntity player, byte cooldown) { + PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); + buf.writeByte(cooldown); + + player.networkHandler.sendPacket(new CustomPayloadS2CPacket(new Identifier(RelicCraft.NAMESPACE, "update_teleport_cooldown"), buf)); + } + + @Environment(EnvType.CLIENT) + public static void handle(PacketContext context, PacketByteBuf buf) { + byte cooldown = buf.readByte(); + if (context.getPlayer() != null) { + ((TeleportationRestrictorBlock.TeleportingEntity) context.getPlayer()).setTeleportCooldown(cooldown); + } + } +} diff --git a/src/main/resources/reliccraft.mixins.json b/src/main/resources/reliccraft.mixins.json index f915779..b738468 100644 --- a/src/main/resources/reliccraft.mixins.json +++ b/src/main/resources/reliccraft.mixins.json @@ -19,6 +19,7 @@ "MixinLocateCommand", "MixinNetherStarItem", "MixinServerChunkManager", + "MixinServerPlayerEntity", "MixinServerWorld", "MixinThrownEnderpearlEntity", "MixinWorld"