『模组开发日记』之青金铜套与免死效果

本文最后更新于 2025年9月23日 中午

青金铜套与免死效果


青金铜锭

青金铜锭由六个铜锭与三个青金石合成

青金铜锭的合成

有了青金铜锭之后就可以通过常规办法合成青金铜套装及其工具

青金铜套装及其工具

青金铜套的功能

当玩家至少穿有任意两件青金铜装备时会拥有免死效果

青金铜套穿在身上效果

免死效果类似不死图腾效果但是他不和不死图腾相冲突

当玩家手持不死图腾时受到致命伤害时会优先触发不死图腾

当玩家没有不死图腾且至少穿有任意两件青金铜装备时受到致命伤害就会触发免死效果

当触发免死效果时玩家穿在身上随机一件青金铜类型装备会破碎以抵挡致命伤害

触发免死效果

有关免死效果的代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
public class UndyingEventHandler
{

public static void register()
{

//每 tick 遍历所有玩家,自动加/移除免死效果
ServerTickEvents.END_SERVER_TICK.register((MinecraftServer server) -> {
for (ServerPlayerEntity player : server.getPlayerManager().getPlayerList())
{
if (hasAtLeastTwoPieces(player)) {
if (!player.hasStatusEffect(ModStatusEffects.UNDYING))
{
player.addStatusEffect(new StatusEffectInstance(
ModStatusEffects.UNDYING,
200, // 10秒,持续刷新
0,
false,
false,
true
));
}
} else {
if (player.hasStatusEffect(ModStatusEffects.UNDYING)) {
player.removeStatusEffect(ModStatusEffects.UNDYING);
}
}
}
});

//监听致命伤害,触发免死逻辑
ServerLivingEntityEvents.ALLOW_DAMAGE.register((entity, source, amount) -> {
if (!(entity instanceof PlayerEntity player)) return true;

StatusEffectInstance effect = player.getStatusEffect(ModStatusEffects.UNDYING);
if (effect == null) return true;

//优先触发不死图腾
if (player.getStackInHand(Hand.OFF_HAND).isOf(Items.TOTEM_OF_UNDYING)) {
return true;
}

//致命伤害检测
if (amount >= player.getHealth())
{
if (hasAtLeastTwoPieces(player))
{
//触发免死,并回复十点血
player.setHealth(10.0F);
player.removeStatusEffect(ModStatusEffects.UNDYING); // 只移除不死状态
player.addStatusEffect(new StatusEffectInstance(ModStatusEffects.UNDYING, 200));

//消耗耐久最高的装备
ItemStack toBreak = getHighestDurabilityArmor(player);
if (!toBreak.isEmpty())
{
String brokenName = toBreak.getName().getString(); //获取装备名称
toBreak.damage(toBreak.getMaxDamage(), player,
p -> p.sendEquipmentBreakStatus(getSlotForItem(toBreak)));

// §c 是红色文字代码,true 表示显示在 ActionBar(血条上方),如果想显示在普通聊天栏可以改成 false。
player.sendMessage(Text.literal("§c你的 " + brokenName + " 已破碎! ! !"), false);
}

// 播放破碎音效
player.getWorld().playSound(null, player.getBlockPos(),
SoundEvents.ENTITY_ITEM_BREAK, SoundCategory.PLAYERS, 1.0F, 1.0F);

// 触发免死时调用,生成装备破碎粒子
if (player.getWorld() instanceof ServerWorld serverWorld) {
serverWorld.spawnParticles(
ModParticleTypes.DARK_CRYSTAL_DIAMOND_ARMOR_BROKEN,
player.getX(),
player.getBodyY(0.5),
player.getZ(),
120,
1.0,
0.5,
1.0,
0.0 // 初速度为 0,靠重力掉落
);//count:粒子数量,deltaXYZ 分别表示xyz坐标的扩散量,其中y表示高度,值越高扩散越大
}

return false; // 阻止原本伤害
}
}
return true;
});
}

//判断是否穿齐整套装备,至少穿有两件装备才可以触发该效果
private static boolean hasAtLeastTwoPieces(PlayerEntity player)
{
int count = 0;
if (player.getEquippedStack(EquipmentSlot.HEAD).isOf(ModItems.LAPIS_LAZULI_COPPER_HELMET)) count++;
if (player.getEquippedStack(EquipmentSlot.CHEST).isOf(ModItems.LAPIS_LAZULI_COPPER_CHESTPLATE)) count++;
if (player.getEquippedStack(EquipmentSlot.LEGS).isOf(ModItems.LAPIS_LAZULI_COPPER_LEGGINGS)) count++;
if (player.getEquippedStack(EquipmentSlot.FEET).isOf(ModItems.LAPIS_LAZULI_COPPER_BOOTS)) count++;
return count >= 2;
}

//获取耐久最高的装备
private static ItemStack getHighestDurabilityArmor(PlayerEntity player)
{
ItemStack[] armors = {
player.getEquippedStack(EquipmentSlot.HEAD),
player.getEquippedStack(EquipmentSlot.CHEST),
player.getEquippedStack(EquipmentSlot.LEGS),
player.getEquippedStack(EquipmentSlot.FEET)
};
ItemStack highest = ItemStack.EMPTY;
int maxDurability = -1;
for (ItemStack armor : armors) {
if (!armor.isEmpty() && armor.getItem() instanceof ArmorItem) {

//只获取装备栏中 LAPIS_LAZULI_COPPER 系列装备的耐久
if (armor.isOf(ModItems.LAPIS_LAZULI_COPPER_HELMET) ||
armor.isOf(ModItems.LAPIS_LAZULI_COPPER_CHESTPLATE) ||
armor.isOf(ModItems.LAPIS_LAZULI_COPPER_LEGGINGS) ||
armor.isOf(ModItems.LAPIS_LAZULI_COPPER_BOOTS)) {

int remaining = armor.getMaxDamage() - armor.getDamage();
if (remaining > maxDurability) {
highest = armor;
maxDurability = remaining;
}
}
}
}
return highest;
}

//获取装备对应的槽位
private static EquipmentSlot getSlotForItem(ItemStack stack)
{
if (stack.getItem() instanceof ArmorItem armor) {
return armor.getSlotType();
}
return EquipmentSlot.MAINHAND;
}
}

以上代码用于 Fabric-1.20 版本模组开发

仅供参考,若想摘抄请在下方留言



后记

此处无后记...........

“一花一世界,一叶一菩提”


版权所有 © 2025 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『模组开发日记』之青金铜套与免死效果
http://example.com/2025/09/23/『模组开发日记』之青金铜套与免死效果/
作者
云梦泽
发布于
2025年9月23日
更新于
2025年9月23日
许可协议