diff --git a/build.gradle b/build.gradle index dec9c312..aa373725 100644 --- a/build.gradle +++ b/build.gradle @@ -83,8 +83,8 @@ repositories { dependencies { //runtimeOnly "vazkii.patchouli:Patchouli:${patchouli_version}" - compileOnly "curse.maven:ShoulderSurfing-243190:6496699" - compileOnly "curse.maven:BetterThirdPerson-435044:5965876" + compileOnly "curse.maven:ShoulderSurfing-243190:6993816" + compileOnly "curse.maven:BetterThirdPerson-435044:6455836" } var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { diff --git a/gradle.properties b/gradle.properties index 2d3e0477..2a466dbb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,11 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false org.gradle.debug=false -parchment_minecraft_version=1.21.4 -parchment_mappings_version=2025.03.23 -minecraft_version=1.21.4 -minecraft_version_range=[1.21.4,1.22) -neo_version=21.4.135 +parchment_minecraft_version=1.21.8 +parchment_mappings_version=2025.09.14 +minecraft_version=1.21.8 +minecraft_version_range=[1.21.6,1.21.9) +neo_version=21.8.52 neo_version_range=[21.0.0,) loader_version_range=[4,) diff --git a/src/main/java/com/alrex/parcool/ParCool.java b/src/main/java/com/alrex/parcool/ParCool.java index 2d312a9f..b705e3f0 100644 --- a/src/main/java/com/alrex/parcool/ParCool.java +++ b/src/main/java/com/alrex/parcool/ParCool.java @@ -34,14 +34,14 @@ import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.RegisterCommandsEvent; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Mod(ParCool.MOD_ID) public class ParCool { public static final String MOD_ID = "parcool"; - public static final Logger LOGGER = LogManager.getLogger(); + public static final Logger LOGGER = LoggerFactory.getLogger(ParCool.class); public ParCool(ModContainer container) { IEventBus eventBus = ModLoadingContext.get().getActiveContainer().getEventBus(); diff --git a/src/main/java/com/alrex/parcool/client/gui/ParCoolSettingScreen.java b/src/main/java/com/alrex/parcool/client/gui/ParCoolSettingScreen.java index 3cc8106f..0625c7ad 100644 --- a/src/main/java/com/alrex/parcool/client/gui/ParCoolSettingScreen.java +++ b/src/main/java/com/alrex/parcool/client/gui/ParCoolSettingScreen.java @@ -77,9 +77,9 @@ public void render(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float graphics.fill(3, 3, topBarHeight - 4, topBarHeight - 4, 0xFFEE0000); graphics.drawCenteredString(font, "!", topBarHeight / 2, (topBarHeight - font.lineHeight) / 2 + 1, 0xEEEEEE); if (2 <= mouseX && mouseX < topBarHeight - 3 && 1 <= mouseY && mouseY < topBarHeight - 3) { - graphics.renderComponentTooltip( + graphics.setTooltipForNextFrame( font, - Collections.singletonList(Permission_Not_Received), + Permission_Not_Received, mouseX, mouseY); } titleOffset = topBarHeight; diff --git a/src/main/java/com/alrex/parcool/client/gui/SettingActionLimitationScreen.java b/src/main/java/com/alrex/parcool/client/gui/SettingActionLimitationScreen.java index af264421..cb6dae08 100644 --- a/src/main/java/com/alrex/parcool/client/gui/SettingActionLimitationScreen.java +++ b/src/main/java/com/alrex/parcool/client/gui/SettingActionLimitationScreen.java @@ -12,6 +12,7 @@ import net.minecraft.client.gui.components.Checkbox; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.common.ModConfigSpec; import net.neoforged.neoforge.network.PacketDistributor; @@ -84,7 +85,7 @@ public void renderContents(GuiGraphics graphics, int mouseX, int mouseY, float p if ((topOffset < mouseY && mouseY < topOffset + headerHeight) && (columnCenter - permissionColumnWidth / 2 < mouseX && mouseX < columnCenter + permissionColumnWidth / 2) ) { - graphics.renderComponentTooltip(font, Collections.singletonList(Header_Limitation_Text), mouseX, mouseY); + graphics.setTooltipForNextFrame(font, Header_Limitation_Text, mouseX, mouseY); } } } @@ -107,7 +108,7 @@ protected void save() { if (player == null) return; Parkourability parkourability = Parkourability.get(player); parkourability.getActionInfo().setClientSetting(ClientSetting.readFromLocalConfig()); - PacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); + ClientPacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); } private static class ActionConfigSet { diff --git a/src/main/java/com/alrex/parcool/client/gui/SettingBooleanConfigScreen.java b/src/main/java/com/alrex/parcool/client/gui/SettingBooleanConfigScreen.java index 3cbc96c5..9572477d 100644 --- a/src/main/java/com/alrex/parcool/client/gui/SettingBooleanConfigScreen.java +++ b/src/main/java/com/alrex/parcool/client/gui/SettingBooleanConfigScreen.java @@ -10,6 +10,7 @@ import net.minecraft.client.gui.components.Checkbox; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.network.PacketDistributor; import java.util.Collections; @@ -55,9 +56,9 @@ protected void renderContents(GuiGraphics graphics, int mouseX, int mouseY, floa graphics.fill(offsetX, button.getY() + button.getHeight(), width - offsetX, button.getY() + button.getHeight() + 1, color.getSubSeparator()); String comment = booleans[i + topIndex].Comment; if (comment != null && button.getX() < mouseX && mouseX < button.getX() + contentWidth && button.getY() < mouseY && mouseY < button.getY() + 20) { - graphics.renderComponentTooltip( + graphics.setTooltipForNextFrame( font, - Collections.singletonList(Component.literal(comment)), + Component.literal(comment), mouseX, mouseY); } } @@ -93,6 +94,6 @@ protected void save() { if (player == null) return; Parkourability parkourability = Parkourability.get(player); parkourability.getActionInfo().setClientSetting(ClientSetting.readFromLocalConfig()); - PacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); + ClientPacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); } } diff --git a/src/main/java/com/alrex/parcool/client/gui/SettingEnumConfigScreen.java b/src/main/java/com/alrex/parcool/client/gui/SettingEnumConfigScreen.java index 87260e9e..d14437a1 100644 --- a/src/main/java/com/alrex/parcool/client/gui/SettingEnumConfigScreen.java +++ b/src/main/java/com/alrex/parcool/client/gui/SettingEnumConfigScreen.java @@ -11,6 +11,7 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.common.ModConfigSpec; import net.neoforged.neoforge.network.PacketDistributor; @@ -106,7 +107,7 @@ protected void save() { Parkourability parkourability = Parkourability.get(player); parkourability.getActionInfo().setClientSetting(ClientSetting.readFromLocalConfig()); parkourability.getActionInfo().updateStaminaType(LocalStamina.get(player), player); - PacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); + ClientPacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); } private static class EnumConfigSet> { diff --git a/src/main/java/com/alrex/parcool/client/hud/impl/LightStaminaHUD.java b/src/main/java/com/alrex/parcool/client/hud/impl/LightStaminaHUD.java index dd4069bc..b30160fc 100644 --- a/src/main/java/com/alrex/parcool/client/hud/impl/LightStaminaHUD.java +++ b/src/main/java/com/alrex/parcool/client/hud/impl/LightStaminaHUD.java @@ -13,6 +13,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.client.event.ClientTickEvent; @@ -69,7 +70,7 @@ public void onTick(ClientTickEvent.Post event, LocalPlayer player) { var stamina = player.getData(Attachments.STAMINA); int newValue = stamina.value(); changingSign = (int) Math.signum(newValue - oldValue); - final long gameTime = player.getCommandSenderWorld().getGameTime(); + final long gameTime = player.level().getGameTime(); if (changingSign != lastChangingSign) { lastChangingSign = changingSign; changingTimeTick = 0; @@ -127,7 +128,6 @@ public void render(GuiGraphics graphics, Parkourability parkourability, Readonly staminaScale *= 10f; float statusScale = showStatus ? MathUtil.lerp(oldStatusValue, statusValue, partialTick) * 10f : 0f; - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); final int width = graphics.guiWidth(); final int height = graphics.guiHeight(); int baseX = width / 2 + 91 + ParCoolConfig.Client.Integers.HorizontalOffsetOfLightStaminaHUD.get(); @@ -175,7 +175,7 @@ public void render(GuiGraphics graphics, Parkourability parkourability, Readonly offsetY = randomOffset; } - graphics.blitSprite(RenderType::guiTextured, type.getTexture(size), 9, 9, 0, 0, x, baseY + offsetY, 9, 9); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, type.getTexture(size), 9, 9, 0, 0, x, baseY + offsetY, 9, 9); } Minecraft.getInstance().gui.rightHeight += 10; } diff --git a/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUD.java b/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUD.java index 59e09735..ff9039fd 100644 --- a/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUD.java +++ b/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUD.java @@ -11,6 +11,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Tuple; @@ -88,14 +89,13 @@ public void render(GuiGraphics graphics, Parkourability parkourability, Readonly if (staminaScale < 0) staminaScale = 0; if (staminaScale > 1) staminaScale = 1; - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - graphics.blitSprite(RenderType::guiTextured, STAMINA_EMPTY, 93, 17, 0, 0, pos.getA(), pos.getB(), 93, 17); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, STAMINA_EMPTY, 93, 17, 0, 0, pos.getA(), pos.getB(), 93, 17); if (!stamina.isExhausted()) { - graphics.blitSprite(RenderType::guiTextured, STAMINA_EMPTY_CHARGE, 93, 17, 0, 0, pos.getA(), pos.getB(), (int) Math.ceil(92 * statusScale), 17); - graphics.blitSprite(RenderType::guiTextured, STAMINA_CHARGING, 93, 17, 0, 0, pos.getA(), pos.getB(), Math.round(16 + 69 * shadowScale) + 1, 12); - graphics.blitSprite(RenderType::guiTextured, STAMINA_FULL[renderGageType], 93, 17, 0, 0, pos.getA(), pos.getB(), Math.round(16 + 69 * staminaScale) + 1, 12); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, STAMINA_EMPTY_CHARGE, 93, 17, 0, 0, pos.getA(), pos.getB(), (int) Math.ceil(92 * statusScale), 17); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, STAMINA_CHARGING, 93, 17, 0, 0, pos.getA(), pos.getB(), Math.round(16 + 69 * shadowScale) + 1, 12); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, STAMINA_FULL[renderGageType], 93, 17, 0, 0, pos.getA(), pos.getB(), Math.round(16 + 69 * staminaScale) + 1, 12); } else { - graphics.blitSprite(RenderType::guiTextured, STAMINA_DEPLETED, 93, 17, 0, 0, pos.getA(), pos.getB(), Math.round(16 + 69 * staminaScale) + 1, 17); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, STAMINA_DEPLETED, 93, 17, 0, 0, pos.getA(), pos.getB(), Math.round(16 + 69 * staminaScale) + 1, 17); } shadowScale = staminaScale - (staminaScale - shadowScale) / 1.1f; } diff --git a/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUDController.java b/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUDController.java index 885eadb4..b21172da 100644 --- a/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUDController.java +++ b/src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUDController.java @@ -9,18 +9,18 @@ import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.gui.GuiLayer; import net.neoforged.neoforge.common.NeoForge; import javax.annotation.Nonnull; @OnlyIn(Dist.CLIENT) -public class StaminaHUDController implements LayeredDraw.Layer { +public class StaminaHUDController implements GuiLayer { public static ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(ParCool.MOD_ID, "hud.stamina"); LightStaminaHUD lightStaminaHUD; StaminaHUD staminaHUD; diff --git a/src/main/java/com/alrex/parcool/client/input/KeyBindings.java b/src/main/java/com/alrex/parcool/client/input/KeyBindings.java index 354040c3..f3c596db 100644 --- a/src/main/java/com/alrex/parcool/client/input/KeyBindings.java +++ b/src/main/java/com/alrex/parcool/client/input/KeyBindings.java @@ -17,7 +17,6 @@ @OnlyIn(Dist.CLIENT) public class KeyBindings { private static final Minecraft mc = Minecraft.getInstance(); - private static final Options settings = mc.options; private static final KeyMapping keyBindEnable = new KeyMapping("key.parcool.Enable", KeyConflictContext.UNIVERSAL, KeyModifier.CONTROL, InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_P, "key.categories.parcool"); private static final KeyMapping keyBindCrawl = new KeyMapping("key.parcool.Crawl", GLFW.GLFW_KEY_C, "key.categories.parcool"); private static final KeyMapping keyBindGrabWall = new KeyMapping("key.parcool.ClingToCliff", InputConstants.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_RIGHT, "key.categories.parcool"); @@ -37,7 +36,7 @@ public class KeyBindings { private static final Vec3 forwardVector = new Vec3(0, 0, 1); public static KeyMapping getKeySprint() { - return settings.keySprint; + return mc.options.keySprint; } public static Boolean isKeyJumpDown() { @@ -47,7 +46,7 @@ public static Boolean isKeyJumpDown() { } public static KeyMapping getKeySneak() { - return settings.keyShift; + return mc.options.keyShift; } public static Vec3 getCurrentMoveVector() { @@ -70,8 +69,8 @@ public static Boolean isAnyMovingKeyDown() { || mc.player.input.keyPresses.right() || mc.player.input.keyPresses.backward() || mc.player.input.keyPresses.left() - || mc.player.input.forwardImpulse != 0 - || mc.player.input.leftImpulse != 0); + || mc.player.input.getMoveVector().x != 0 + || mc.player.input.getMoveVector().y != 0); } public static Boolean isLeftAndRightDown() { diff --git a/src/main/java/com/alrex/parcool/client/renderer/RenderPipelines.java b/src/main/java/com/alrex/parcool/client/renderer/RenderPipelines.java new file mode 100644 index 00000000..c9b6fcfa --- /dev/null +++ b/src/main/java/com/alrex/parcool/client/renderer/RenderPipelines.java @@ -0,0 +1,25 @@ +package com.alrex.parcool.client.renderer; + +import com.alrex.parcool.ParCool; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.resources.ResourceLocation; + +public class RenderPipelines { + private static final RenderPipeline.Snippet ZIPLINE_SNIPPET = RenderPipeline.builder(net.minecraft.client.renderer.RenderPipelines.MATRICES_FOG_SNIPPET) + .withVertexShader("core/rendertype_leash") + .withFragmentShader("core/rendertype_leash") + .withSampler("Sampler2") + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR_LIGHTMAP, VertexFormat.Mode.QUADS) + .buildSnippet(); + + public static final RenderPipeline ZIPLINE_3D = RenderPipeline.builder(ZIPLINE_SNIPPET) + .withLocation(ResourceLocation.fromNamespaceAndPath(ParCool.MOD_ID, "zipline3d")) + .withCull(true) + .build(); + public static final RenderPipeline ZIPLINE_2D = RenderPipeline.builder(ZIPLINE_SNIPPET) + .withLocation(ResourceLocation.fromNamespaceAndPath(ParCool.MOD_ID, "zipline2d")) + .withCull(false) + .build(); +} diff --git a/src/main/java/com/alrex/parcool/client/renderer/RenderTypes.java b/src/main/java/com/alrex/parcool/client/renderer/RenderTypes.java index 8e3c0b6a..5e60dabe 100644 --- a/src/main/java/com/alrex/parcool/client/renderer/RenderTypes.java +++ b/src/main/java/com/alrex/parcool/client/renderer/RenderTypes.java @@ -12,25 +12,19 @@ public class RenderTypes { static { ZIPLINE_2D = RenderType.create( "zipline2d", - DefaultVertexFormat.POSITION_COLOR_LIGHTMAP, - VertexFormat.Mode.QUADS, 256, - false, false, + 256, + false, false, RenderPipelines.ZIPLINE_2D, RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.RENDERTYPE_LEASH_SHADER) .setTextureState(RenderStateShard.NO_TEXTURE) - .setCullState(RenderStateShard.NO_CULL) .setLightmapState(RenderStateShard.LIGHTMAP) .createCompositeState(false) ); ZIPLINE_3D = RenderType.create( "zipline3d", - DefaultVertexFormat.POSITION_COLOR_LIGHTMAP, - VertexFormat.Mode.QUADS, 256, - false, false, + 256, + false, false, RenderPipelines.ZIPLINE_3D, RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.RENDERTYPE_LEASH_SHADER) .setTextureState(RenderStateShard.NO_TEXTURE) - .setCullState(RenderStateShard.CULL) .setLightmapState(RenderStateShard.LIGHTMAP) .createCompositeState(false) ); diff --git a/src/main/java/com/alrex/parcool/common/action/ActionProcessor.java b/src/main/java/com/alrex/parcool/common/action/ActionProcessor.java index ffb3c17f..3f40d67f 100644 --- a/src/main/java/com/alrex/parcool/common/action/ActionProcessor.java +++ b/src/main/java/com/alrex/parcool/common/action/ActionProcessor.java @@ -20,8 +20,10 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.RenderFrameEvent; import net.neoforged.neoforge.client.event.ViewportEvent; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.network.PacketDistributor; @@ -41,12 +43,12 @@ public class ActionProcessor { AttributeModifier.Operation.ADD_VALUE ); - private final ByteBuffer bufferOfPostState = ByteBuffer.allocate(128); - private final ByteBuffer bufferOfPreState = ByteBuffer.allocate(128); - private final ByteBuffer bufferOfStarting = ByteBuffer.allocate(128); - private int staminaSyncCoolTimeTick = 0; - + private static final ByteBuffer bufferOfPostState = ByteBuffer.allocate(128); + private static final ByteBuffer bufferOfPreState = ByteBuffer.allocate(128); + private static final ByteBuffer bufferOfStarting = ByteBuffer.allocate(128); + private static int staminaSyncCoolTimeTick = 0; + @SubscribeEvent public void onTick(PlayerTickEvent.Post event) { var player = event.getEntity(); Parkourability parkourability = Parkourability.get(player); @@ -56,7 +58,7 @@ public void onTick(PlayerTickEvent.Post event) { onTick$doPreprocess(event); if (inClient) { - onTick$doPreprocessInClient(event, parkourability); + ClientActionProcessor.onTick$doPreprocessInClient(event, parkourability); } else { onTick$doPreprocessInServer(event); } @@ -65,7 +67,7 @@ public void onTick(PlayerTickEvent.Post event) { boolean needSync = player.isLocalPlayer(); if (needSync) { - onTick$checkLimitationSynchronization(player, parkourability); + ClientActionProcessor.onTick$checkLimitationSynchronization(player, parkourability); } parkourability.getAdditionalProperties().onTick(player, parkourability); @@ -76,10 +78,10 @@ public void onTick(PlayerTickEvent.Post event) { NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Tick.Post(player, action)); } if (needSync) { - onTick$sendSynchronizationPacket(player, syncStates); + ClientActionProcessor.onTick$sendSynchronizationPacket(player, syncStates); } - if (inClient) onTick$doPostProcessInClient(event, parkourability); + if (inClient) ClientActionProcessor.onTick$doPostProcessInClient(event, parkourability); } private void onTick$doPreprocess(PlayerTickEvent event) { @@ -89,64 +91,6 @@ public void onTick(PlayerTickEvent.Post event) { } - @OnlyIn(Dist.CLIENT) - private void onTick$doPreprocessInClient(PlayerTickEvent event, Parkourability parkourability) { - if (!(event.getEntity() instanceof AbstractClientPlayer clientPlayer)) return; - Animation animation = Animation.get(clientPlayer); - animation.tick(clientPlayer, parkourability); - } - - @OnlyIn(Dist.CLIENT) - private void onTick$doPostProcessInClient(PlayerTickEvent event, Parkourability parkourability) { - if (!(event.getEntity() instanceof LocalPlayer player)) return; - staminaSyncCoolTimeTick++; - if (!parkourability.limitationIsNotSynced()) { - var stamina = LocalStamina.get(player); - stamina.onTick(player); - staminaSyncCoolTimeTick++; - if (staminaSyncCoolTimeTick > 5) { - stamina.sync(player); - staminaSyncCoolTimeTick = 0; - } - } - var attr = player.getAttribute(Attributes.MOVEMENT_SPEED); - if (attr != null) { - if (LocalStamina.get(player).imposeExhaustionPenalty(player) && parkourability.getClientInfo().get(ParCoolConfig.Client.Booleans.EnableStaminaExhaustionPenalty)) { - player.setSprinting(false); - if (!attr.hasModifier(STAMINA_DEPLETED_SLOWNESS_MODIFIER_ID)) { - attr.addTransientModifier(STAMINA_DEPLETED_SLOWNESS_MODIFIER); - } - } else { - attr.removeModifier(STAMINA_DEPLETED_SLOWNESS_MODIFIER_ID); - } - } - } - - @OnlyIn(Dist.CLIENT) - private void onTick$checkLimitationSynchronization(Player player, Parkourability parkourability) { - if (player.isLocalPlayer() && player.tickCount > 127 && player.tickCount % 256 == 0 && parkourability.limitationIsNotSynced()) { - if (player instanceof LocalPlayer localPlayer) { - int trialCount = parkourability.getSynchronizeTrialCount(); - if (trialCount < 5) { - parkourability.trySyncLimitation(localPlayer, parkourability); - if (ParCoolConfig.Client.Booleans.ShowAutoResynchronizationNotification.get()) { - player.displayClientMessage(Component.translatable("parcool.message.error.limitation.not_synced"), false); - } - ParCool.LOGGER.log(Level.WARN, "Detected ParCool Limitation is not synced. Sending synchronization request..."); - } else if (trialCount == 5) { - parkourability.incrementSynchronizeTrialCount(); - player.displayClientMessage(Component.translatable("parcool.message.error.limitation.fail_sync").withStyle(ChatFormatting.DARK_RED), false); - ParCool.LOGGER.log(Level.ERROR, "Failed to synchronize ParCool Limitation. There may be problems about server connection. Please report to the developer after checking connection"); - } - } - } - } - - private void onTick$sendSynchronizationPacket(Player player, List syncStates) { - PacketDistributor.sendToServer(new ActionStatePayload(player.getUUID(), syncStates)); - - } - private void processAction(Player player, Parkourability parkourability, LinkedList syncStates, boolean inClientSide, Action action) { boolean needSync = player.isLocalPlayer(); @@ -163,7 +107,7 @@ private void processAction(Player player, Parkourability parkourability, LinkedL } if (needSync) { - checkAndChangeActionState(player, parkourability, action, syncStates); + ClientActionProcessor.checkAndChangeActionState(player, parkourability, action, syncStates); } if (action.isDoing()) { @@ -173,7 +117,7 @@ private void processAction(Player player, Parkourability parkourability, LinkedL if (needSync) { action.onWorkingTickInLocalClient(player, parkourability); if (action.getStaminaConsumeTiming() == StaminaConsumeTiming.OnWorking) { - consumeStamina(player, parkourability.getActionInfo().getStaminaConsumptionOf(action.getClass())); + ClientActionProcessor.consumeStamina(player, parkourability.getActionInfo().getStaminaConsumptionOf(action.getClass())); } } else { action.onWorkingTickInOtherClient(player, parkourability); @@ -201,90 +145,142 @@ private void processAction(Player player, Parkourability parkourability, LinkedL } } - @OnlyIn(Dist.CLIENT) - private void checkAndChangeActionState(Player player, Parkourability parkourability, Action action, LinkedList syncStates) { - if (!(player instanceof LocalPlayer localPlayer)) return; - if (action.isDoing()) { - boolean canContinue = parkourability.getActionInfo().can(action.getClass()) - && !player.getData(Attachments.STAMINA).isExhausted() - && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToContinueEvent(player, action)).isCanceled() - && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToContinue(player, action)).isCanceled() - && action.canContinue(player, parkourability); - if (!canContinue) { - NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Finish.Pre(player, action)); - action.finish(player); - NeoForge.EVENT_BUS.post(new ParCoolActionEvent.StopEvent(player, action)); - NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Finish.Post(player, action)); - syncStates.addLast(new ActionStatePayload.Entry(action.getClass(), ActionStatePayload.Entry.Type.Finish, new byte[0])); - } - } else { - bufferOfStarting.clear(); - boolean start = !player.isSpectator() - && !player.getData(Attachments.STAMINA).isExhausted() - && parkourability.getActionInfo().can(action.getClass()) - && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToStartEvent(player, action)).isCanceled() - && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToStart(player, action)).isCanceled() - && action.canStart(player, parkourability, bufferOfStarting); - bufferOfStarting.flip(); - if (start) { - NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Start.Pre(player, action)); - action.start(player, parkourability, bufferOfStarting); - NeoForge.EVENT_BUS.post(new ParCoolActionEvent.StartEvent(player, action)); - NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Start.Post(player, action)); - if (action.getStaminaConsumeTiming() == StaminaConsumeTiming.OnStart) { - consumeStamina(localPlayer, parkourability.getActionInfo().getStaminaConsumptionOf(action.getClass())); - } - var data = new byte[bufferOfStarting.remaining()]; - bufferOfStarting.get(data); - syncStates.addLast(new ActionStatePayload.Entry( - action.getClass(), - ActionStatePayload.Entry.Type.Start, - data - )); - } - } - } - private void saveSynchronizationState(Action action, ByteBuffer buffer) { buffer.clear(); action.saveSynchronizedState(buffer); buffer.flip(); } - @OnlyIn(Dist.CLIENT) - private void consumeStamina(Player player, int value) { - if (player instanceof LocalPlayer localPlayer) { - LocalStamina.get(localPlayer).consume(localPlayer, value); + public static class ClientActionProcessor { + private static void consumeStamina(Player player, int value) { + if (player instanceof LocalPlayer localPlayer) { + LocalStamina.get(localPlayer).consume(localPlayer, value); + } } - } - // ==== + private static void onTick$doPreprocessInClient(PlayerTickEvent event, Parkourability parkourability) { + if (!(event.getEntity() instanceof AbstractClientPlayer clientPlayer)) return; + Animation animation = Animation.get(clientPlayer); + animation.tick(clientPlayer, parkourability); + } + + private static void onTick$doPostProcessInClient(PlayerTickEvent event, Parkourability parkourability) { + if (!(event.getEntity() instanceof LocalPlayer player)) return; + staminaSyncCoolTimeTick++; + if (!parkourability.limitationIsNotSynced()) { + var stamina = LocalStamina.get(player); + stamina.onTick(player); + staminaSyncCoolTimeTick++; + if (staminaSyncCoolTimeTick > 5) { + stamina.sync(player); + staminaSyncCoolTimeTick = 0; + } + } + var attr = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attr != null) { + if (LocalStamina.get(player).imposeExhaustionPenalty(player) && parkourability.getClientInfo().get(ParCoolConfig.Client.Booleans.EnableStaminaExhaustionPenalty)) { + player.setSprinting(false); + if (!attr.hasModifier(STAMINA_DEPLETED_SLOWNESS_MODIFIER_ID)) { + attr.addTransientModifier(STAMINA_DEPLETED_SLOWNESS_MODIFIER); + } + } else { + attr.removeModifier(STAMINA_DEPLETED_SLOWNESS_MODIFIER_ID); + } + } + } + + private static void onTick$checkLimitationSynchronization(Player player, Parkourability parkourability) { + if (player.isLocalPlayer() && player.tickCount > 127 && player.tickCount % 256 == 0 && parkourability.limitationIsNotSynced()) { + if (player instanceof LocalPlayer localPlayer) { + int trialCount = parkourability.getSynchronizeTrialCount(); + if (trialCount < 5) { + parkourability.trySyncLimitation(localPlayer, parkourability); + if (ParCoolConfig.Client.Booleans.ShowAutoResynchronizationNotification.get()) { + player.displayClientMessage(Component.translatable("parcool.message.error.limitation.not_synced"), false); + } + ParCool.LOGGER.warn("Detected ParCool Limitation is not synced. Sending synchronization request..."); + } else if (trialCount == 5) { + parkourability.incrementSynchronizeTrialCount(); + player.displayClientMessage(Component.translatable("parcool.message.error.limitation.fail_sync").withStyle(ChatFormatting.DARK_RED), false); + ParCool.LOGGER.error("Failed to synchronize ParCool Limitation. There may be problems about server connection. Please report to the developer after checking connection"); + } + } + } + } + + private static void onTick$sendSynchronizationPacket(Player player, List syncStates) { + ClientPacketDistributor.sendToServer(new ActionStatePayload(player.getUUID(), syncStates)); + } + + private static void checkAndChangeActionState(Player player, Parkourability parkourability, Action action, LinkedList syncStates) { + if (!(player instanceof LocalPlayer localPlayer)) return; + if (action.isDoing()) { + boolean canContinue = parkourability.getActionInfo().can(action.getClass()) + && !player.getData(Attachments.STAMINA).isExhausted() + && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToContinueEvent(player, action)).isCanceled() + && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToContinue(player, action)).isCanceled() + && action.canContinue(player, parkourability); + if (!canContinue) { + NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Finish.Pre(player, action)); + action.finish(player); + NeoForge.EVENT_BUS.post(new ParCoolActionEvent.StopEvent(player, action)); + NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Finish.Post(player, action)); + syncStates.addLast(new ActionStatePayload.Entry(action.getClass(), ActionStatePayload.Entry.Type.Finish, new byte[0])); + } + } else { + bufferOfStarting.clear(); + boolean start = !player.isSpectator() + && !player.getData(Attachments.STAMINA).isExhausted() + && parkourability.getActionInfo().can(action.getClass()) + && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToStartEvent(player, action)).isCanceled() + && !NeoForge.EVENT_BUS.post(new ParCoolActionEvent.TryToStart(player, action)).isCanceled() + && action.canStart(player, parkourability, bufferOfStarting); + bufferOfStarting.flip(); + if (start) { + NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Start.Pre(player, action)); + action.start(player, parkourability, bufferOfStarting); + NeoForge.EVENT_BUS.post(new ParCoolActionEvent.StartEvent(player, action)); + NeoForge.EVENT_BUS.post(new ParCoolActionEvent.Start.Post(player, action)); + if (action.getStaminaConsumeTiming() == StaminaConsumeTiming.OnStart) { + consumeStamina(localPlayer, parkourability.getActionInfo().getStaminaConsumptionOf(action.getClass())); + } + var data = new byte[bufferOfStarting.remaining()]; + bufferOfStarting.get(data); + syncStates.addLast(new ActionStatePayload.Entry( + action.getClass(), + ActionStatePayload.Entry.Type.Start, + data + )); + } + } + } + + @SubscribeEvent + public void onRenderTick(RenderFrameEvent.Pre event) { + Player clientPlayer = Minecraft.getInstance().player; + if (clientPlayer == null) return; + for (Player player : clientPlayer.level().players()) { + Parkourability parkourability = Parkourability.get(player); + if (parkourability == null) return; + List actions = parkourability.getList(); + for (Action action : actions) { + action.onRenderTick(event, player, parkourability); + } + Animation animation = Animation.get(player); + if (animation == null) return; + animation.onRenderTick(event, player, parkourability); + } + } - @OnlyIn(Dist.CLIENT) - public void onRenderTick(RenderFrameEvent.Pre event) { - Player clientPlayer = Minecraft.getInstance().player; - if (clientPlayer == null) return; - for (Player player : clientPlayer.getCommandSenderWorld().players()) { + @SubscribeEvent + public void onViewRender(ViewportEvent.ComputeCameraAngles event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return; Parkourability parkourability = Parkourability.get(player); if (parkourability == null) return; - List actions = parkourability.getList(); - for (Action action : actions) { - action.onRenderTick(event, player, parkourability); - } Animation animation = Animation.get(player); if (animation == null) return; - animation.onRenderTick(event, player, parkourability); + animation.cameraSetup(event, player, parkourability); } } - - @OnlyIn(Dist.CLIENT) - public void onViewRender(ViewportEvent.ComputeCameraAngles event) { - LocalPlayer player = Minecraft.getInstance().player; - if (player == null) return; - Parkourability parkourability = Parkourability.get(player); - if (parkourability == null) return; - Animation animation = Animation.get(player); - if (animation == null) return; - animation.cameraSetup(event, player, parkourability); - } } diff --git a/src/main/java/com/alrex/parcool/common/action/AdditionalProperties.java b/src/main/java/com/alrex/parcool/common/action/AdditionalProperties.java index 6e458f25..36269bac 100644 --- a/src/main/java/com/alrex/parcool/common/action/AdditionalProperties.java +++ b/src/main/java/com/alrex/parcool/common/action/AdditionalProperties.java @@ -64,7 +64,7 @@ public void onTick(Player player, Parkourability parkourability) { } else { notCreativeFlyingTick++; } - if (player.isInWaterOrBubble()) { + if (player.isInWater()) { inWaterTick++; notInWaterTick = 0; } else { diff --git a/src/main/java/com/alrex/parcool/common/action/impl/BreakfallReady.java b/src/main/java/com/alrex/parcool/common/action/impl/BreakfallReady.java index 3acad7c5..752db813 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/BreakfallReady.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/BreakfallReady.java @@ -69,7 +69,7 @@ public boolean canContinue(Player player, Parkourability parkourability) { return (KeyBindings.getKeyBreakfall().isDown() && !player.getData(Attachments.STAMINA).isExhausted() && !parkourability.get(Crawl.class).isDoing() - && !player.isInWaterOrBubble() + && !player.isInWater() && (!player.onGround() || parkourability.getAdditionalProperties().getLandingTick() < 3) ); } diff --git a/src/main/java/com/alrex/parcool/common/action/impl/CatLeap.java b/src/main/java/com/alrex/parcool/common/action/impl/CatLeap.java index b4e90161..5086872b 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/CatLeap.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/CatLeap.java @@ -76,7 +76,7 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer public boolean canContinue(Player player, Parkourability parkourability) { return !((getDoingTick() > 1 && player.onGround()) || player.isFallFlying() - || player.isInWaterOrBubble() + || player.isInWater() || player.isInLava() ); } diff --git a/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java b/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java index 95f83fd2..9cd01456 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java @@ -73,7 +73,7 @@ public void onClientTick(Player player, Parkourability parkourability) { && parkourability.getActionInfo().can(ChargeJump.class) && !cp.isVisuallyCrawling() && !cp.isSprinting() - && !cp.isInWaterOrBubble() + && !cp.isInWater() && !cp.input.keyPresses.forward() && !cp.input.keyPresses.backward() && !cp.input.keyPresses.right() diff --git a/src/main/java/com/alrex/parcool/common/action/impl/Crawl.java b/src/main/java/com/alrex/parcool/common/action/impl/Crawl.java index 37b58239..764f7b8a 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/Crawl.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/Crawl.java @@ -34,7 +34,7 @@ && disambiguateCommands(player, pose) && !parkourability.get(RideZipline.class).isDoing() && player.getVehicle() == null && (pose == Pose.STANDING || pose == Pose.CROUCHING) - && !player.isInWaterOrBubble() + && !player.isInWater() && !player.isFallFlying() && !player.onClimbable() && (player.onGround() || ParCoolConfig.Client.Booleans.EnableCrawlInAir.get()); @@ -80,7 +80,7 @@ public boolean canContinue(Player player, Parkourability parkourability) { && !parkourability.get(Dive.class).isDoing() && parkourability.get(Vault.class).getNotDoingTick() >= 8 && player.getVehicle() == null - && !player.isInWaterOrBubble() + && !player.isInWater() && !player.isFallFlying() && !player.onClimbable() && (player.onGround() || ParCoolConfig.Client.Booleans.EnableCrawlInAir.get()); diff --git a/src/main/java/com/alrex/parcool/common/action/impl/Dive.java b/src/main/java/com/alrex/parcool/common/action/impl/Dive.java index f69a10f6..1c3eb1a8 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/Dive.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/Dive.java @@ -73,7 +73,7 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer public boolean canContinue(Player player, Parkourability parkourability) { return !(player.isFallFlying() || player.getAbilities().flying - || player.isInWaterOrBubble() + || player.isInWater() || player.isInLava() || player.isSwimming() || player.onGround() @@ -102,7 +102,7 @@ public void onStartInLocalClient(Player player, Parkourability parkourability, B @Override public void onStopInLocalClient(Player player) { - if (player.isInWaterOrBubble()) { + if (player.isInWater()) { Animation animation = Animation.get(player); Parkourability parkourability = Parkourability.get(player); if (animation != null @@ -117,7 +117,7 @@ public void onStopInLocalClient(Player player) { @Override public void onStopInOtherClient(Player player) { - if (player.isInWaterOrBubble()) { + if (player.isInWater()) { Animation animation = Animation.get(player); Parkourability parkourability = Parkourability.get(player); if (animation != null diff --git a/src/main/java/com/alrex/parcool/common/action/impl/Dodge.java b/src/main/java/com/alrex/parcool/common/action/impl/Dodge.java index f467c4a0..9e4ad6da 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/Dodge.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/Dodge.java @@ -150,9 +150,9 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer && player.onGround() && !isInSuccessiveCoolDown(parkourability.getActionInfo()) && coolTime <= 0 - && !player.isInWaterOrBubble() + && !player.isInWater() && player.onGround() - && !player.isInWaterOrBubble() + && !player.isInWater() && !player.isShiftKeyDown() && !parkourability.get(Crawl.class).isDoing() && !parkourability.get(Roll.class).isDoing() @@ -166,7 +166,7 @@ public boolean canContinue(Player player, Parkourability parkourability) { return !(parkourability.get(Roll.class).isDoing() || parkourability.get(ClingToCliff.class).isDoing() || getDoingTick() >= MAX_TICK - || player.isInWaterOrBubble() + || player.isInWater() || player.isFallFlying() || player.getAbilities().flying ); diff --git a/src/main/java/com/alrex/parcool/common/action/impl/FastRun.java b/src/main/java/com/alrex/parcool/common/action/impl/FastRun.java index ae8a60c3..e4a62f60 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/FastRun.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/FastRun.java @@ -77,7 +77,7 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer @Override public boolean canContinue(Player player, Parkourability parkourability) { - return (!player.isInWaterOrBubble() + return (!player.isInWater() && player.getVehicle() == null && !player.isFallFlying() && player.isSprinting() diff --git a/src/main/java/com/alrex/parcool/common/action/impl/FastSwim.java b/src/main/java/com/alrex/parcool/common/action/impl/FastSwim.java index d45189d6..4e889e4b 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/FastSwim.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/FastSwim.java @@ -37,7 +37,7 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer @Override public boolean canContinue(Player player, Parkourability parkourability) { - return (player.isInWaterOrBubble() + return (player.isInWater() && player.getVehicle() == null && !player.isFallFlying() && player.isSprinting() @@ -54,7 +54,7 @@ public void onClientTick(Player player, Parkourability parkourability) { if (player.isLocalPlayer()) { if (ParCoolConfig.Client.getInstance().FastRunControl.get() == FastRun.ControlType.Toggle && parkourability.getAdditionalProperties().getSprintingTick() > 3 - && player.isInWaterOrBubble() + && player.isInWater() && player.isSwimming() ) { if (KeyRecorder.keyFastRunning.isPressed()) diff --git a/src/main/java/com/alrex/parcool/common/action/impl/HorizontalWallRun.java b/src/main/java/com/alrex/parcool/common/action/impl/HorizontalWallRun.java index da6f731f..1a15e7ba 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/HorizontalWallRun.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/HorizontalWallRun.java @@ -73,8 +73,8 @@ public void onWorkingTickInLocalClient(Player player, Parkourability parkourabil Mth.floor(player.getBoundingBox().minY + player.getBbHeight() * 0.5), Mth.floor(player.getZ() + runningWallDirection.z()) ); - if (!player.getCommandSenderWorld().isLoaded(leanedBlock)) return; - float slipperiness = player.getCommandSenderWorld().getBlockState(leanedBlock).getFriction(player.getCommandSenderWorld(), leanedBlock, player); + if (!player.level().isLoaded(leanedBlock)) return; + float slipperiness = player.level().getBlockState(leanedBlock).getFriction(player.level(), leanedBlock, player); if (slipperiness <= 0.8) { double speedScale = 0.2; var attr = player.getAttribute(Attributes.MOVEMENT_SPEED); @@ -125,7 +125,7 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer && !parkourability.get(Dodge.class).isDoing() && !parkourability.get(Vault.class).isDoing() && !parkourability.get(ClingToCliff.class).isDoing() - && !player.isInWaterOrBubble() + && !player.isInWater() && Math.abs(player.getDeltaMovement().y()) < 0.5 && coolTime == 0 && !player.onGround() diff --git a/src/main/java/com/alrex/parcool/common/action/impl/RideZipline.java b/src/main/java/com/alrex/parcool/common/action/impl/RideZipline.java index c83da25d..1ff2f755 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/RideZipline.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/RideZipline.java @@ -143,7 +143,7 @@ public void onWorkingTickInLocalClient(Player player, Parkourability parkourabil speed *= 0.98; if (player.isInWater()) speed *= 0.8; speed -= gravity * slope * (Mth.invSqrt(slope * slope + 1)); - Vec3 input = new Vec3(-localPlayer.input.leftImpulse, 0., localPlayer.input.forwardImpulse); + Vec3 input = new Vec3(-localPlayer.input.getMoveVector().x, 0., localPlayer.input.getMoveVector().y); Vec3 offset = zipline.getOffsetToEndFromStart(); if (input.lengthSqr() > 0.01) { double dot = player.getLookAngle() diff --git a/src/main/java/com/alrex/parcool/common/action/impl/Roll.java b/src/main/java/com/alrex/parcool/common/action/impl/Roll.java index 3213ddb9..00018a9e 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/Roll.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/Roll.java @@ -57,11 +57,11 @@ public StaminaConsumeTiming getStaminaConsumeTiming() { public boolean canStart(Player player, Parkourability parkourability, ByteBuffer startInfo) { LocalPlayer clientPlayer = (LocalPlayer) player; Direction rollDirection = Direction.Front; - if (clientPlayer.input.leftImpulse < -0.5) { + if (clientPlayer.input.getMoveVector().x < -0.5) { rollDirection = Direction.Right; - } else if (clientPlayer.input.leftImpulse > 0.5) { + } else if (clientPlayer.input.getMoveVector().x > 0.5) { rollDirection = Direction.Left; - } else if (clientPlayer.input.forwardImpulse < -0.5) { + } else if (clientPlayer.input.getMoveVector().y < -0.5) { rollDirection = Direction.Back; } startInfo.putInt(rollDirection.ordinal()); diff --git a/src/main/java/com/alrex/parcool/common/action/impl/SkyDive.java b/src/main/java/com/alrex/parcool/common/action/impl/SkyDive.java index 6a9c72df..da6882db 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/SkyDive.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/SkyDive.java @@ -32,8 +32,8 @@ public void onWorkingTickInLocalClient(Player player, Parkourability parkourabil return; } Vec3 forwardVec = VectorUtil.fromYawDegree(player.yHeadRot); - Vec3 leftVec = forwardVec.yRot((float) Math.PI / 2).scale(clientPlayer.input.leftImpulse * 0.0); - forwardVec = forwardVec.scale(clientPlayer.input.forwardImpulse * 0.03); + Vec3 leftVec = forwardVec.yRot((float) Math.PI / 2).scale(clientPlayer.input.getMoveVector().x * 0.0); + forwardVec = forwardVec.scale(clientPlayer.input.getMoveVector().y * 0.03); clientPlayer.setDeltaMovement(clientPlayer.getDeltaMovement() .multiply( 1, diff --git a/src/main/java/com/alrex/parcool/common/action/impl/Slide.java b/src/main/java/com/alrex/parcool/common/action/impl/Slide.java index cbcf872e..05a0c66e 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/Slide.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/Slide.java @@ -38,7 +38,7 @@ public boolean canStart(Player player, Parkourability parkourability, ByteBuffer && !parkourability.get(Roll.class).isDoing() && !parkourability.get(Tap.class).isDoing() && parkourability.get(Crawl.class).isDoing() - && !player.isInWaterOrBubble() + && !player.isInWater() && parkourability.get(FastRun.class).getDashTick(parkourability.getAdditionalProperties()) > 5 ); } diff --git a/src/main/java/com/alrex/parcool/common/action/impl/VerticalWallRun.java b/src/main/java/com/alrex/parcool/common/action/impl/VerticalWallRun.java index fc7e9a81..152aa003 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/VerticalWallRun.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/VerticalWallRun.java @@ -65,8 +65,8 @@ && getNotDoingTick() > 15 Mth.floor(player.getBoundingBox().minY + player.getBbHeight() * 0.5), Mth.floor(player.getZ() + wall.z()) ); - if (!player.getCommandSenderWorld().isLoaded(targetBlock)) return false; - float slipperiness = player.getCommandSenderWorld().getBlockState(targetBlock).getFriction(player.getCommandSenderWorld(), targetBlock, player); + if (!player.level().isLoaded(targetBlock)) return false; + float slipperiness = player.level().getBlockState(targetBlock).getFriction(player.level(), targetBlock, player); startInfo.putDouble(height); startInfo.putFloat(slipperiness); startInfo.putDouble(wall.x()); diff --git a/src/main/java/com/alrex/parcool/common/action/impl/WallJump.java b/src/main/java/com/alrex/parcool/common/action/impl/WallJump.java index d57c1f97..b061d666 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/WallJump.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/WallJump.java @@ -114,7 +114,7 @@ public boolean checkCanStart(Player player, Parkourability parkourability, ByteB ClingToCliff cling = parkourability.get(ClingToCliff.class); boolean value = (!player.onGround() - && !player.isInWaterOrBubble() + && !player.isInWater() && !player.isFallFlying() && !player.getAbilities().flying && parkourability.getAdditionalProperties().getNotCreativeFlyingTick() > 10 @@ -191,8 +191,8 @@ public void onStartInLocalClient(Player player, Parkourability parkourability, B Mth.floor(player.getBoundingBox().minY + player.getBbHeight() * 0.25), Mth.floor(player.getZ() + wallDirection.z()) ); - float slipperiness = player.getCommandSenderWorld().isLoaded(leanedBlock) ? - player.getCommandSenderWorld().getBlockState(leanedBlock).getFriction(player.getCommandSenderWorld(), leanedBlock, player) + float slipperiness = player.level().isLoaded(leanedBlock) ? + player.level().getBlockState(leanedBlock).getFriction(player.level(), leanedBlock, player) : 0.6f; double ySpeed; diff --git a/src/main/java/com/alrex/parcool/common/action/impl/WallSlide.java b/src/main/java/com/alrex/parcool/common/action/impl/WallSlide.java index 888afdf7..dd2b7bf5 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/WallSlide.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/WallSlide.java @@ -103,8 +103,8 @@ public void onWorkingTick(Player player, Parkourability parkourability) { Mth.floor(player.getY() + player.getBbHeight() * 0.75), Mth.floor(player.getZ() + leanedWallDirection.z) ); - if (!player.getCommandSenderWorld().isLoaded(leanedBlock)) return; - float slipperiness = player.getCommandSenderWorld().getBlockState(leanedBlock).getFriction(player.getCommandSenderWorld(), leanedBlock, player); + if (!player.level().isLoaded(leanedBlock)) return; + float slipperiness = player.level().getBlockState(leanedBlock).getFriction(player.level(), leanedBlock, player); slipperiness = (float) Math.sqrt(slipperiness); player.fallDistance *= slipperiness; player.setDeltaMovement(player.getDeltaMovement().multiply(0.8, slipperiness, 0.8)); diff --git a/src/main/java/com/alrex/parcool/common/action/instant/StartSwimByCrawl.java b/src/main/java/com/alrex/parcool/common/action/instant/StartSwimByCrawl.java index 8be7df43..3ff4dc34 100644 --- a/src/main/java/com/alrex/parcool/common/action/instant/StartSwimByCrawl.java +++ b/src/main/java/com/alrex/parcool/common/action/instant/StartSwimByCrawl.java @@ -11,7 +11,7 @@ public class StartSwimByCrawl extends InstantAction { @Override public boolean canStart(Player player, Parkourability parkourability, ByteBuffer startInfo) { - return player.isInWaterOrBubble() + return player.isInWater() && !player.isSwimming() && KeyRecorder.keyCrawlState.isPressed(); } diff --git a/src/main/java/com/alrex/parcool/common/attachment/common/Parkourability.java b/src/main/java/com/alrex/parcool/common/attachment/common/Parkourability.java index c48793ca..607197c0 100644 --- a/src/main/java/com/alrex/parcool/common/attachment/common/Parkourability.java +++ b/src/main/java/com/alrex/parcool/common/attachment/common/Parkourability.java @@ -14,6 +14,7 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.network.PacketDistributor; import javax.annotation.Nullable; @@ -120,7 +121,7 @@ public double getLimitedValue(ParCoolConfig.Client.Doubles client, ParCoolConfig @OnlyIn(Dist.CLIENT) public void trySyncLimitation(LocalPlayer player, Parkourability parkourability) { synchronizeTrialCount++; - PacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); + ClientPacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/alrex/parcool/common/attachment/common/ReadonlyStamina.java b/src/main/java/com/alrex/parcool/common/attachment/common/ReadonlyStamina.java index 8707bfc0..9d9eef00 100644 --- a/src/main/java/com/alrex/parcool/common/attachment/common/ReadonlyStamina.java +++ b/src/main/java/com/alrex/parcool/common/attachment/common/ReadonlyStamina.java @@ -3,13 +3,16 @@ import com.alrex.parcool.api.Attributes; import com.alrex.parcool.common.network.payload.StaminaPayload; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.network.PacketDistributor; public record ReadonlyStamina(boolean isExhausted, int value, int max) { @@ -39,7 +42,7 @@ public ReadonlyStamina recovered(int value) { } @OnlyIn(Dist.CLIENT) - public ReadonlyStamina updateMax(LocalPlayer player) { + public ReadonlyStamina updateMax(Player player) { var attr = player.getAttribute(Attributes.MAX_STAMINA); if (attr == null) return this; var parkourability = Parkourability.get(player); @@ -50,11 +53,11 @@ public ReadonlyStamina updateMax(LocalPlayer player) { } @OnlyIn(Dist.CLIENT) - public void sync(LocalPlayer player) { - PacketDistributor.sendToServer(new StaminaPayload(player.getUUID(), this)); + public void sync(Player player) { + ClientPacketDistributor.sendToServer(new StaminaPayload(player.getUUID(), this)); } - public static final Codec CODEC = RecordCodecBuilder.create(staminaInstance -> + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(staminaInstance -> staminaInstance.group( Codec.BOOL.fieldOf("exhausted").forGetter(ReadonlyStamina::isExhausted), Codec.INT.fieldOf("value").forGetter(ReadonlyStamina::value), diff --git a/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookBlock.java b/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookBlock.java index 9eeee34b..b231c127 100644 --- a/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookBlock.java +++ b/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookBlock.java @@ -4,6 +4,7 @@ import com.alrex.parcool.common.block.TileEntities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; @@ -62,7 +63,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } @Override - public void onRemove(@Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState p_196243_4_, boolean p_196243_5_) { + public void affectNeighborsAfterRemoval(@Nonnull BlockState state, @Nonnull ServerLevel world, @Nonnull BlockPos pos, boolean movedByPiston) { if (!world.isClientSide()) { var tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof ZiplineHookTileEntity) { @@ -71,7 +72,7 @@ public void onRemove(@Nonnull BlockState state, @Nonnull Level world, @Nonnull B itemStacks.forEach((it) -> Containers.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), it)); } } - super.onRemove(state, world, pos, p_196243_4_, p_196243_5_); + super.affectNeighborsAfterRemoval(state, world, pos, movedByPiston); } @Override diff --git a/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookTileEntity.java b/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookTileEntity.java index 44105cae..33b6f906 100644 --- a/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookTileEntity.java +++ b/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineHookTileEntity.java @@ -1,5 +1,6 @@ package com.alrex.parcool.common.block.zipline; +import com.alrex.parcool.ParCool; import com.alrex.parcool.common.entity.zipline.ZiplineRopeEntity; import com.alrex.parcool.common.item.Items; import com.alrex.parcool.common.item.zipline.ZiplineRopeItem; @@ -9,6 +10,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.util.ARGB; +import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -16,6 +18,9 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.TagValueOutput; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; @@ -137,71 +142,74 @@ private ZiplineRopeEntity spawnRope(Level level, ZiplineHookTileEntity target, Z return result ? entity : null; } - private void saveTo(CompoundTag nbt) { - var connections = new ListTag(); + private void saveTo(ValueOutput output) { + var connections = output.childrenList("Connection"); for (Map.Entry infoEntry : getConnectionInfo().entrySet()) { - var entryTag = new CompoundTag(); + var entryTag = connections.addChild(); var pos = getBlockPos(); entryTag.putInt("rX", infoEntry.getKey().getX() - pos.getX()); entryTag.putInt("rY", infoEntry.getKey().getY() - pos.getY()); entryTag.putInt("rZ", infoEntry.getKey().getZ() - pos.getZ()); - entryTag.put("Info", infoEntry.getValue().save()); - connections.add(entryTag); + entryTag.store("Info", ZiplineInfo.CODEC, infoEntry.getValue()); } - nbt.put("Connection", connections); } - private void restoreFrom(CompoundTag nbt) { - Tag connections = nbt.get("Connection"); - if (!(connections instanceof ListTag listConnections)) { - return; - } - getConnectionInfo().clear(); - - for (Tag entry : listConnections) { - if (!(entry instanceof CompoundTag cTag)) - continue; - - BlockPos pos; - if (cTag.contains("rX") && cTag.contains("rY") && cTag.contains("rZ")) { - pos = getBlockPos().offset( - cTag.getInt("rX"), - cTag.getInt("rY"), - cTag.getInt("rZ") - ); - } else if (cTag.contains("X") && cTag.contains("Y") && cTag.contains("Z")) { - pos = new BlockPos(cTag.getInt("X"), cTag.getInt("Y"), cTag.getInt("Z")); - } else - continue; - ZiplineInfo info = ZiplineInfo.load(cTag.get("Info")); - getConnectionInfo().put(pos, info); - } + private void restoreFrom(ValueInput input) { + input.childrenList("Connection").ifPresent(connections -> { + getConnectionInfo().clear(); + + for (ValueInput entry : connections) { + BlockPos pos; + Optional rX = entry.getInt("rX"); + Optional rY = entry.getInt("rY"); + Optional rZ = entry.getInt("rZ"); + + Optional x = entry.getInt("X"); + Optional y = entry.getInt("Y"); + Optional z = entry.getInt("Z"); + + if (rX.isPresent() && rY.isPresent() && rZ.isPresent()) { + pos = getBlockPos().offset( + rX.get(), + rY.get(), + rZ.get() + ); + } else if (x.isPresent() && y.isPresent() && z.isPresent()) { + pos = new BlockPos(x.get(), y.get(), z.get()); + } else + continue; + ZiplineInfo info = entry.read("Info", ZiplineInfo.CODEC).orElseThrow(); + getConnectionInfo().put(pos, info); + } + }); } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { - super.saveAdditional(tag, registries); - saveTo(tag); + protected void saveAdditional(ValueOutput output) { + super.saveAdditional(output); + saveTo(output); } @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { - super.loadAdditional(tag, registries); - restoreFrom(tag); + protected void loadAdditional(ValueInput input) { + super.loadAdditional(input); + restoreFrom(input); } @Nonnull @Override public CompoundTag getUpdateTag(HolderLookup.Provider registries) { - var nbt = super.getUpdateTag(registries); - saveTo(nbt); - return nbt; + try (ProblemReporter.ScopedCollector collector = new ProblemReporter.ScopedCollector(this.problemPath(), ParCool.LOGGER)) { + var nbt = TagValueOutput.createWithContext(collector, registries); + saveTo(nbt); + return nbt.buildResult(); + } } @Override - public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider lookupProvider) { - super.handleUpdateTag(tag, lookupProvider); - restoreFrom(tag); + public void handleUpdateTag(ValueInput input) { + super.handleUpdateTag(input); + restoreFrom(input); } public static void tick(Level level, BlockPos pos, BlockState state, BlockEntity entity) { diff --git a/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineInfo.java b/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineInfo.java index ab8c3402..d3ac3d50 100644 --- a/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineInfo.java +++ b/src/main/java/com/alrex/parcool/common/block/zipline/ZiplineInfo.java @@ -2,12 +2,24 @@ import com.alrex.parcool.common.item.zipline.ZiplineRopeItem; import com.alrex.parcool.common.zipline.ZiplineType; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import javax.annotation.Nullable; public class ZiplineInfo { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + ZiplineType.CODEC.optionalFieldOf("type", ZiplineType.LOOSE) + .forGetter(ZiplineInfo::getType), + Codec.INT.optionalFieldOf("color", ZiplineRopeItem.DEFAULT_COLOR) + .forGetter(ZiplineInfo::getColor) + ) + .apply(instance, ZiplineInfo::new) + ); + public ZiplineInfo(ZiplineType type, int color) { this.color = color; this.type = type; @@ -24,22 +36,4 @@ public int getColor() { public ZiplineType getType() { return type; } - - public Tag save() { - var tag = new CompoundTag(); - tag.putInt("color", color); - tag.putByte("type", (byte) getType().ordinal()); - return tag; - } - - public static ZiplineInfo load(@Nullable Tag tag) { - if (tag instanceof CompoundTag cTag) { - int color = cTag.contains("color") ? cTag.getInt("color") : ZiplineRopeItem.DEFAULT_COLOR; - ZiplineType type = cTag.contains("type") ? - ZiplineType.values()[cTag.getByte("type") % ZiplineType.values().length] : - ZiplineType.LOOSE; - return new ZiplineInfo(type, color); - } - return new ZiplineInfo(ZiplineType.LOOSE, ZiplineRopeItem.DEFAULT_COLOR); - } } diff --git a/src/main/java/com/alrex/parcool/common/entity/zipline/ZiplineRopeEntity.java b/src/main/java/com/alrex/parcool/common/entity/zipline/ZiplineRopeEntity.java index 009afcea..a6015c35 100644 --- a/src/main/java/com/alrex/parcool/common/entity/zipline/ZiplineRopeEntity.java +++ b/src/main/java/com/alrex/parcool/common/entity/zipline/ZiplineRopeEntity.java @@ -19,6 +19,8 @@ import net.minecraft.world.entity.Pose; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; @@ -197,20 +199,20 @@ public boolean hurtServer(ServerLevel serverLevel, DamageSource damageSource, fl } @Override - public void readAdditionalSaveData(@Nonnull CompoundTag compoundNBT) { - setStartPos(new BlockPos(compoundNBT.getInt("Tile1_X"), compoundNBT.getInt("Tile1_Y"), compoundNBT.getInt("Tile1_Z"))); - setEndPos(new BlockPos(compoundNBT.getInt("Tile2_X"), compoundNBT.getInt("Tile2_Y"), compoundNBT.getInt("Tile2_Z"))); + public void readAdditionalSaveData(@Nonnull ValueInput input) { + setStartPos(new BlockPos(input.getIntOr("Tile1_X", 0), input.getIntOr("Tile1_Y", 0), input.getIntOr("Tile1_Z", 0))); + setEndPos(new BlockPos(input.getIntOr("Tile2_X", 0), input.getIntOr("Tile2_Y", 0), input.getIntOr("Tile2_Z", 0))); } @Override - public void addAdditionalSaveData(@Nonnull CompoundTag compoundNBT) { + public void addAdditionalSaveData(@Nonnull ValueOutput output) { BlockPos startPos = getStartPos(); BlockPos endPos = getEndPos(); - compoundNBT.putInt("Tile1_X", startPos.getX()); - compoundNBT.putInt("Tile1_X", startPos.getY()); - compoundNBT.putInt("Tile1_X", startPos.getZ()); - compoundNBT.putInt("Tile2_X", endPos.getX()); - compoundNBT.putInt("Tile2_X", endPos.getY()); - compoundNBT.putInt("Tile2_X", endPos.getZ()); + output.putInt("Tile1_X", startPos.getX()); + output.putInt("Tile1_X", startPos.getY()); + output.putInt("Tile1_X", startPos.getZ()); + output.putInt("Tile2_X", endPos.getX()); + output.putInt("Tile2_X", endPos.getY()); + output.putInt("Tile2_X", endPos.getZ()); } } diff --git a/src/main/java/com/alrex/parcool/common/handlers/EnableOrDisableParCoolHandler.java b/src/main/java/com/alrex/parcool/common/handlers/EnableOrDisableParCoolHandler.java index 57300885..b40f552c 100644 --- a/src/main/java/com/alrex/parcool/common/handlers/EnableOrDisableParCoolHandler.java +++ b/src/main/java/com/alrex/parcool/common/handlers/EnableOrDisableParCoolHandler.java @@ -13,6 +13,7 @@ import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.network.PacketDistributor; @OnlyIn(Dist.CLIENT) @@ -28,7 +29,7 @@ public static void onTick(ClientTickEvent.Post event) { Parkourability parkourability = Parkourability.get(player); if (parkourability == null) return; parkourability.getActionInfo().setClientSetting(ClientSetting.readFromLocalConfig()); - PacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), false, parkourability.getClientInfo())); + ClientPacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), false, parkourability.getClientInfo())); player.displayClientMessage(Component.translatable(currentStatus ? "parcool.message.enabled" : "parcool.message.disabled"), true); if (currentStatus) { player.playSound(SoundEvents.PARCOOL_ENABLE.get(), 1.0f, 1.0f); diff --git a/src/main/java/com/alrex/parcool/common/handlers/PlayerDamageHandler.java b/src/main/java/com/alrex/parcool/common/handlers/PlayerDamageHandler.java index 2fcb0831..f33e93e5 100644 --- a/src/main/java/com/alrex/parcool/common/handlers/PlayerDamageHandler.java +++ b/src/main/java/com/alrex/parcool/common/handlers/PlayerDamageHandler.java @@ -51,7 +51,7 @@ public static void onFall(LivingFallEvent event) { ParCoolConfig.Client.Integers.JustTimeBreakfallTick, ParCoolConfig.Server.Integers.MaxJustTimeBreakfallTick ); - float distance = event.getDistance(); + double distance = event.getDistance(); if (distance > parkourability.getLimitedValue( ParCoolConfig.Client.Doubles.LowestFallDistanceForBreakfall, ParCoolConfig.Server.Doubles.MinLowestFallDistanceForBreakfall diff --git a/src/main/java/com/alrex/parcool/common/handlers/PlayerJoinHandler.java b/src/main/java/com/alrex/parcool/common/handlers/PlayerJoinHandler.java index b9d86577..7d129199 100644 --- a/src/main/java/com/alrex/parcool/common/handlers/PlayerJoinHandler.java +++ b/src/main/java/com/alrex/parcool/common/handlers/PlayerJoinHandler.java @@ -7,6 +7,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.network.PacketDistributor; @@ -20,7 +21,7 @@ public static void onPlayerJoin(EntityJoinLevelEvent event) { Parkourability parkourability = Parkourability.get(player); if (parkourability == null) return; parkourability.getActionInfo().setClientSetting(ClientSetting.readFromLocalConfig()); - PacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); + ClientPacketDistributor.sendToServer(new ClientInformationPayload(player.getUUID(), true, parkourability.getClientInfo())); } } } diff --git a/src/main/java/com/alrex/parcool/common/item/zipline/ZiplineRopeItem.java b/src/main/java/com/alrex/parcool/common/item/zipline/ZiplineRopeItem.java index 65d2e986..235ecc9e 100644 --- a/src/main/java/com/alrex/parcool/common/item/zipline/ZiplineRopeItem.java +++ b/src/main/java/com/alrex/parcool/common/item/zipline/ZiplineRopeItem.java @@ -19,6 +19,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.DyedItemColor; +import net.minecraft.world.item.component.TooltipDisplay; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.entity.BlockEntity; @@ -27,6 +28,7 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.List; +import java.util.function.Consumer; public class ZiplineRopeItem extends Item { @@ -43,17 +45,18 @@ public ZiplineRopeItem(Properties p_i48487_1_) { PERCENT_FORMATTER = new DecimalFormat("##0.0", decimalFormatSymbols); } + @Override - public void appendHoverText(ItemStack stack, @Nonnull TooltipContext context, @Nonnull List lines, @Nonnull TooltipFlag tooltipFlag) { + public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisplay tooltipDisplay, Consumer tooltipAdder, TooltipFlag flag) { var posComponent = stack.getComponents().get(DataComponents.ZIPLINE_POSITION.get()); if (posComponent != null) { - lines.add(Component.translatable("parcool.gui.text.zipline.bind_pos", posComponent.pos().getX() + ", " + posComponent.pos().getY() + ", " + posComponent.pos().getZ()).withStyle(ChatFormatting.YELLOW)); + tooltipAdder.accept(Component.translatable("parcool.gui.text.zipline.bind_pos", posComponent.pos().getX() + ", " + posComponent.pos().getY() + ", " + posComponent.pos().getZ()).withStyle(ChatFormatting.YELLOW)); } else { - lines.add(Component.translatable("parcool.gui.text.zipline.not_bound").withStyle(ChatFormatting.DARK_GRAY)); + tooltipAdder.accept(Component.translatable("parcool.gui.text.zipline.not_bound").withStyle(ChatFormatting.DARK_GRAY)); } - lines.add(Component.empty()); - lines.add(Component.translatable("parcool.gui.text.zipline.tension", getZiplineType(stack).getTranslationName()).withStyle(ChatFormatting.GRAY)); + tooltipAdder.accept(Component.empty()); + tooltipAdder.accept(Component.translatable("parcool.gui.text.zipline.tension", getZiplineType(stack).getTranslationName()).withStyle(ChatFormatting.GRAY)); } @Nonnull @@ -186,7 +189,7 @@ public static BlockPos getBlockPosition(ItemStack stack) { public static void setColor(ItemStack stack, int color) { if (color != DEFAULT_COLOR) { - stack.set(net.minecraft.core.component.DataComponents.DYED_COLOR, new DyedItemColor(color, true)); + stack.set(net.minecraft.core.component.DataComponents.DYED_COLOR, new DyedItemColor(color)); }else { stack.remove(net.minecraft.core.component.DataComponents.DYED_COLOR); } diff --git a/src/main/java/com/alrex/parcool/common/network/NetworkRegistries.java b/src/main/java/com/alrex/parcool/common/network/NetworkRegistries.java index 287a2ef3..b0268079 100644 --- a/src/main/java/com/alrex/parcool/common/network/NetworkRegistries.java +++ b/src/main/java/com/alrex/parcool/common/network/NetworkRegistries.java @@ -2,8 +2,8 @@ import com.alrex.parcool.common.network.payload.*; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; -import net.neoforged.neoforge.network.handling.DirectionalPayloadHandler; public class NetworkRegistries { private static final String PROTOCOL_VERSION = "3.3.0.0"; @@ -14,50 +14,42 @@ public static void onRegisterPayload(RegisterPayloadHandlersEvent event) { r.playBidirectional( StartBreakfallEventPayload.TYPE, StartBreakfallEventPayload.CODEC, - new DirectionalPayloadHandler<>( - StartBreakfallEventPayload::handleClient, - StartBreakfallEventPayload::handleServer - ) + StartBreakfallEventPayload::handleServer ); r.playBidirectional( ActionStatePayload.TYPE, ActionStatePayload.CODEC, - new DirectionalPayloadHandler<>( - ActionStatePayload::handleClient, - ActionStatePayload::handleServer - ) + ActionStatePayload::handleServer ); r.playBidirectional( LimitationPayload.TYPE, LimitationPayload.CODEC, - new DirectionalPayloadHandler<>( - LimitationPayload::handleClient, - LimitationPayload::handleServer - ) + LimitationPayload::handleServer ); r.playBidirectional( ClientInformationPayload.TYPE, ClientInformationPayload.CODEC, - new DirectionalPayloadHandler<>( - ClientInformationPayload::handleClient, - ClientInformationPayload::handleServer - ) + ClientInformationPayload::handleServer ); r.playBidirectional( StaminaPayload.TYPE, StaminaPayload.CODEC, - new DirectionalPayloadHandler<>( - StaminaPayload::handleClient, - StaminaPayload::handleServer - ) + StaminaPayload::handleServer ); r.playBidirectional( StaminaProcessOnServerPayload.TYPE, StaminaProcessOnServerPayload.CODEC, - new DirectionalPayloadHandler<>( - StaminaProcessOnServerPayload::handleClient, - StaminaProcessOnServerPayload::handleServer - ) + StaminaProcessOnServerPayload::handleServer ); } + + @SubscribeEvent + public static void onRegisterClientPayloads(RegisterClientPayloadHandlersEvent event) { + event.register(StartBreakfallEventPayload.TYPE, StartBreakfallEventPayload::handleClient); + event.register(ActionStatePayload.TYPE, ActionStatePayload::handleClient); + event.register(LimitationPayload.TYPE, LimitationPayload::handleClient); + event.register(ClientInformationPayload.TYPE, ClientInformationPayload::handleClient); + event.register(StaminaPayload.TYPE, StaminaPayload::handleClient); + event.register(StaminaProcessOnServerPayload.TYPE, StaminaProcessOnServerPayload::handleClient); + } } diff --git a/src/main/java/com/alrex/parcool/common/registries/EventBusForgeRegistry.java b/src/main/java/com/alrex/parcool/common/registries/EventBusForgeRegistry.java index 343a755c..65512422 100644 --- a/src/main/java/com/alrex/parcool/common/registries/EventBusForgeRegistry.java +++ b/src/main/java/com/alrex/parcool/common/registries/EventBusForgeRegistry.java @@ -8,8 +8,6 @@ import net.neoforged.bus.api.IEventBus; public class EventBusForgeRegistry { - private static final ActionProcessor ACTION_PROCESSOR = new ActionProcessor(); - public static void register(IEventBus bus) { bus.register(ParCoolBrewingRecipe.class); bus.register(PlayerJumpHandler.class); @@ -17,8 +15,7 @@ public static void register(IEventBus bus) { bus.register(PlayerVisibilityHandler.class); bus.register(PlayerDamageHandler.class); bus.register(PlayerCloneHandler.class); - - bus.addListener(ACTION_PROCESSOR::onTick); + bus.register(new ActionProcessor()); } public static void registerClient(IEventBus bus) { @@ -28,8 +25,6 @@ public static void registerClient(IEventBus bus) { bus.register(PlayerJoinHandler.class); bus.register(HUDManager.getInstance()); bus.register(InputHandler.class); - - bus.addListener(ACTION_PROCESSOR::onRenderTick); - bus.addListener(ACTION_PROCESSOR::onViewRender); + bus.register(new ActionProcessor.ClientActionProcessor()); } } diff --git a/src/main/java/com/alrex/parcool/common/stamina/IParCoolStaminaHandler.java b/src/main/java/com/alrex/parcool/common/stamina/IParCoolStaminaHandler.java index e2953a2f..ba23a034 100644 --- a/src/main/java/com/alrex/parcool/common/stamina/IParCoolStaminaHandler.java +++ b/src/main/java/com/alrex/parcool/common/stamina/IParCoolStaminaHandler.java @@ -8,21 +8,21 @@ public interface IParCoolStaminaHandler { @OnlyIn(Dist.CLIENT) - public ReadonlyStamina initializeStamina(LocalPlayer player, ReadonlyStamina current); + public ReadonlyStamina initializeStamina(Player player, ReadonlyStamina current); @OnlyIn(Dist.CLIENT) - public ReadonlyStamina consume(LocalPlayer player, ReadonlyStamina current, int value); + public ReadonlyStamina consume(Player player, ReadonlyStamina current, int value); @OnlyIn(Dist.CLIENT) - public ReadonlyStamina recover(LocalPlayer player, ReadonlyStamina current, int value); + public ReadonlyStamina recover(Player player, ReadonlyStamina current, int value); @OnlyIn(Dist.CLIENT) - public default ReadonlyStamina onTick(LocalPlayer player, ReadonlyStamina current) { + public default ReadonlyStamina onTick(Player player, ReadonlyStamina current) { return current; } @OnlyIn(Dist.CLIENT) - public default boolean shouldShowHUD(LocalPlayer player) { + public default boolean shouldShowHUD(Player player) { return false; } diff --git a/src/main/java/com/alrex/parcool/common/stamina/handlers/HungerStaminaHandler.java b/src/main/java/com/alrex/parcool/common/stamina/handlers/HungerStaminaHandler.java index cc28b68d..e5e2d234 100644 --- a/src/main/java/com/alrex/parcool/common/stamina/handlers/HungerStaminaHandler.java +++ b/src/main/java/com/alrex/parcool/common/stamina/handlers/HungerStaminaHandler.java @@ -8,6 +8,7 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import net.neoforged.neoforge.network.PacketDistributor; public class HungerStaminaHandler implements IParCoolStaminaHandler { @@ -15,28 +16,28 @@ public class HungerStaminaHandler implements IParCoolStaminaHandler { @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina initializeStamina(LocalPlayer player, ReadonlyStamina current) { + public ReadonlyStamina initializeStamina(Player player, ReadonlyStamina current) { return new ReadonlyStamina(false, player.getFoodData().getFoodLevel(), 20); } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina consume(LocalPlayer player, ReadonlyStamina current, int value) { + public ReadonlyStamina consume(Player player, ReadonlyStamina current, int value) { consumed += value; return current; } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina recover(LocalPlayer player, ReadonlyStamina current, int value) { + public ReadonlyStamina recover(Player player, ReadonlyStamina current, int value) { return current; } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina onTick(LocalPlayer player, ReadonlyStamina current) { + public ReadonlyStamina onTick(Player player, ReadonlyStamina current) { if (consumed > 0) { - PacketDistributor.sendToServer(new StaminaProcessOnServerPayload(StaminaType.HUNGER, consumed)); + ClientPacketDistributor.sendToServer(new StaminaProcessOnServerPayload(StaminaType.HUNGER, consumed)); consumed = 0; } return new ReadonlyStamina( diff --git a/src/main/java/com/alrex/parcool/common/stamina/handlers/InfiniteStaminaHandler.java b/src/main/java/com/alrex/parcool/common/stamina/handlers/InfiniteStaminaHandler.java index 3aecacef..9b40f066 100644 --- a/src/main/java/com/alrex/parcool/common/stamina/handlers/InfiniteStaminaHandler.java +++ b/src/main/java/com/alrex/parcool/common/stamina/handlers/InfiniteStaminaHandler.java @@ -3,6 +3,7 @@ import com.alrex.parcool.common.attachment.common.ReadonlyStamina; import com.alrex.parcool.common.stamina.IParCoolStaminaHandler; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -11,19 +12,19 @@ public class InfiniteStaminaHandler implements IParCoolStaminaHandler { @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina initializeStamina(LocalPlayer player, ReadonlyStamina current) { + public ReadonlyStamina initializeStamina(Player player, ReadonlyStamina current) { return INSTANCE; } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina consume(LocalPlayer player, ReadonlyStamina current, int value) { + public ReadonlyStamina consume(Player player, ReadonlyStamina current, int value) { return INSTANCE; } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina recover(LocalPlayer player, ReadonlyStamina current, int value) { + public ReadonlyStamina recover(Player player, ReadonlyStamina current, int value) { return INSTANCE; } } diff --git a/src/main/java/com/alrex/parcool/common/stamina/handlers/ParCoolStaminaHandler.java b/src/main/java/com/alrex/parcool/common/stamina/handlers/ParCoolStaminaHandler.java index a633aa0f..5ef4428f 100644 --- a/src/main/java/com/alrex/parcool/common/stamina/handlers/ParCoolStaminaHandler.java +++ b/src/main/java/com/alrex/parcool/common/stamina/handlers/ParCoolStaminaHandler.java @@ -5,6 +5,7 @@ import com.alrex.parcool.common.attachment.common.ReadonlyStamina; import com.alrex.parcool.common.stamina.IParCoolStaminaHandler; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -13,26 +14,26 @@ public class ParCoolStaminaHandler implements IParCoolStaminaHandler { @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina initializeStamina(LocalPlayer player, ReadonlyStamina current) { + public ReadonlyStamina initializeStamina(Player player, ReadonlyStamina current) { return current; } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina consume(LocalPlayer player, ReadonlyStamina current, int value) { + public ReadonlyStamina consume(Player player, ReadonlyStamina current, int value) { recoveryCoolDown = 30; return current.consumed(value); } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina recover(LocalPlayer player, ReadonlyStamina current, int value) { + public ReadonlyStamina recover(Player player, ReadonlyStamina current, int value) { return current.recovered(value); } @OnlyIn(Dist.CLIENT) @Override - public ReadonlyStamina onTick(LocalPlayer player, ReadonlyStamina current) { + public ReadonlyStamina onTick(Player player, ReadonlyStamina current) { if (recoveryCoolDown > 0) { recoveryCoolDown--; } @@ -54,7 +55,7 @@ public ReadonlyStamina onTick(LocalPlayer player, ReadonlyStamina current) { @OnlyIn(Dist.CLIENT) @Override - public boolean shouldShowHUD(LocalPlayer player) { + public boolean shouldShowHUD(Player player) { return true; } } diff --git a/src/main/java/com/alrex/parcool/common/zipline/ZiplineType.java b/src/main/java/com/alrex/parcool/common/zipline/ZiplineType.java index 2a5152a5..73422feb 100644 --- a/src/main/java/com/alrex/parcool/common/zipline/ZiplineType.java +++ b/src/main/java/com/alrex/parcool/common/zipline/ZiplineType.java @@ -2,7 +2,9 @@ import com.alrex.parcool.common.zipline.impl.GeneralQuadraticCurveZipline; import com.alrex.parcool.common.zipline.impl.StraightZipline; +import com.mojang.serialization.Codec; import net.minecraft.network.chat.Component; +import net.minecraft.util.ExtraCodecs; import net.minecraft.world.phys.Vec3; public enum ZiplineType { @@ -11,6 +13,8 @@ public enum ZiplineType { LOOSE("parcool.gui.text.zipline.type.loose"), VERY_LOOSE("parcool.gui.text.zipline.type.very_loose"); + public static final Codec CODEC = ExtraCodecs.idResolverCodec(ZiplineType::ordinal, i -> ZiplineType.values()[i], 0); + private ZiplineType(String translation) { this.translationID = translation; } diff --git a/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightManager.java b/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightManager.java index 348ca803..bedf8be7 100644 --- a/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightManager.java +++ b/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightManager.java @@ -1,40 +1,40 @@ -package com.alrex.parcool.extern.epicfight; - -import com.alrex.parcool.common.attachment.common.Parkourability; -import com.alrex.parcool.common.stamina.IParCoolStaminaHandler; -import com.alrex.parcool.common.stamina.StaminaType; -import com.alrex.parcool.common.stamina.handlers.ParCoolStaminaHandler; -import com.alrex.parcool.extern.ModManager; -import net.minecraft.world.entity.player.Player; -import yesman.epicfight.world.capabilities.EpicFightCapabilities; -import yesman.epicfight.world.capabilities.entitypatch.player.PlayerPatch; - -import javax.annotation.Nullable; - -public class EpicFightManager extends ModManager { - public EpicFightManager() { - super("epicfight"); - } - - public IParCoolStaminaHandler newStaminaHandlerFor(Player player) { - if (isUsingEpicFightStamina(Parkourability.get(player))) { - return new EpicFightStaminaHandler(); - } - return new ParCoolStaminaHandler(); - } - - @Nullable - PlayerPatch getPlayerPatch(Player player) { - if (!isInstalled()) { - return null; - } - return EpicFightCapabilities.getPlayerPatch(player); - } - - public boolean isUsingEpicFightStamina(Parkourability parkourability) { - if (!isInstalled()) return false; - var forcedStamina = parkourability.getServerLimitation().getForcedStamina(); - if (forcedStamina == StaminaType.EPIC_FIGHT) return true; - return forcedStamina == StaminaType.NONE && parkourability.getClientInfo().getRequestedStamina() == StaminaType.EPIC_FIGHT; - } -} +//package com.alrex.parcool.extern.epicfight; +// +//import com.alrex.parcool.common.attachment.common.Parkourability; +//import com.alrex.parcool.common.stamina.IParCoolStaminaHandler; +//import com.alrex.parcool.common.stamina.StaminaType; +//import com.alrex.parcool.common.stamina.handlers.ParCoolStaminaHandler; +//import com.alrex.parcool.extern.ModManager; +//import net.minecraft.world.entity.player.Player; +//import yesman.epicfight.world.capabilities.EpicFightCapabilities; +//import yesman.epicfight.world.capabilities.entitypatch.player.PlayerPatch; +// +//import javax.annotation.Nullable; +// +//public class EpicFightManager extends ModManager { +// public EpicFightManager() { +// super("epicfight"); +// } +// +// public IParCoolStaminaHandler newStaminaHandlerFor(Player player) { +// if (isUsingEpicFightStamina(Parkourability.get(player))) { +// return new EpicFightStaminaHandler(); +// } +// return new ParCoolStaminaHandler(); +// } +// +// @Nullable +// PlayerPatch getPlayerPatch(Player player) { +// if (!isInstalled()) { +// return null; +// } +// return EpicFightCapabilities.getPlayerPatch(player); +// } +// +// public boolean isUsingEpicFightStamina(Parkourability parkourability) { +// if (!isInstalled()) return false; +// var forcedStamina = parkourability.getServerLimitation().getForcedStamina(); +// if (forcedStamina == StaminaType.EPIC_FIGHT) return true; +// return forcedStamina == StaminaType.NONE && parkourability.getClientInfo().getRequestedStamina() == StaminaType.EPIC_FIGHT; +// } +//} diff --git a/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightStaminaHandler.java b/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightStaminaHandler.java index 10063012..d169cd21 100644 --- a/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightStaminaHandler.java +++ b/src/main/java/com/alrex/parcool/extern/epicfight/EpicFightStaminaHandler.java @@ -1,81 +1,81 @@ -package com.alrex.parcool.extern.epicfight; - -import com.alrex.parcool.common.attachment.common.ReadonlyStamina; -import com.alrex.parcool.common.network.payload.StaminaProcessOnServerPayload; -import com.alrex.parcool.common.stamina.IParCoolStaminaHandler; -import com.alrex.parcool.common.stamina.StaminaType; -import com.alrex.parcool.extern.AdditionalMods; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.entity.player.Player; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.network.PacketDistributor; -import yesman.epicfight.world.capabilities.entitypatch.player.PlayerPatch; - -import javax.annotation.Nullable; - -public class EpicFightStaminaHandler implements IParCoolStaminaHandler { - private float consumed = 0; - - private ReadonlyStamina readCurrentStamina(Player player, @Nullable ReadonlyStamina current) { - var patch = AdditionalMods.epicFight().getPlayerPatch(player); - if (patch == null) { - if (current == null) return ReadonlyStamina.createDefault(); - else return current; - } - - return new ReadonlyStamina( - !patch.hasStamina(1), - (int) patch.getStamina(), - (int) patch.getMaxStamina() - ); - } - - @Override - @OnlyIn(Dist.CLIENT) - public ReadonlyStamina initializeStamina(LocalPlayer player, ReadonlyStamina current) { - return readCurrentStamina(player, current); - } - - @Override - @OnlyIn(Dist.CLIENT) - public ReadonlyStamina consume(LocalPlayer player, ReadonlyStamina current, int value) { - consumed += value / 60f; - return current; - } - - @Override - @OnlyIn(Dist.CLIENT) - public ReadonlyStamina recover(LocalPlayer player, ReadonlyStamina current, int value) { - consumed -= value / 60f; - return current; - } - - @Override - public ReadonlyStamina onTick(LocalPlayer player, ReadonlyStamina current) { - if (consumed != 0) { - PacketDistributor.sendToServer(new StaminaProcessOnServerPayload(StaminaType.EPIC_FIGHT, (int) (consumed * 2048))); - consumed = 0; - } - return readCurrentStamina(player, current); - } - - @Override - public boolean shouldImposeExhaustionPenalty(LocalPlayer player, ReadonlyStamina current) { - return false; - } - - @Override - public void processOnServer(Player player, int value) { - float consumedValue = value / 2048f; - PlayerPatch patch = AdditionalMods.epicFight().getPlayerPatch(player); - if (patch == null) return; - patch.resetActionTick(); - patch.setStamina(patch.getStamina() - consumedValue); - } - - @Override - public boolean isExternalStamina() { - return true; - } -} +//package com.alrex.parcool.extern.epicfight; +// +//import com.alrex.parcool.common.attachment.common.ReadonlyStamina; +//import com.alrex.parcool.common.network.payload.StaminaProcessOnServerPayload; +//import com.alrex.parcool.common.stamina.IParCoolStaminaHandler; +//import com.alrex.parcool.common.stamina.StaminaType; +//import com.alrex.parcool.extern.AdditionalMods; +//import net.minecraft.client.player.LocalPlayer; +//import net.minecraft.world.entity.player.Player; +//import net.neoforged.api.distmarker.Dist; +//import net.neoforged.api.distmarker.OnlyIn; +//import net.neoforged.neoforge.network.PacketDistributor; +//import yesman.epicfight.world.capabilities.entitypatch.player.PlayerPatch; +// +//import javax.annotation.Nullable; +// +//public class EpicFightStaminaHandler implements IParCoolStaminaHandler { +// private float consumed = 0; +// +// private ReadonlyStamina readCurrentStamina(Player player, @Nullable ReadonlyStamina current) { +// var patch = AdditionalMods.epicFight().getPlayerPatch(player); +// if (patch == null) { +// if (current == null) return ReadonlyStamina.createDefault(); +// else return current; +// } +// +// return new ReadonlyStamina( +// !patch.hasStamina(1), +// (int) patch.getStamina(), +// (int) patch.getMaxStamina() +// ); +// } +// +// @Override +// @OnlyIn(Dist.CLIENT) +// public ReadonlyStamina initializeStamina(LocalPlayer player, ReadonlyStamina current) { +// return readCurrentStamina(player, current); +// } +// +// @Override +// @OnlyIn(Dist.CLIENT) +// public ReadonlyStamina consume(LocalPlayer player, ReadonlyStamina current, int value) { +// consumed += value / 60f; +// return current; +// } +// +// @Override +// @OnlyIn(Dist.CLIENT) +// public ReadonlyStamina recover(LocalPlayer player, ReadonlyStamina current, int value) { +// consumed -= value / 60f; +// return current; +// } +// +// @Override +// public ReadonlyStamina onTick(LocalPlayer player, ReadonlyStamina current) { +// if (consumed != 0) { +// PacketDistributor.sendToServer(new StaminaProcessOnServerPayload(StaminaType.EPIC_FIGHT, (int) (consumed * 2048))); +// consumed = 0; +// } +// return readCurrentStamina(player, current); +// } +// +// @Override +// public boolean shouldImposeExhaustionPenalty(LocalPlayer player, ReadonlyStamina current) { +// return false; +// } +// +// @Override +// public void processOnServer(Player player, int value) { +// float consumedValue = value / 2048f; +// PlayerPatch patch = AdditionalMods.epicFight().getPlayerPatch(player); +// if (patch == null) return; +// patch.resetActionTick(); +// patch.setStamina(patch.getStamina() - consumedValue); +// } +// +// @Override +// public boolean isExternalStamina() { +// return true; +// } +//} diff --git a/src/main/java/com/alrex/parcool/mixin/common/LivingEntityMixin.java b/src/main/java/com/alrex/parcool/mixin/common/LivingEntityMixin.java index ea29207c..1ce6d7e8 100644 --- a/src/main/java/com/alrex/parcool/mixin/common/LivingEntityMixin.java +++ b/src/main/java/com/alrex/parcool/mixin/common/LivingEntityMixin.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.common.NeoForgeConfig; +import net.neoforged.neoforge.common.config.NeoForgeServerConfig; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -84,7 +84,7 @@ public void onClimbable(CallbackInfoReturnable cir) { public boolean parCool$isLivingOnCustomLadder(@Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull LivingEntity entity) { boolean isSpectator = (entity instanceof Player && entity.isSpectator()); if (isSpectator) return false; - if (!NeoForgeConfig.SERVER.fullBoundingBoxLadders.get()) { + if (!NeoForgeServerConfig.INSTANCE.fullBoundingBoxLadders.get()) { return parCool$isCustomLadder(state, world, pos, entity); } else { AABB bb = entity.getBoundingBox(); diff --git a/src/main/java/com/alrex/parcool/server/command/impl/ZiplineCommand.java b/src/main/java/com/alrex/parcool/server/command/impl/ZiplineCommand.java index 4dc0bb55..ecf52241 100644 --- a/src/main/java/com/alrex/parcool/server/command/impl/ZiplineCommand.java +++ b/src/main/java/com/alrex/parcool/server/command/impl/ZiplineCommand.java @@ -13,6 +13,7 @@ import net.minecraft.commands.arguments.CompoundTagArgument; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.NbtOps; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -69,7 +70,7 @@ private static int setZipline(CommandContext context, boolea ZiplineInfo info; if (hasInfo) { var infoTag = CompoundTagArgument.getCompoundTag(context, ARGS_NAME_ZIPLINE_INFO); - info = ZiplineInfo.load(infoTag); + info = ZiplineInfo.CODEC.decode(NbtOps.INSTANCE, infoTag).getOrThrow().getFirst(); } else { info = new ZiplineInfo(ZiplineType.STANDARD, ZiplineRopeItem.DEFAULT_COLOR); } diff --git a/src/main/java/com/alrex/parcool/utilities/WorldUtil.java b/src/main/java/com/alrex/parcool/utilities/WorldUtil.java index d2eb0e20..9a9df631 100644 --- a/src/main/java/com/alrex/parcool/utilities/WorldUtil.java +++ b/src/main/java/com/alrex/parcool/utilities/WorldUtil.java @@ -112,7 +112,7 @@ public static Vec3 getWall(LivingEntity entity, double range) { @Nullable public static Vec3 getVaultableStep(LivingEntity entity) { final double d = entity.getBbWidth() * 0.5; - Level world = entity.getCommandSenderWorld(); + Level world = entity.level(); double distance = entity.getBbWidth() / 2; double baseLine = Math.min(entity.getBbHeight() * 0.86, getWallHeight(entity)); double stepX = 0; @@ -234,18 +234,18 @@ public static HangDown.BarAxis getHangableBars(LivingEntity entity) { entity.getY() + entity.getBbHeight() + bbHeight, entity.getZ() + bbWidth ); - if (entity.getCommandSenderWorld().noCollision(entity, bb)) return null; + if (entity.level().noCollision(entity, bb)) return null; BlockPos pos = new BlockPos( Mth.floor(entity.getX()), Mth.floor(entity.getY() + entity.getBbHeight() + 0.4), Mth.floor(entity.getZ()) ); - if (!entity.getCommandSenderWorld().isLoaded(pos)) return null; - BlockState state = entity.getCommandSenderWorld().getBlockState(pos); + if (!entity.level().isLoaded(pos)) return null; + BlockState state = entity.level().getBlockState(pos); Block block = state.getBlock(); HangDown.BarAxis axis = null; if (block instanceof RotatedPillarBlock) { - if (state.isCollisionShapeFullBlock(entity.getCommandSenderWorld(), pos)) { + if (state.isCollisionShapeFullBlock(entity.level(), pos)) { return null; } Direction.Axis pillarAxis = state.getValue(RotatedPillarBlock.AXIS); @@ -283,10 +283,10 @@ public static HangDown.BarAxis getHangableBars(LivingEntity entity) { } else if (block instanceof WallBlock) { int zCount = 0; int xCount = 0; - if (state.getValue(WallBlock.NORTH_WALL) != WallSide.NONE) zCount++; - if (state.getValue(WallBlock.SOUTH_WALL) != WallSide.NONE) zCount++; - if (state.getValue(WallBlock.EAST_WALL) != WallSide.NONE) xCount++; - if (state.getValue(WallBlock.WEST_WALL) != WallSide.NONE) xCount++; + if (state.getValue(WallBlock.NORTH) != WallSide.NONE) zCount++; + if (state.getValue(WallBlock.SOUTH) != WallSide.NONE) zCount++; + if (state.getValue(WallBlock.EAST) != WallSide.NONE) xCount++; + if (state.getValue(WallBlock.WEST) != WallSide.NONE) xCount++; if (zCount > 0 && xCount == 0) axis = HangDown.BarAxis.Z; if (xCount > 0 && zCount == 0) axis = HangDown.BarAxis.X; } @@ -315,7 +315,7 @@ public static boolean existsSpaceBelow(LivingEntity entity) { return world.noCollision(boundingBox); } public static boolean existsDivableSpace(LivingEntity entity) { - Level world = entity.getCommandSenderWorld(); + Level world = entity.level(); double width = entity.getBbWidth() * 1.5; double height = entity.getBbHeight() * 1.5; double wideWidth = entity.getBbWidth() * 2; @@ -401,7 +401,7 @@ public static Vec3 getGrabbableWall(LivingEntity entity) { private static Vec3 getGrabbableWall(LivingEntity entity, double distance, double baseLine) { final double d = entity.getBbWidth() * 0.49; - Level world = entity.getCommandSenderWorld(); + Level world = entity.level(); Vec3 pos = entity.position(); AABB baseBoxSide = new AABB( pos.x() - d, @@ -445,11 +445,11 @@ private static Vec3 getGrabbableWall(LivingEntity entity, double distance, doubl Mth.floor(entity.getBoundingBox().minY + baseLine - 0.3), Mth.floor(entity.getZ() + zDirection) ); - if (!entity.getCommandSenderWorld().isLoaded(blockPos1)) return null; - if (!entity.getCommandSenderWorld().isLoaded(blockPos2)) return null; + if (!entity.level().isLoaded(blockPos1)) return null; + if (!entity.level().isLoaded(blockPos2)) return null; slipperiness = Math.min( - entity.getCommandSenderWorld().getBlockState(blockPos1).getFriction(entity.getCommandSenderWorld(), blockPos1, entity), - entity.getCommandSenderWorld().getBlockState(blockPos2).getFriction(entity.getCommandSenderWorld(), blockPos2, entity) + entity.level().getBlockState(blockPos1).getFriction(entity.level(), blockPos1, entity), + entity.level().getBlockState(blockPos2).getFriction(entity.level(), blockPos2, entity) ); } else { double blockX = entity.getX() + xDirection, blockZ = entity.getZ() + zDirection;