Skip to content

Commit fbb3fd4

Browse files
committed
fix hook
修了一下抓钩bug
1 parent 6c7c9d1 commit fbb3fd4

7 files changed

Lines changed: 42 additions & 58 deletions

File tree

src/main/java/com/altnoir/mia/MIA.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.neoforged.fml.ModContainer;
1515
import net.neoforged.fml.common.Mod;
1616
import net.neoforged.fml.config.ModConfig;
17+
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
1718
import net.neoforged.neoforge.common.NeoForge;
1819
import net.neoforged.neoforge.event.AddReloadListenerEvent;
1920
import org.slf4j.Logger;
@@ -27,6 +28,8 @@ public class MIA {
2728
public static final AbyssTrialSpawnerManager SPAWNER_MANAGER = new AbyssTrialSpawnerManager();
2829

2930
public MIA(IEventBus modEventBus, ModContainer modContainer) {
31+
modEventBus.addListener(this::commonSetup);
32+
3033
MiaItems.register(modEventBus);
3134
MiaBlocks.register(modEventBus);
3235
MiaBlockEntities.register(modEventBus);
@@ -58,6 +61,10 @@ public MIA(IEventBus modEventBus, ModContainer modContainer) {
5861
EventHandle.addListener(modEventBus, gameEventBus);
5962
}
6063

64+
private void commonSetup(final FMLCommonSetupEvent event) {
65+
MiaStats.init();
66+
}
67+
6168
@SubscribeEvent
6269
private void reload(final AddReloadListenerEvent event) {
6370
event.addListener(CURSE_MANAGER);

src/main/java/com/altnoir/mia/client/event/KeyArrowEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public static void onClientTick(ClientTickEvent.Post event) {
6969
RIGHT_KEY.consumeClick();
7070
}
7171

72-
HookHandler.handler(MC.player, MC.options.keyJump.consumeClick());
72+
HookHandler.handler(MC.player, MC.level, MC.options.keyJump.consumeClick());
7373
}
7474

7575
private static void handleSkill() {

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,37 @@
11
package com.altnoir.mia.client.handler;
22

33
import com.altnoir.mia.entity.projectile.HookEntity;
4+
import com.altnoir.mia.init.MiaItems;
45
import com.altnoir.mia.network.server.DiscardHookPayload;
56
import net.minecraft.client.player.LocalPlayer;
7+
import net.minecraft.core.component.DataComponents;
68
import net.minecraft.util.Mth;
79
import net.minecraft.world.entity.ai.attributes.Attributes;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.item.component.CustomData;
12+
import net.minecraft.world.level.Level;
813
import net.minecraft.world.phys.Vec3;
914
import net.neoforged.api.distmarker.Dist;
1015
import net.neoforged.api.distmarker.OnlyIn;
1116
import net.neoforged.neoforge.network.PacketDistributor;
1217

1318
@OnlyIn(Dist.CLIENT)
1419
public class HookHandler {
15-
// TODO 这里的缓存模式得改,不能直接缓存实体,不然在退出存档的时候,缓存的实体不会清空
16-
public static HookEntity hookEntity;
17-
18-
public static void handler(LocalPlayer player, boolean isJump) {
19-
if (player.isCrouching() || hookEntity == null || hookEntity.getHookState() != HookEntity.HookState.HOOKED) {
20+
public static void handler(LocalPlayer player, Level level, boolean isJump) {
21+
HookEntity hookEntity = null;
22+
ItemStack stack;
23+
if (player.getMainHandItem().is(MiaItems.HOOK_ITEM)) {
24+
stack = player.getMainHandItem();
25+
} else if (player.getOffhandItem().is(MiaItems.HOOK_ITEM)) {
26+
stack = player.getOffhandItem();
27+
} else {
2028
return;
2129
}
22-
if (player.level().getEntity(hookEntity.getId()) != hookEntity || hookEntity.isRemoved()) {
23-
hookEntity = null;
30+
CustomData customData = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY);
31+
if (customData.contains("hook") && level.getEntity(customData.copyTag().getInt("hook")) instanceof HookEntity entity) {
32+
hookEntity = entity;
33+
}
34+
if (player.isCrouching() || hookEntity == null || hookEntity.getHookState() != HookEntity.HookState.HOOKED) {
2435
return;
2536
}
2637
// TODO 玩家乘坐实体应不应该被操作
@@ -36,7 +47,6 @@ public static void handler(LocalPlayer player, boolean isJump) {
3647
player.setDeltaMovement(player.getDeltaMovement().add(-Mth.sin(f) * 0.2, 0.0, Mth.cos(f) * 0.2));
3748
}
3849
PacketDistributor.sendToServer(new DiscardHookPayload(hookEntity.getId()));
39-
hookEntity = null;
4050
return;
4151
}
4252
Vec3 subtract = hookEntity.position().subtract(player.position());

src/main/java/com/altnoir/mia/init/MiaItems.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import com.altnoir.mia.component.MiaFoods;
55
import com.altnoir.mia.item.*;
66
import com.altnoir.mia.item.abs.IArtifactItem.Grade;
7+
import net.minecraft.core.component.DataComponents;
78
import net.minecraft.world.item.HoeItem;
89
import net.minecraft.world.item.Item;
910
import net.minecraft.world.item.SwordItem;
11+
import net.minecraft.world.item.component.CustomData;
1012
import net.neoforged.bus.api.IEventBus;
1113
import net.neoforged.neoforge.registries.DeferredItem;
1214
import net.neoforged.neoforge.registries.DeferredRegister;
@@ -62,7 +64,7 @@ public class MiaItems {
6264

6365
public static final DeferredItem<Item> HOOK_ITEM = ITEMS.register(
6466
"hook_item",
65-
() -> new HookItem(new Item.Properties().stacksTo(1))
67+
() -> new HookItem(new Item.Properties().component(DataComponents.CUSTOM_DATA, CustomData.EMPTY).stacksTo(1))
6668
);
6769

6870
// Block Item

src/main/java/com/altnoir/mia/init/MiaNetworking.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.altnoir.mia.MIA;
44
import com.altnoir.mia.network.client.CompassTargetPayload;
55
import com.altnoir.mia.network.client.CurseCapabilityPayload;
6-
import com.altnoir.mia.network.client.SyncHookPayload;
76
import com.altnoir.mia.network.server.DiscardHookPayload;
87
import com.altnoir.mia.network.server.SkillCooldownPayload;
98
import com.altnoir.mia.network.server.SkillPlayPayload;
@@ -24,11 +23,6 @@ public static void register(RegisterPayloadHandlersEvent event) {
2423
CompassTargetPayload.CODEC,
2524
CompassTargetPayload::handle
2625
);
27-
registrar.playToClient(
28-
SyncHookPayload.TYPE,
29-
SyncHookPayload.CODEC,
30-
SyncHookPayload::handle
31-
);
3226
registrar.playToServer(
3327
SkillCooldownPayload.TYPE,
3428
SkillCooldownPayload.CODEC,
Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package com.altnoir.mia.item;
22

33
import com.altnoir.mia.entity.projectile.HookEntity;
4-
import com.altnoir.mia.network.client.SyncHookPayload;
5-
import net.minecraft.server.level.ServerPlayer;
4+
import net.minecraft.core.component.DataComponents;
5+
import net.minecraft.nbt.CompoundTag;
66
import net.minecraft.world.InteractionHand;
77
import net.minecraft.world.InteractionResultHolder;
88
import net.minecraft.world.entity.player.Player;
99
import net.minecraft.world.item.Item;
1010
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.item.component.CustomData;
1112
import net.minecraft.world.level.Level;
12-
import net.neoforged.neoforge.network.PacketDistributor;
1313

1414
public class HookItem extends Item {
1515
public HookItem(Properties properties) {
@@ -18,6 +18,13 @@ public HookItem(Properties properties) {
1818

1919
@Override
2020
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand usedHand) {
21+
ItemStack stack = player.getItemInHand(usedHand);
22+
CustomData customData = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY);
23+
boolean flag = customData.contains("hook");
24+
if (flag && level.getEntity(customData.copyTag().getInt("hook")) instanceof HookEntity entity) {
25+
entity.setHookState(HookEntity.HookState.POP);
26+
return super.use(level, player, usedHand);
27+
}
2128
HookEntity hookEntity = new HookEntity(player, usedHand);
2229
hookEntity.shootFromRotation(
2330
player,
@@ -28,9 +35,9 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
2835
1
2936
);
3037
level.addFreshEntity(hookEntity);
31-
if (player instanceof ServerPlayer serverPlayer) {
32-
PacketDistributor.sendToPlayer(serverPlayer, new SyncHookPayload(hookEntity.getId()));
33-
}
38+
CompoundTag tag = new CompoundTag();
39+
tag.putInt("hook", hookEntity.getId());
40+
stack.set(DataComponents.CUSTOM_DATA, CustomData.of(tag));
3441
return super.use(level, player, usedHand);
3542
}
3643
}

src/main/java/com/altnoir/mia/network/client/SyncHookPayload.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)