Skip to content

Commit

Permalink
EntityTag.climbing_speed
Browse files Browse the repository at this point in the history
  • Loading branch information
tal5 committed Sep 9, 2023
1 parent c5559bf commit 15817ef
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 0 deletions.
@@ -0,0 +1,8 @@
package com.denizenscript.clientizen.access;

public interface LivingEntityMixinAccess {

double clientizen$getClimbingSpeed();

void clientizen$setClimbingSpeed(double climbingSpeed);
}
Expand Up @@ -13,6 +13,8 @@ public class ScreenOpenCloseEvent extends ScriptEvent {
// @Events
// screen opened|closed
//
// @Group User Interface
//
// @Switch type:<screen_type> to only process the event if the type of screen opened matches the specified matcher.
// @Switch from:<screen_type> to only process the event if the screen was opened from a different screen and that screen's type matches the specified matcher.
//
Expand Down
@@ -0,0 +1,25 @@
package com.denizenscript.clientizen.mixin;

import com.denizenscript.clientizen.access.LivingEntityMixinAccess;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.recipebook.ClientRecipeBook;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.stat.StatHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ClientPlayerEntity.class)
public abstract class ClientPlayerEntityMixin {

// TODO: proper persistence system
@Inject(method = "<init>", at = @At("TAIL"))
private void clientizen$persistClimbingSpeed(MinecraftClient client, ClientWorld world, ClientPlayNetworkHandler networkHandler, StatHandler stats, ClientRecipeBook recipeBook, boolean lastSneaking, boolean lastSprinting, CallbackInfo ci) {
if (client.player != null) {
((LivingEntityMixinAccess) this).clientizen$setClimbingSpeed(((LivingEntityMixinAccess) client.player).clientizen$getClimbingSpeed());
}
}
}
@@ -0,0 +1,32 @@
package com.denizenscript.clientizen.mixin;

import com.denizenscript.clientizen.access.LivingEntityMixinAccess;
import net.minecraft.entity.LivingEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;

@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin implements LivingEntityMixinAccess {

double clientizen$climbingSpeed = 0.2; // Vanilla default

@Override
public double clientizen$getClimbingSpeed() {
return clientizen$climbingSpeed;
}

@Override
public void clientizen$setClimbingSpeed(double climbingSpeed) {
clientizen$climbingSpeed = climbingSpeed;
}

@Shadow
public abstract boolean isClimbing();

@ModifyArg(method = "applyMovementInput", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Vec3d;<init>(DDD)V"), index = 1)
private double clientizen$modifyClimbingSpeed(double y) {
return isClimbing() ? clientizen$climbingSpeed : y;
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/denizenscript/clientizen/objects/EntityTag.java
@@ -1,5 +1,6 @@
package com.denizenscript.clientizen.objects;

import com.denizenscript.clientizen.access.LivingEntityMixinAccess;
import com.denizenscript.clientizen.mixin.ClientWorldAccessor;
import com.denizenscript.clientizen.util.Utilities;
import com.denizenscript.denizencore.objects.*;
Expand Down Expand Up @@ -178,6 +179,38 @@ public static void register() {
}
return null;
});

// <--[tag]
// @attribute <EntityTag.climbing_speed>
// @returns ElementTag(Decimal)
// @mechanism EntityTag.climbing_speed
// @description
// Returns a living entity's climbing speed.
// -->
tagProcessor.registerTag(ElementTag.class, "climbing_speed", (attribute, object) -> {
return object.getEntity() instanceof LivingEntityMixinAccess mixinAccess ? new ElementTag(mixinAccess.clientizen$getClimbingSpeed()) : null;
});


// <--[mechanism]
// @object EntityTag
// @name climbing_speed
// @input ElementTag(Decimal)
// @description
// Sets a living entity's climbing speed.
// @tags
// <EntityTag.climbing_speed>
// -->
tagProcessor.registerMechanism("climbing_speed", false, ElementTag.class, (object, mechanism, input) -> {
if (!mechanism.requireDouble()) {
return;
}
if (!(object.getEntity() instanceof LivingEntityMixinAccess mixinAccess)) {
mechanism.echoError("Mechanism 'climbing_speed' is only valid for living entities.");
return;
}
mixinAccess.clientizen$setClimbingSpeed(input.asDouble());
});
}

public static final ObjectTagProcessor<EntityTag> tagProcessor = new ObjectTagProcessor<>();
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/clientizen.mixins.json
Expand Up @@ -5,11 +5,13 @@
"compatibilityLevel": "JAVA_17",
"mixins": [],
"client": [
"ClientPlayerEntityMixin",
"ClientPlayNetworkHandlerMixin",
"ClientWorldAccessor",
"ClientWorldMixin",
"EventKeyBindingMixin",
"IntPropertyAccessor",
"LivingEntityMixin",
"MinecraftClientMixin",
"SneakingKeyBindingMixin",
"StickyKeyBindingAccessor",
Expand Down

0 comments on commit 15817ef

Please sign in to comment.