diff --git a/README.md b/README.md index 73d3598..b3a3c75 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Sync (Fabric) [![GitHub tag](https://img.shields.io/github/v/tag/Kir-Antipov/sync-fabric.svg?cacheSeconds=3600&sort=date)](https://github.com/Kir-Antipov/sync-fabric/releases/latest) -[![GitHub build status](https://img.shields.io/github/workflow/status/Kir-Antipov/sync-fabric/build-artifacts/1.18.x/dev?cacheSeconds=3600)](https://github.com/Kir-Antipov/sync-fabric/actions/workflows/build-artifacts.yml) +[![GitHub build status](https://img.shields.io/github/workflow/status/Kir-Antipov/sync-fabric/build-artifacts/1.19.x/dev?cacheSeconds=3600)](https://github.com/Kir-Antipov/sync-fabric/actions/workflows/build-artifacts.yml) [![Modrinth](https://img.shields.io/badge/dynamic/json?color=5da545&label=Modrinth&query=title&url=https://api.modrinth.com/api/v1/mod/sync-fabric&style=flat&cacheSeconds=3600&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMSAxMSIgd2lkdGg9IjE0LjY2NyIgaGVpZ2h0PSIxNC42NjciICB4bWxuczp2PSJodHRwczovL3ZlY3RhLmlvL25hbm8iPjxkZWZzPjxjbGlwUGF0aCBpZD0iQSI+PHBhdGggZD0iTTAgMGgxMXYxMUgweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNBKSI+PHBhdGggZD0iTTEuMzA5IDcuODU3YTQuNjQgNC42NCAwIDAgMS0uNDYxLTEuMDYzSDBDLjU5MSA5LjIwNiAyLjc5NiAxMSA1LjQyMiAxMWMxLjk4MSAwIDMuNzIyLTEuMDIgNC43MTEtMi41NTZoMGwtLjc1LS4zNDVjLS44NTQgMS4yNjEtMi4zMSAyLjA5Mi0zLjk2MSAyLjA5MmE0Ljc4IDQuNzggMCAwIDEtMy4wMDUtMS4wNTVsMS44MDktMS40NzQuOTg0Ljg0NyAxLjkwNS0xLjAwM0w4LjE3NCA1LjgybC0uMzg0LS43ODYtMS4xMTYuNjM1LS41MTYuNjk0LS42MjYuMjM2LS44NzMtLjM4N2gwbC0uMjEzLS45MS4zNTUtLjU2Ljc4Ny0uMzcuODQ1LS45NTktLjcwMi0uNTEtMS44NzQuNzEzLTEuMzYyIDEuNjUxLjY0NSAxLjA5OC0xLjgzMSAxLjQ5MnptOS42MTQtMS40NEE1LjQ0IDUuNDQgMCAwIDAgMTEgNS41QzExIDIuNDY0IDguNTAxIDAgNS40MjIgMCAyLjc5NiAwIC41OTEgMS43OTQgMCA0LjIwNmguODQ4QzEuNDE5IDIuMjQ1IDMuMjUyLjgwOSA1LjQyMi44MDljMi42MjYgMCA0Ljc1OCAyLjEwMiA0Ljc1OCA0LjY5MSAwIC4xOS0uMDEyLjM3Ni0uMDM0LjU2bC43NzcuMzU3aDB6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM1ZGE0MjYiLz48L2c+PC9zdmc+)](https://modrinth.com/mod/sync-fabric) [![CurseForge](https://img.shields.io/badge/dynamic/json?color=%23f16436&label=CurseForge&query=title&url=https%3A%2F%2Fapi.cfwidget.com%2F515365&cacheSeconds=3600)](https://www.curseforge.com/minecraft/mc-mods/sync-fabric) [![GitHub license](https://img.shields.io/github/license/Kir-Antipov/sync-fabric.svg?cacheSeconds=36000)](https://github.com/Kir-Antipov/sync-fabric#readme) @@ -166,9 +166,9 @@ You can help translate the mod to additional languages here: [crowdin.com](https ## Installation Requirements: - - Minecraft `1.18.x` - - Fabric Loader `>=0.12.0` - - Fabric API `>=0.43.1` + - Minecraft `1.19.x` + - Fabric Loader `>=0.14.0` + - Fabric API `>=0.55.1` You can download the mod from: @@ -208,7 +208,7 @@ There's [no documentation](https://www.commitstrip.com/en/2021/11/10/no-document ## Building from sources Requirements: - - JDK `16` + - JDK `17` ### Linux/MacOS diff --git a/build.gradle b/build.gradle index 8ff2211..6ae97d4 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { } plugins { - id "fabric-loom" version "0.11-SNAPSHOT" + id "fabric-loom" version "0.12-SNAPSHOT" id "org.ajoberstar.grgit" version "4.1.0" } @@ -102,8 +102,9 @@ dependencies { modImplementation "me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}" modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" modImplementation "dev.emi:trinkets:${project.trinkets_version}" - modImplementation "io.github.ladysnake:requiem-api:${project.requiem_version}" - modImplementation "com.github.apace100:origins-fabric:${project.origins_version}" + modCompileOnly("io.github.ladysnake:requiem-api:${project.requiem_version}", { transitive false }) + modImplementation "maven.modrinth:origins:${project.origins_version}" + modImplementation "com.github.apace100:apoli:${project.apoli_version}" modCompileOnly "maven.modrinth:haema:${project.haema_version}" } diff --git a/gradle.properties b/gradle.properties index 24a3930..e9ffa35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/versions.html -minecraft_version=1.18.2 -yarn_mappings=1.18.2+build.3 -loader_version=0.12.2 +minecraft_version=1.19 +yarn_mappings=1.19+build.1 +loader_version=0.14.7 # Mod Properties mod_version=4.0 @@ -13,14 +13,15 @@ maven_group=dev.kir archives_base_name=sync # Dependencies -fabric_version=0.47.8+1.18.2 +fabric_version=0.55.2+1.19 tr_energy_version=2.2.0 -satin_version=1.7.2 -cloth_version=6.2.57 -modmenu_version=3.1.1 -trinkets_version=3.3.0 -requiem_version=2.0.0-beta.7 -origins_version=1.4.1 +satin_version=1.8.0 +cloth_version=7.0.65 +modmenu_version=4.0.0 +trinkets_version=3.4.0 +requiem_version=2.0.0-beta.8 +origins_version=1.6.1 +apoli_version=2.5.0 haema_version=1.9.9+1.18.2 -smartrecipes_version=0.2.1+1.18.2 -crowdin_translate_version=1.4+1.18.2 \ No newline at end of file +smartrecipes_version=0.2.1+1.19 +crowdin_translate_version=1.4+1.19-pre2 \ No newline at end of file diff --git a/src/main/java/dev/kir/sync/api/event/PlayerSyncEvents.java b/src/main/java/dev/kir/sync/api/event/PlayerSyncEvents.java index 82f4568..e630bd6 100644 --- a/src/main/java/dev/kir/sync/api/event/PlayerSyncEvents.java +++ b/src/main/java/dev/kir/sync/api/event/PlayerSyncEvents.java @@ -6,7 +6,6 @@ import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.Nullable; @@ -102,9 +101,9 @@ public final class PlayerSyncEvents { @FunctionalInterface public interface SyncFailureReason { SyncFailureReason OTHER_PROBLEM = () -> null; - SyncFailureReason INVALID_SHELL = create(new TranslatableText("event.sync.request.fail.invalid.shell")); - SyncFailureReason INVALID_CURRENT_LOCATION = create(new TranslatableText("event.sync.request.fail.invalid.location.current")); - SyncFailureReason INVALID_TARGET_LOCATION = create(new TranslatableText("event.sync.request.fail.invalid.location.target")); + SyncFailureReason INVALID_SHELL = create(Text.translatable("event.sync.request.fail.invalid.shell")); + SyncFailureReason INVALID_CURRENT_LOCATION = create(Text.translatable("event.sync.request.fail.invalid.location.current")); + SyncFailureReason INVALID_TARGET_LOCATION = create(Text.translatable("event.sync.request.fail.invalid.location.target")); @Nullable Text toText(); @@ -117,8 +116,8 @@ static SyncFailureReason create(@Nullable Text description) { @FunctionalInterface public interface ShellConstructionFailureReason { ShellConstructionFailureReason OTHER_PROBLEM = () -> null; - ShellConstructionFailureReason OCCUPIED = create(new TranslatableText("event.sync.construction.fail.occupied")); - ShellConstructionFailureReason NOT_ENOUGH_HEALTH = create(new TranslatableText("event.sync.construction.fail.health")); + ShellConstructionFailureReason OCCUPIED = create(Text.translatable("event.sync.construction.fail.occupied")); + ShellConstructionFailureReason NOT_ENOUGH_HEALTH = create(Text.translatable("event.sync.construction.fail.health")); @Nullable Text toText(); diff --git a/src/main/java/dev/kir/sync/api/shell/ShellState.java b/src/main/java/dev/kir/sync/api/shell/ShellState.java index ad76eb4..95ac3e0 100644 --- a/src/main/java/dev/kir/sync/api/shell/ShellState.java +++ b/src/main/java/dev/kir/sync/api/shell/ShellState.java @@ -220,7 +220,7 @@ private static ShellState create(ServerPlayerEntity player, BlockPos pos, DyeCol shell.isArtificial = isArtificial; shell.ownerUuid = player.getUuid(); - shell.ownerName = player.getName().asString(); + shell.ownerName = player.getName().getString(); shell.gameMode = player.interactionManager.getGameMode().getId(); shell.inventory = new SimpleInventory(); shell.component = ShellStateComponent.empty(); diff --git a/src/main/java/dev/kir/sync/block/ShellStorageBlock.java b/src/main/java/dev/kir/sync/block/ShellStorageBlock.java index 3dc50d3..ea5f0d1 100644 --- a/src/main/java/dev/kir/sync/block/ShellStorageBlock.java +++ b/src/main/java/dev/kir/sync/block/ShellStorageBlock.java @@ -11,10 +11,9 @@ import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; import net.minecraft.world.World; -import java.util.Random; - @SuppressWarnings("deprecation") public class ShellStorageBlock extends AbstractShellContainerBlock { public static final BooleanProperty ENABLED = Properties.ENABLED; diff --git a/src/main/java/dev/kir/sync/block/TreadmillBlock.java b/src/main/java/dev/kir/sync/block/TreadmillBlock.java index 99fb959..20af778 100644 --- a/src/main/java/dev/kir/sync/block/TreadmillBlock.java +++ b/src/main/java/dev/kir/sync/block/TreadmillBlock.java @@ -21,6 +21,7 @@ import net.minecraft.util.StringIdentifiable; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.random.Random; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; @@ -28,8 +29,6 @@ import net.minecraft.world.WorldAccess; import org.jetbrains.annotations.Nullable; -import java.util.Random; - @SuppressWarnings("deprecation") public class TreadmillBlock extends HorizontalFacingBlock implements BlockEntityProvider { public static final EnumProperty PART = EnumProperty.of("treadmill_part", Part.class); diff --git a/src/main/java/dev/kir/sync/block/entity/AbstractShellContainerBlockEntity.java b/src/main/java/dev/kir/sync/block/entity/AbstractShellContainerBlockEntity.java index 14ab1d0..1f04c7f 100644 --- a/src/main/java/dev/kir/sync/block/entity/AbstractShellContainerBlockEntity.java +++ b/src/main/java/dev/kir/sync/block/entity/AbstractShellContainerBlockEntity.java @@ -63,6 +63,9 @@ public AbstractShellContainerBlockEntity(BlockEntityType type, BlockPos pos, @Override public void setShellState(ShellState shell) { this.shell = shell; + if (this.world != null && !this.world.isClient && this.pos != null && this.getCachedState() != null) { + this.checkShellState(this.world, this.pos, this.getCachedState()); + } } @Override @@ -97,6 +100,10 @@ protected Optional getBottomPart() { @Override public void onServerTick(World world, BlockPos pos, BlockState state) { + this.checkShellState(world, pos, state); + } + + private void checkShellState(World world, BlockPos pos, BlockState state) { if (this.shell != null && this.shell.getColor() != this.color) { this.shell.setColor(this.color); } diff --git a/src/main/java/dev/kir/sync/client/gui/ShellSelectorGUI.java b/src/main/java/dev/kir/sync/client/gui/ShellSelectorGUI.java index ba34d06..3170a99 100644 --- a/src/main/java/dev/kir/sync/client/gui/ShellSelectorGUI.java +++ b/src/main/java/dev/kir/sync/client/gui/ShellSelectorGUI.java @@ -20,7 +20,6 @@ import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; @@ -34,8 +33,8 @@ public class ShellSelectorGUI extends Screen { private static final int MAX_SLOTS = 8; private static final double MENU_RADIUS = 0.3F; private static final int BACKGROUND_COLOR = ColorUtil.fromDyeColor(DyeColor.BLACK, 0.3F); - private static final Text TITLE = new TranslatableText("gui.sync.default.cross_button.title"); - private static final Collection ARROW_TITLES = List.of(new TranslatableText("gui.sync.shell_selector.up.title"), new TranslatableText("gui.sync.shell_selector.right.title"), new TranslatableText("gui.sync.shell_selector.down.title"), new TranslatableText("gui.sync.shell_selector.left.title")); + private static final Text TITLE = Text.translatable("gui.sync.default.cross_button.title"); + private static final Collection ARROW_TITLES = List.of(Text.translatable("gui.sync.shell_selector.up.title"), Text.translatable("gui.sync.shell_selector.right.title"), Text.translatable("gui.sync.shell_selector.down.title"), Text.translatable("gui.sync.shell_selector.left.title")); private final Runnable onCloseCallback; private final Runnable onRemovedCallback; diff --git a/src/main/java/dev/kir/sync/client/gui/widget/CrossButtonWidget.java b/src/main/java/dev/kir/sync/client/gui/widget/CrossButtonWidget.java index cb64a17..80d2d2d 100644 --- a/src/main/java/dev/kir/sync/client/gui/widget/CrossButtonWidget.java +++ b/src/main/java/dev/kir/sync/client/gui/widget/CrossButtonWidget.java @@ -8,13 +8,12 @@ import net.fabricmc.api.Environment; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.DyeColor; import net.minecraft.util.math.MathHelper; @Environment(EnvType.CLIENT) public class CrossButtonWidget extends AbstractButtonWidget { - private static final Text DEFAULT_DESCRIPTION = new TranslatableText("gui.sync.default.cross_button.title"); + private static final Text DEFAULT_DESCRIPTION = Text.translatable("gui.sync.default.cross_button.title"); private static final int DEFAULT_COLOR = ColorUtil.fromDyeColor(DyeColor.WHITE); private static final float DEFAULT_STEP = Radians.R_PI_32; diff --git a/src/main/java/dev/kir/sync/client/render/CustomGameRenderer.java b/src/main/java/dev/kir/sync/client/render/CustomGameRenderer.java index 0a68d94..67085a4 100644 --- a/src/main/java/dev/kir/sync/client/render/CustomGameRenderer.java +++ b/src/main/java/dev/kir/sync/client/render/CustomGameRenderer.java @@ -11,6 +11,7 @@ import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.resource.ResourceManager; import net.minecraft.util.math.Matrix4f; @@ -22,8 +23,8 @@ public final class CustomGameRenderer extends GameRenderer { private static final ManagedCoreShader RENDER_TYPE_VOXEL_SHADER; - private CustomGameRenderer(MinecraftClient client, ResourceManager resourceManager, BufferBuilderStorage buffers) { - super(client, resourceManager, buffers); + private CustomGameRenderer(MinecraftClient client, HeldItemRenderer heldItemRenderer, ResourceManager resourceManager, BufferBuilderStorage buffers) { + super(client, heldItemRenderer, resourceManager, buffers); } public static void initRenderTypeEntityTranslucentPartiallyTexturedShader(float cutoutY, Matrix4f modelMatrix) { diff --git a/src/main/java/dev/kir/sync/command/GhostShellsCommand.java b/src/main/java/dev/kir/sync/command/GhostShellsCommand.java index 85568d5..781a6d4 100644 --- a/src/main/java/dev/kir/sync/command/GhostShellsCommand.java +++ b/src/main/java/dev/kir/sync/command/GhostShellsCommand.java @@ -18,7 +18,6 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.Chunk; @@ -28,7 +27,7 @@ import java.util.function.Consumer; public class GhostShellsCommand implements Command { - private static final SimpleCommandExceptionType INVALID_ACTION_TYPE = new SimpleCommandExceptionType(new TranslatableText("command.sync.ghostshells.invalid_action")); + private static final SimpleCommandExceptionType INVALID_ACTION_TYPE = new SimpleCommandExceptionType(Text.translatable("command.sync.ghostshells.invalid_action")); @Override public String getName() { @@ -93,7 +92,7 @@ private static int execute(CommandContext context) throws C for (ServerPlayerEntity player : players) { ShellState shellState = ((Shell)player).getAvailableShellStates().filter(x -> x.getPos().equals(finalPos)).findAny().orElse(null); if (shellState == null) { - logger.accept(new TranslatableText("command.sync.ghostshells.not_found", player.getName().asString(), pos.toShortString())); + logger.accept(Text.translatable("command.sync.ghostshells.not_found", player.getName().getString(), pos.toShortString())); } else { updateShell(player, shellState, repair, canSkip, logger); } @@ -115,18 +114,18 @@ private static void updateShell(ServerPlayerEntity player, ShellState shellState if (shouldRepair) { if (tryRepair(player.server, shellState)) { - logger.accept(new TranslatableText("command.sync.ghostshells.repaired", player.getName().asString(), shellState.getPos().toShortString())); + logger.accept(Text.translatable("command.sync.ghostshells.repaired", player.getName().getString(), shellState.getPos().toShortString())); return; } if (!skipOnFailure) { - logger.accept(new TranslatableText("command.sync.ghostshells.failed", player.getName().asString(), shellState.getPos().toShortString())); + logger.accept(Text.translatable("command.sync.ghostshells.failed", player.getName().getString(), shellState.getPos().toShortString())); return; } } ((Shell)player).remove(shellState); - logger.accept(new TranslatableText("command.sync.ghostshells.removed", player.getName().asString(), shellState.getPos().toShortString())); + logger.accept(Text.translatable("command.sync.ghostshells.removed", player.getName().getString(), shellState.getPos().toShortString())); } private static boolean shellExists(MinecraftServer server, ShellState shellState) { diff --git a/src/main/java/dev/kir/sync/compat/origins/OriginsShellStateComponent.java b/src/main/java/dev/kir/sync/compat/origins/OriginsShellStateComponent.java index 4fe32f3..fd641bb 100644 --- a/src/main/java/dev/kir/sync/compat/origins/OriginsShellStateComponent.java +++ b/src/main/java/dev/kir/sync/compat/origins/OriginsShellStateComponent.java @@ -83,7 +83,7 @@ public void clone(ShellStateComponent component) { originComponent.sync(); } else { for (OriginLayer layer : OriginLayers.getLayers()) { - if(layer.isEnabled()) { + if (layer.isEnabled()) { originComponent.setOrigin(layer, Origin.EMPTY); } } diff --git a/src/main/java/dev/kir/sync/compat/requiem/RequiemCompat.java b/src/main/java/dev/kir/sync/compat/requiem/RequiemCompat.java index d55cdcb..ecca1f8 100644 --- a/src/main/java/dev/kir/sync/compat/requiem/RequiemCompat.java +++ b/src/main/java/dev/kir/sync/compat/requiem/RequiemCompat.java @@ -7,7 +7,6 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; public class RequiemCompat implements ModInitializer { @Override @@ -16,7 +15,7 @@ public void onInitialize() { return; } - final Text PLAYER_IS_UNDEAD = new TranslatableText("event.sync.any.fail.undead"); + final Text PLAYER_IS_UNDEAD = Text.translatable("event.sync.any.fail.undead"); PlayerSyncEvents.ALLOW_SHELL_CONSTRUCTION.register((player, __) -> isUndead(player) ? () -> PLAYER_IS_UNDEAD : null); PlayerSyncEvents.ALLOW_SHELL_SELECTION.register((player, __) -> isUndead(player) ? () -> PLAYER_IS_UNDEAD : null); PlayerSyncEvents.ALLOW_SYNCING.register((player, __) -> isUndead(player) ? () -> PLAYER_IS_UNDEAD : null); diff --git a/src/main/java/dev/kir/sync/compat/trinkets/TrinketsCompat.java b/src/main/java/dev/kir/sync/compat/trinkets/TrinketsCompat.java index 3fedfeb..02c2063 100644 --- a/src/main/java/dev/kir/sync/compat/trinkets/TrinketsCompat.java +++ b/src/main/java/dev/kir/sync/compat/trinkets/TrinketsCompat.java @@ -8,10 +8,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.EntityType; +import org.jetbrains.annotations.NotNull; public class TrinketsCompat implements EntityComponentInitializer { @Override - public void registerEntityComponentFactories(EntityComponentFactoryRegistry registry) { + public void registerEntityComponentFactories(@NotNull EntityComponentFactoryRegistry registry) { if (!FabricLoader.getInstance().isModLoaded("trinkets")) { return; } diff --git a/src/main/java/dev/kir/sync/entity/PersistentCameraEntityGoal.java b/src/main/java/dev/kir/sync/entity/PersistentCameraEntityGoal.java index ea46877..8b8221a 100644 --- a/src/main/java/dev/kir/sync/entity/PersistentCameraEntityGoal.java +++ b/src/main/java/dev/kir/sync/entity/PersistentCameraEntityGoal.java @@ -2,8 +2,9 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.util.math.*; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; import java.util.function.Consumer; @@ -11,7 +12,7 @@ public class PersistentCameraEntityGoal { public static final double MAX_DISTANCE = 25; public static final long PHASE_DELAY = 200; - public static final double MAX_Y = DimensionType.OVERWORLD.getHeight() * 1.01; + public static final double MAX_Y = 320; public static final long MIN_PHASE_DURATION = 400; public static final long MAX_PHASE_DURATION = 2500; diff --git a/src/main/java/dev/kir/sync/entity/ShellEntity.java b/src/main/java/dev/kir/sync/entity/ShellEntity.java index 58d63d6..781e863 100644 --- a/src/main/java/dev/kir/sync/entity/ShellEntity.java +++ b/src/main/java/dev/kir/sync/entity/ShellEntity.java @@ -7,8 +7,8 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.render.entity.PlayerModelPart; import net.minecraft.client.world.ClientWorld; @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; @Environment(EnvType.CLIENT) -public class ShellEntity extends AbstractClientPlayerEntity { +public class ShellEntity extends OtherClientPlayerEntity { private static final Cache PLAYER_ENTRY_CACHE; public boolean isActive; @@ -33,7 +33,7 @@ public ShellEntity(ShellState state) { } public ShellEntity(ClientWorld world, ShellState state) { - super(world, getPlayerEntry(state).getProfile()); + super(world, getPlayerEntry(state).getProfile(), getPlayerEntry(state).getPublicKeyData()); this.isActive = false; this.pitchProgress = 0; this.state = state; @@ -104,7 +104,8 @@ protected PlayerListEntry getPlayerListEntry() { private static PlayerListEntry getPlayerEntry(ShellState state) { PlayerListEntry entry = PLAYER_ENTRY_CACHE.getIfPresent(state.getOwnerUuid()); if (entry == null) { - ClientPlayNetworkHandler networkHandler = MinecraftClient.getInstance().getNetworkHandler(); + MinecraftClient client = MinecraftClient.getInstance(); + ClientPlayNetworkHandler networkHandler = client.getNetworkHandler(); if (networkHandler != null) { entry = networkHandler.getPlayerListEntry(state.getOwnerUuid()); if (entry == null) { @@ -113,7 +114,7 @@ private static PlayerListEntry getPlayerEntry(ShellState state) { } if (entry == null) { - entry = new PlayerListEntry(new PlayerListS2CPacket.Entry(new GameProfile(state.getOwnerUuid(), state.getOwnerName()), 0, null, null)); + entry = new PlayerListEntry(new PlayerListS2CPacket.Entry(new GameProfile(state.getOwnerUuid(), state.getOwnerName()), 0, null, null, null), client.getServicesSignatureVerifier()); } PLAYER_ENTRY_CACHE.put(state.getOwnerUuid(), entry); diff --git a/src/main/java/dev/kir/sync/mixin/ClientPlayerEntityMixin.java b/src/main/java/dev/kir/sync/mixin/ClientPlayerEntityMixin.java index 212f307..7f4aaca 100644 --- a/src/main/java/dev/kir/sync/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/dev/kir/sync/mixin/ClientPlayerEntityMixin.java @@ -21,6 +21,7 @@ import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.encryption.PlayerPublicKey; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -56,8 +57,8 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity private ConcurrentMap shellsById = new ConcurrentHashMap<>(); - private ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { - super(world, profile); + private ClientPlayerEntityMixin(ClientWorld world, GameProfile profile, PlayerPublicKey publicKey) { + super(world, profile, publicKey); } diff --git a/src/main/java/dev/kir/sync/mixin/EntityRenderDispatcherMixin.java b/src/main/java/dev/kir/sync/mixin/EntityRenderDispatcherMixin.java index d330e2d..59f5a08 100644 --- a/src/main/java/dev/kir/sync/mixin/EntityRenderDispatcherMixin.java +++ b/src/main/java/dev/kir/sync/mixin/EntityRenderDispatcherMixin.java @@ -8,10 +8,12 @@ import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; import net.fabricmc.fabric.impl.client.rendering.RegistrationHelperImpl; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.render.block.BlockRenderManager; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.model.EntityModelLoader; +import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -31,17 +33,20 @@ @Environment(EnvType.CLIENT) @Mixin(EntityRenderDispatcher.class) public class EntityRenderDispatcherMixin { - @Final @Shadow - private ItemRenderer itemRenderer; + private @Final ItemRenderer itemRenderer; - @Final @Shadow - private TextRenderer textRenderer; + private @Final TextRenderer textRenderer; - @Final @Shadow - private EntityModelLoader modelLoader; + private @Final EntityModelLoader modelLoader; + + @Shadow + private @Final HeldItemRenderer heldItemRenderer; + + @Shadow + private @Final BlockRenderManager blockRenderManager; @Unique private Map> shellRenderers = ImmutableMap.of(); @@ -59,7 +64,7 @@ private void getRenderer(T entity, CallbackInfoReturnable cir) { + private void forceDropXp(CallbackInfoReturnable cir) { if (cir.getReturnValue() == 0 && this instanceof Shell shell && shell.isArtificial() && !this.isSpectator() && this.world.getGameRules().getBoolean(GameRules.KEEP_INVENTORY)) { cir.setReturnValue(Math.min(this.experienceLevel * 7, 100)); } diff --git a/src/main/java/dev/kir/sync/mixin/ServerPlayerEntityMixin.java b/src/main/java/dev/kir/sync/mixin/ServerPlayerEntityMixin.java index 7fbb486..d067823 100644 --- a/src/main/java/dev/kir/sync/mixin/ServerPlayerEntityMixin.java +++ b/src/main/java/dev/kir/sync/mixin/ServerPlayerEntityMixin.java @@ -16,7 +16,8 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; -import net.minecraft.network.MessageType; +import net.minecraft.network.encryption.PlayerPublicKey; +import net.minecraft.network.message.MessageType; import net.minecraft.network.packet.s2c.play.*; import net.minecraft.scoreboard.AbstractTeam; import net.minecraft.server.MinecraftServer; @@ -25,13 +26,10 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.HoverEvent; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.Pair; -import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.GameMode; @@ -88,8 +86,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Se private Map> shellStateChanges = new ConcurrentHashMap<>(); - private ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile profile) { - super(world, pos, yaw, profile); + private ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile profile, PlayerPublicKey publicKey) { + super(world, pos, yaw, profile, publicKey); } @@ -304,6 +302,7 @@ private void onDeath(DamageSource source, CallbackInfo ci) { this.sendEmptyDeathMessageInChat(); } + this.dropShoulderEntities(); if (this.world.getGameRules().getBoolean(GameRules.FORGIVE_DEAD_PLAYERS)) { this.forgiveMobAnger(); } @@ -340,8 +339,8 @@ private void sendDeathMessageInChat() { this.networkHandler.sendPacket(new DeathMessageS2CPacket(this.getDamageTracker(), text), (future) -> { if (!future.isSuccess()) { String truncatedText = text.asTruncatedString(256); - Text tooLong = new TranslatableText("death.attack.message_too_long", (new LiteralText(truncatedText)).formatted(Formatting.YELLOW)); - Text magic = (new TranslatableText("death.attack.even_more_magic", this.getDisplayName())).styled((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooLong))); + Text tooLong = Text.translatable("death.attack.message_too_long", (Text.literal(truncatedText)).formatted(Formatting.YELLOW)); + Text magic = (Text.translatable("death.attack.even_more_magic", this.getDisplayName())).styled((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooLong))); this.networkHandler.sendPacket(new DeathMessageS2CPacket(this.getDamageTracker(), magic)); } }); @@ -353,13 +352,13 @@ private void sendDeathMessageInChat() { this.server.getPlayerManager().sendToOtherTeams(this, text); } } else { - this.server.getPlayerManager().broadcast(text, MessageType.SYSTEM, Util.NIL_UUID); + this.server.getPlayerManager().broadcast(text, MessageType.SYSTEM); } } @Unique private void sendEmptyDeathMessageInChat() { - this.networkHandler.sendPacket(new DeathMessageS2CPacket(this.getDamageTracker(), LiteralText.EMPTY)); + this.networkHandler.sendPacket(new DeathMessageS2CPacket(this.getDamageTracker(), Text.empty())); } @Shadow @@ -441,8 +440,7 @@ private void teleport(ServerWorld targetWorld, BlockPos pos) { ServerPlayerEntity serverPlayer = (ServerPlayerEntity)(Object)this; WorldProperties worldProperties = targetWorld.getLevelProperties(); - // method_40134() -> GetDimensionRegistryKey() - serverPlayer.networkHandler.sendPacket(new PlayerRespawnS2CPacket(targetWorld.method_40134(), targetWorld.getRegistryKey(), BiomeAccess.hashSeed(targetWorld.getSeed()), serverPlayer.interactionManager.getGameMode(), serverPlayer.interactionManager.getPreviousGameMode(), targetWorld.isDebugWorld(), targetWorld.isFlat(), true)); + serverPlayer.networkHandler.sendPacket(new PlayerRespawnS2CPacket(targetWorld.getDimensionKey(), targetWorld.getRegistryKey(), BiomeAccess.hashSeed(targetWorld.getSeed()), serverPlayer.interactionManager.getGameMode(), serverPlayer.interactionManager.getPreviousGameMode(), targetWorld.isDebugWorld(), targetWorld.isFlat(), true, this.getLastDeathPos())); serverPlayer.networkHandler.sendPacket(new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); PlayerManager playerManager = Objects.requireNonNull(this.world.getServer()).getPlayerManager(); playerManager.sendCommandTree(serverPlayer); diff --git a/src/main/java/dev/kir/sync/util/client/render/RenderSystemUtil.java b/src/main/java/dev/kir/sync/util/client/render/RenderSystemUtil.java index 87d73de..a895eab 100644 --- a/src/main/java/dev/kir/sync/util/client/render/RenderSystemUtil.java +++ b/src/main/java/dev/kir/sync/util/client/render/RenderSystemUtil.java @@ -97,8 +97,7 @@ public static void draw(Consumer consumer, VertexFormat.DrawMode BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); bufferBuilder.begin(drawMode, format); consumer.accept(bufferBuilder); - bufferBuilder.end(); - BufferRenderer.draw(bufferBuilder); + BufferRenderer.drawWithShader(bufferBuilder.end()); RenderSystem.disableBlend(); RenderSystem.enableTexture(); diff --git a/src/main/resources/sync.accesswidener b/src/main/resources/sync.accesswidener index e699137..0f20d6f 100644 --- a/src/main/resources/sync.accesswidener +++ b/src/main/resources/sync.accesswidener @@ -12,6 +12,4 @@ extendable method net/minecraft/client/model/Model getLayer (Lnet/minecraft/util accessible method net/minecraft/client/render/entity/model/AnimalModel getHeadParts ()Ljava/lang/Iterable; accessible method net/minecraft/client/render/entity/model/AnimalModel getBodyParts ()Ljava/lang/Iterable; -accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;IZZLnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; - -accessible field net/minecraft/world/dimension/DimensionType OVERWORLD Lnet/minecraft/world/dimension/DimensionType; \ No newline at end of file +accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;IZZLnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; \ No newline at end of file