Skip to content

Commit d47ad50

Browse files
committed
modify hook render
将渲染的线改为了直线
1 parent c6c36c4 commit d47ad50

5 files changed

Lines changed: 25 additions & 32 deletions

File tree

src/main/java/com/altnoir/mia/client/handler/HookHandler.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.altnoir.mia.network.server.PopHookPayload;
66
import net.minecraft.client.player.LocalPlayer;
77
import net.minecraft.core.component.DataComponents;
8-
import net.minecraft.util.Mth;
98
import net.minecraft.world.entity.ai.attributes.Attributes;
109
import net.minecraft.world.item.ItemStack;
1110
import net.minecraft.world.item.component.CustomData;
@@ -15,14 +14,7 @@
1514
import net.neoforged.api.distmarker.OnlyIn;
1615
import net.neoforged.neoforge.network.PacketDistributor;
1716

18-
/**
19-
* Hook 拉取实体处理逻辑
20-
* <p>
21-
* 本实现参考了 Confluence Mod (LGPL-3.0 License)
22-
* 中的 org.confluence.mod.client.handler.HookThrowingHandler 类
23-
* <p>
24-
* Confluence Mod: https://github.com/Magic-team-jvav/confluence
25-
*/
17+
// TODO HookHandler需要重构
2618
@OnlyIn(Dist.CLIENT)
2719
public class HookHandler {
2820
public static void handler(LocalPlayer player, Level level, boolean isJump) {
@@ -46,13 +38,10 @@ public static void handler(LocalPlayer player, Level level, boolean isJump) {
4638
if (isJump) {
4739
Vec3 vec3 = player.getDeltaMovement();
4840
// at开不了,等后续有缘人
49-
// double motionY = player.getJumpPower() * 1.25;
50-
double motionY = player.getAttributeValue(Attributes.JUMP_STRENGTH) * 1.25;
51-
player.setDeltaMovement(vec3.x, motionY, vec3.z);
52-
if (player.isSprinting()) {
53-
float f = player.getYRot() * Mth.DEG_TO_RAD;
54-
player.setDeltaMovement(player.getDeltaMovement().add(-Mth.sin(f) * 0.2, 0.0, Mth.cos(f) * 0.2));
55-
}
41+
// double y = player.getJumpPower() * 1.25;
42+
// 二编,再次尝试了一下at,失败,把getJumpBoostPower加上去了
43+
double y = (player.getAttributeValue(Attributes.JUMP_STRENGTH) + player.getJumpBoostPower()) * 1.25;
44+
player.setDeltaMovement(vec3.x, y, vec3.z);
5645
PacketDistributor.sendToServer(new PopHookPayload(hookEntity.getId()));
5746
return;
5847
}

src/main/java/com/altnoir/mia/client/renderer/HookEntityRenderer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ private static void stringVertex(
108108
float x, float y, float z, VertexConsumer consumer, PoseStack.Pose pose, float stringFraction, float nextStringFraction
109109
) {
110110
float f = x * stringFraction;
111-
float f1 = y * (stringFraction * stringFraction + stringFraction) * 0.5F + 0.25F;
111+
float f1 = y * stringFraction;
112112
float f2 = z * stringFraction;
113113
float f3 = x * nextStringFraction - f;
114-
float f4 = y * (nextStringFraction * nextStringFraction + nextStringFraction) * 0.5F + 0.25F - f1;
114+
float f4 = y * nextStringFraction - f1;
115115
float f5 = z * nextStringFraction - f2;
116116
float f6 = Mth.sqrt(f3 * f3 + f4 * f4 + f5 * f5);
117117
f3 /= f6;

src/main/java/com/altnoir/mia/entity/projectile/HookEntity.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class HookEntity extends Projectile {
2929
public static final EntityDataAccessor<Integer> DATA_HOOK_STATE = SynchedEntityData.defineId(HookEntity.class, EntityDataSerializers.INT);
3030
public static final EntityDataAccessor<Boolean> DATA_SHOOT_HAND = SynchedEntityData.defineId(HookEntity.class, EntityDataSerializers.BOOLEAN);
3131
// 20格距离
32-
public final float hookRangeSqr = 180;
32+
public final float hookRangeSqr = 20 * 20;
3333
protected BlockPos hookPos;
3434
protected BlockState hookedState;
3535

@@ -103,7 +103,7 @@ public void tick() {
103103
);
104104
player.resetFallDistance();
105105
HookState hookState = getHookState();
106-
if (hookState == HookState.POP) {
106+
if (hookState == HookState.BACK) {
107107
setDeltaMovement(
108108
getDeltaMovement()
109109
.scale(0.95)
@@ -116,36 +116,40 @@ public void tick() {
116116
.scale(0.75)
117117
)
118118
);
119+
// 有时会出现延迟销毁的bug,目前没诊断出原因,但触发概率不大
119120
if (distanceToSqr(player) < 4.0) {
120121
discard();
121122
return;
122123
}
123124
}
124-
if (level().isClientSide()) return;
125-
if (hookState != HookState.POP && distanceToSqr(player) > (hookRangeSqr * 20)) {
126-
setHookState(HookState.POP);
127-
} else if (hookState == HookState.HOOKED && (hookPos == null || level().getBlockState(hookPos) != hookedState)) {
128-
setHookState(HookState.POP);
125+
if (!level().isClientSide()) {
126+
// 由于HookHandler的触发先于此tick逻辑,导致HookHandler先一步判断能够拉取,然后此处判断收回
127+
// HookHandler需要重构
128+
if (hookState != HookState.BACK && distanceToSqr(player) > hookRangeSqr) {
129+
setHookState(HookState.BACK);
130+
} else if (hookState == HookState.HOOKED && (hookPos == null || level().getBlockState(hookPos) != hookedState)) {
131+
setHookState(HookState.BACK);
132+
}
129133
}
130134
}
131135

132136
@Override
133137
protected void onHitBlock(BlockHitResult result) {
134138
super.onHitBlock(result);
135139
HookState hookState = getHookState();
136-
if (hookState == HookState.POP) return;
140+
if (hookState == HookState.BACK) return;
137141
Vec3 vec3 = result.getLocation().subtract(position());
138142
setDeltaMovement(vec3);
139-
if (hookState == HookState.PUSH) {
143+
if (hookState == HookState.SHOOT) {
140144
setHookState(HookState.HOOKED);
141145
hookPos = result.getBlockPos();
142146
hookedState = level().getBlockState(hookPos);
143147
}
144148
}
145149

146150
public enum HookState implements StringRepresentable {
147-
PUSH(0, "push"), // 发射
148-
POP(1, "pop"), // 收回
151+
SHOOT(0, "shoot"), // 发射
152+
BACK(1, "back"), // 收回
149153
HOOKED(2, "hooked"); // 抓住
150154

151155
public static final Codec<HookState> CODEC = StringRepresentable.fromEnum(HookState::values);

src/main/java/com/altnoir/mia/item/HookItem.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
2424
if (flag && level.getEntity(customData.copyTag().getInt("hook")) instanceof HookEntity entity) {
2525
// 尝试优化手感,当距离小于4时,删除原来抓钩,立即发射,不需收回
2626
if (entity.distanceToSqr(player) > 16) {
27-
entity.setHookState(HookEntity.HookState.POP);
27+
entity.setHookState(HookEntity.HookState.BACK);
2828
return super.use(level, player, usedHand);
2929
} else {
3030
entity.discard();
@@ -37,7 +37,7 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
3737
player.getYRot(),
3838
0,
3939
2,
40-
1
40+
0
4141
);
4242
level.addFreshEntity(hookEntity);
4343
CompoundTag tag = new CompoundTag();

src/main/java/com/altnoir/mia/network/server/PopHookPayload.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static void handle(PopHookPayload packet, IPayloadContext context) {
2323
context.enqueueWork(() -> {
2424
Player player = context.player();
2525
if (player.level().getEntity(packet.id) instanceof HookEntity entity) {
26-
entity.setHookState(HookEntity.HookState.POP);
26+
entity.setHookState(HookEntity.HookState.BACK);
2727
}
2828
});
2929
}

0 commit comments

Comments
 (0)