Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
893da36
bugfix : Crawl is possible when riding zipline
alRex-U May 7, 2025
3e4fa25
bugfix : animator is not removed on cameraSetupEvent
alRex-U May 7, 2025
9de1607
reduce division of zipline render when the zipline is too short
alRex-U May 7, 2025
9162be5
bugfix : convulsions on collision when riding zipline
alRex-U May 7, 2025
24569d1
Merge branch 'main' of https://github.com/alRex-U/ParCool into 1.16.5
alRex-U May 7, 2025
ad912b9
change version
alRex-U May 7, 2025
e29e9ad
make zipline movement affected by movement speed attribute
alRex-U May 10, 2025
68e157b
make zipline bouding box affected by its hook position in client
alRex-U May 10, 2025
f8a74c3
make synchronization limitation failed message show only once
alRex-U May 10, 2025
dad7561
change version
alRex-U May 10, 2025
5225213
Merge branch 'main' of https://github.com/alRex-U/ParCool into 1.16.5
alRex-U May 10, 2025
7c207a0
Merge branch 'main' of https://github.com/alRex-U/ParCool into 1.16.5
alRex-U May 11, 2025
e4d5d68
fix too large zipline can cause low framerate
alRex-U May 13, 2025
931c34f
delay zipline initialize when the hook is not loaded
alRex-U May 13, 2025
588afe6
check zipline entity living in tile entity tick
alRex-U May 13, 2025
db38096
bugfix #388
alRex-U May 14, 2025
aebecef
add config to show always stamina hud
alRex-U May 22, 2025
bc0d7b6
bugfix : stamina HUD show if other stamina is enabled
alRex-U May 22, 2025
1c9a331
add logging statements
alRex-U May 22, 2025
59205d8
change version :3.4.0.5
alRex-U May 22, 2025
53afd8d
add config to disable exhaustion penalty
alRex-U May 22, 2025
63e8873
bugfix : #395
alRex-U Jun 15, 2025
ac675eb
add pole climbable tag
alRex-U Jun 15, 2025
b976809
change version
alRex-U Jun 15, 2025
d55d909
change limitation auto resync message and default settings to avoid m…
alRex-U Jul 18, 2025
3ad1e5a
make it possible to do wall jump while wearing elytra
alRex-U Jul 18, 2025
240f531
make it slightly easy to grab zipline
alRex-U Jul 18, 2025
ed4d599
add config option to modify lowest fall distance to trigger
alRex-U Jul 18, 2025
0523f2c
add StartSwimByCrawl
alRex-U Jul 18, 2025
a90ccca
make it possible to stop h wall run by pressing movement key facing a…
alRex-U Jul 18, 2025
0c7f6e9
make wall detection more natural
alRex-U Jul 18, 2025
7e72270
add utility method to Action
alRex-U Jul 20, 2025
375a6fe
change version
alRex-U Jul 20, 2025
c870397
remove meaningless statement
alRex-U Jul 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ major_mod=3
# Changing the order or variables of enums. etc
major_api=4
# Adding items, blocks, tile entities, etc.
minor=0
minor=1
# bugfix
patch=0
# A or B or R
forge_version=1.16.5-36.2.34
patchouli_version=1.16.4-53.3
jei_version=7.7.1.153
2 changes: 1 addition & 1 deletion src/main/java/com/alrex/parcool/ParCool.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
@Mod(ParCool.MOD_ID)
public class ParCool {
public static final String MOD_ID = "parcool";
private static final String PROTOCOL_VERSION = "3.4.0.0";
private static final String PROTOCOL_VERSION = "3.4.0.5";
public static final SimpleChannel CHANNEL_INSTANCE = NetworkRegistry.newSimpleChannel(
new ResourceLocation(ParCool.MOD_ID, "message"),
() -> PROTOCOL_VERSION,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,20 +71,17 @@ public void onTick(TickEvent.ClientTickEvent event, ClientPlayerEntity player) {
}
}

public void render(RenderGameOverlayEvent.Post event, MatrixStack stack) {
public void render(RenderGameOverlayEvent.Post event, MatrixStack stack, Parkourability parkourability, IStamina stamina) {
ClientPlayerEntity player = Minecraft.getInstance().player;
if (player == null || player.isCreative()) return;

IStamina stamina = IStamina.get(player);
Parkourability parkourability = Parkourability.get(player);
if (stamina == null || parkourability == null) return;

final boolean inexhaustible = player.hasEffect(Effects.INEXHAUSTIBLE.get());
final boolean exhausted = stamina.isExhausted();

if (!showStatus) {
long gameTime = player.level.getGameTime();
if (gameTime - lastStaminaChangedTick > 40) return;
if (gameTime - lastStaminaChangedTick > 40 && !ParCoolConfig.Client.Booleans.ShowLightStaminaHUDAlways.get())
return;
}
float staminaScale = (float) stamina.get() / stamina.getActualMaxStamina();
if (staminaScale < 0) staminaScale = 0;
Expand Down
10 changes: 1 addition & 9 deletions src/main/java/com/alrex/parcool/client/hud/impl/StaminaHUD.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,19 +63,11 @@ public void onTick(TickEvent.ClientTickEvent event, ClientPlayerEntity player) {
}
}

public void render(RenderGameOverlayEvent.Post event, MatrixStack stack) {
public void render(RenderGameOverlayEvent.Post event, MatrixStack stack, Parkourability parkourability, IStamina stamina) {
ClientPlayerEntity player = Minecraft.getInstance().player;
if (player == null) return;
if (player.isCreative()) return;

IStamina stamina = IStamina.get(player);
Parkourability parkourability = Parkourability.get(player);
if (stamina == null || parkourability == null) return;

if (ParCoolConfig.Client.Booleans.HideStaminaHUDWhenStaminaIsInfinite.get() &&
parkourability.getActionInfo().isStaminaInfinite(player.isCreative() || player.isSpectator())
) return;

MainWindow window = Minecraft.getInstance().getWindow();
Position position = new Position(
ParCoolConfig.Client.AlignHorizontalStaminaHUD.get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

import com.alrex.parcool.api.client.gui.ParCoolHUDEvent;
import com.alrex.parcool.common.capability.IStamina;
import com.alrex.parcool.common.capability.stamina.Stamina;
import com.alrex.parcool.common.capability.Parkourability;
import com.alrex.parcool.common.capability.stamina.ParCoolStamina;
import com.alrex.parcool.config.ParCoolConfig;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -36,18 +37,29 @@ public void onTick(TickEvent.ClientTickEvent event) {
public void render(RenderGameOverlayEvent.Post event, MatrixStack stack) {
ClientPlayerEntity player = Minecraft.getInstance().player;
if (player == null) return;
if (!ParCoolConfig.Client.Booleans.ParCoolIsActive.get() ||
!(IStamina.get(player) instanceof Stamina))
return;
if (!ParCoolConfig.Client.Booleans.ParCoolIsActive.get()) return;
if (event.getType() != RenderGameOverlayEvent.ElementType.EXPERIENCE) return;

Parkourability parkourability = Parkourability.get(player);
if (parkourability == null) return;

if (ParCoolConfig.Client.Booleans.HideStaminaHUDWhenStaminaIsInfinite.get() &&
parkourability.getActionInfo().isStaminaInfinite(player.isCreative() || player.isSpectator())
) return;

IStamina stamina = IStamina.get(player);
if (stamina == null) return;

if (!(stamina instanceof ParCoolStamina)) return;

if (MinecraftForge.EVENT_BUS.post(new ParCoolHUDEvent.RenderEvent(event, stack))) return;

switch (ParCoolConfig.Client.StaminaHUDType.get()) {
case Light:
lightStaminaHUD.render(event, stack);
lightStaminaHUD.render(event, stack, parkourability, stamina);
break;
case Normal:
staminaHUD.render(event, stack);
staminaHUD.render(event, stack, parkourability, stamina);
break;
}
}
Expand Down
22 changes: 12 additions & 10 deletions src/main/java/com/alrex/parcool/client/input/KeyBindings.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ public static KeyBinding getKeySprint() {

public static Boolean isKeyJumpDown() {
return mc.player != null
&& mc.player.input.jumping;
&& mc.player.input != null
&& mc.player.input.jumping;
}

public static KeyBinding getKeySneak() {
Expand All @@ -49,30 +50,31 @@ public static KeyBinding getKeySneak() {

public static Boolean isAnyMovingKeyDown() {
return mc.player != null
&& (mc.player.input.left
|| mc.player.input.right
|| mc.player.input.forwardImpulse != 0
|| mc.player.input.leftImpulse != 0);
&& mc.player.input != null
&& (mc.player.input.left
|| mc.player.input.right
|| mc.player.input.forwardImpulse != 0
|| mc.player.input.leftImpulse != 0);
}

public static Boolean isLeftAndRightDown() {
return mc.player != null && mc.player.input.left && mc.player.input.right;
return mc.player != null && mc.player.input != null && mc.player.input.left && mc.player.input.right;
}

public static Boolean isKeyForwardDown() {
return mc.player != null && mc.player.input.forwardImpulse > 0;
return mc.player != null && mc.player.input != null && mc.player.input.forwardImpulse > 0;
}

public static Boolean isKeyLeftDown() {
return mc.player != null && mc.player.input.left;
return mc.player != null && mc.player.input != null && mc.player.input.left;
}

public static Boolean isKeyRightDown() {
return mc.player != null && mc.player.input.right;
return mc.player != null && mc.player.input != null && mc.player.input.right;
}

public static Boolean isKeyBackDown() {
return mc.player != null && mc.player.input.forwardImpulse < 0;
return mc.player != null && mc.player.input != null && mc.player.input.forwardImpulse < 0;
}

public static KeyBinding getKeyBindEnable() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ private void renderRope(ZiplineRopeEntity entity, float partialTick, MatrixStack
int endSkyBrightness = entity.level.getBrightness(LightType.SKY, end);


final int divisionCount = 24;
int divisionCount = Math.min((int) Math.ceil(endOffsetFromStart.length() / 0.6), 24);
float invLengthSqrtXZ = (float) MathHelper.fastInvSqrt(endOffsetFromStart.x() * endOffsetFromStart.x() + endOffsetFromStart.z() * endOffsetFromStart.z());
float unitLengthX = (float) (endOffsetFromStart.x() * invLengthSqrtXZ);
float unitLengthZ = (float) (endOffsetFromStart.z() * invLengthSqrtXZ);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/alrex/parcool/common/action/Action.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ public abstract class Action {
private int doingTick = 0;
private int notDoingTick = 0;

public boolean isJustStarted() {
return isDoing() && getDoingTick() == 0;
}

public void setDoingTick(int doingTick) {
this.doingTick = doingTick;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.alrex.parcool.common.action;

import com.alrex.parcool.common.action.impl.*;
import com.alrex.parcool.common.action.instant.StartSwimByCrawl;

import javax.annotation.Nullable;
import java.util.Arrays;
Expand Down Expand Up @@ -37,7 +38,9 @@ public class ActionList {
new ActionRegistry<>(Vault.class, Vault::new, 50),
new ActionRegistry<>(VerticalWallRun.class, VerticalWallRun::new, 150),
new ActionRegistry<>(WallJump.class, WallJump::new, 120),
new ActionRegistry<>(WallSlide.class, WallSlide::new, 8)
new ActionRegistry<>(WallSlide.class, WallSlide::new, 8),

new ActionRegistry<>(StartSwimByCrawl.class, StartSwimByCrawl::new, 0)
);
private static final HashMap<Class<? extends Action>, Short> INDEX_MAP;
private static final TreeMap<String, Short> NAME_2_INDEX_MAP;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,9 @@ public void onTick(TickEvent.PlayerTickEvent event) {
}
ParCool.LOGGER.log(Level.WARN, "Detected ParCool Limitation is not synced. Sending synchronization request...");
} else if (trialCount == 5) {
parkourability.incrementSynchronizeTrialCount();
player.displayClientMessage(new TranslationTextComponent("parcool.message.error.limitation.fail_sync").withStyle(TextFormatting.DARK_RED), false);
ParCool.LOGGER.log(Level.ERROR, "Failed to synchronize ParCool Limitation. Please report to developer");
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");
}
}
}
Expand Down Expand Up @@ -173,7 +174,7 @@ public void onTick(TickEvent.PlayerTickEvent event) {
staminaSyncCoolTimeTick = 0;
SyncStaminaMessage.sync(player);
}
if (stamina.isExhausted()) {
if (stamina.isImposingExhaustionPenalty() && parkourability.getClientInfo().get(ParCoolConfig.Client.Booleans.EnableStaminaExhaustionPenalty)) {
player.setSprinting(false);
}
}
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/com/alrex/parcool/common/action/InstantAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.alrex.parcool.common.action;

import com.alrex.parcool.common.capability.IStamina;
import com.alrex.parcool.common.capability.Parkourability;
import net.minecraft.entity.player.PlayerEntity;

public abstract class InstantAction extends Action {
@Override
public final boolean canContinue(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
return false;
}

@Override
public final void onWorkingTick(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
}

@Override
public final void onWorkingTickInClient(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
}

@Override
public final void onWorkingTickInLocalClient(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
}

@Override
public final void onWorkingTickInServer(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
}

@Override
public final void onStop(PlayerEntity player) {
}

@Override
public final void onStopInServer(PlayerEntity player) {
}

@Override
public final void onStopInOtherClient(PlayerEntity player) {
}

@Override
public final void onStopInLocalClient(PlayerEntity player) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public boolean canStart(PlayerEntity player, Parkourability parkourability, ISta
movement = movement.multiply(1, 0, 1).normalize();
startInfo.putDouble(movement.x()).putDouble(movement.z());
return (player.isOnGround()
&& !player.isInWater()
&& !stamina.isExhausted()
&& coolTimeTick <= 0
&& readyTick > 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ && disambiguateCommands(player, pose)
&& !parkourability.isDoingAny(Roll.class, Tap.class, ClingToCliff.class, Dive.class)
&& parkourability.get(Vault.class).getNotDoingTick() >= 8
&& !parkourability.get(HideInBlock.class).isDoing()
&& !parkourability.get(RideZipline.class).isDoing()
&& player.getVehicle() == null
&& (pose == Pose.STANDING || pose == Pose.CROUCHING)
&& !player.isInWaterOrBubble()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,13 +220,6 @@ public void onStopInLocalClient(PlayerEntity player) {
player.playSound(player.level.getBlockState(new BlockPos(hidingPoint.add(0, 0.2, 0))).getSoundType().getBreakSound(), 1, 1);
}

@Override
public void onTick(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
if (!isDoing() && getNotDoingTick() <= 1) {
player.noPhysics = true;
}
}

@Override
public void onStopInOtherClient(PlayerEntity player) {
spawnOnHideParticles(player);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
import com.alrex.parcool.utilities.WorldUtil;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.entity.ai.attributes.Attributes;
import net.minecraft.entity.ai.attributes.ModifiableAttributeInstance;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.particles.BlockParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
Expand Down Expand Up @@ -142,16 +144,26 @@ public boolean canStart(PlayerEntity player, Parkourability parkourability, ISta
public boolean canContinue(PlayerEntity player, Parkourability parkourability, IStamina stamina) {
Vector3d wallDirection = WorldUtil.getRunnableWall(player, player.getBbWidth() * 0.65f);
if (wallDirection == null) return false;
if (!(player instanceof ClientPlayerEntity)) return false;
ClientPlayerEntity localPlayer = (ClientPlayerEntity) player;
if (localPlayer.input == null) return false;
Vector2f moveVector = localPlayer.input.getMoveVector();
Vector3d actualInputVector
= new Vector3d(moveVector.x, 0, moveVector.y)
.normalize()
.yRot((float) -Math.toRadians(player.yRot));
// Input almost opposite to wall
if (wallDirection.normalize().dot(actualInputVector) < -0.86) {
return false;
}
return (getDoingTick() < getMaxRunningTick(parkourability.getActionInfo())
&& !stamina.isExhausted()
&& !parkourability.get(WallJump.class).justJumped()
&& !parkourability.get(Crawl.class).isDoing()
&& !parkourability.get(Dodge.class).isDoing()
&& !parkourability.get(Vault.class).isDoing()
&& (
(ParCoolConfig.Client.HWallRunControl.get() == ControlType.PressKey && KeyBindings.getKeyHorizontalWallRun().isDown())
|| ParCoolConfig.Client.HWallRunControl.get() == ControlType.Auto
)
&& ((ParCoolConfig.Client.HWallRunControl.get() == ControlType.PressKey && KeyBindings.getKeyHorizontalWallRun().isDown())
|| ParCoolConfig.Client.HWallRunControl.get() == ControlType.Auto)
&& !player.isOnGround()
);
}
Expand Down
Loading