Skip to content

Commit bb61253

Browse files
Merge pull request #102 from donjuanplatinum/peace_phonia
feat(item/peace_phonia): 无尽火药
2 parents 28801b6 + 393d701 commit bb61253

7 files changed

Lines changed: 174 additions & 76 deletions

File tree

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ public class MiaConfig {
8181
private static final ModConfigSpec.BooleanValue CURSE_GOD = SERVER_BUILDER
8282
.comment("Whether to Curse the Creative and Spectator(Default: false) | 是否诅咒创造模式和观察者模式 (默认值: false, 需要启用诅咒)")
8383
.define("curse_god", false);
84+
/**
85+
* 无尽锤的配置
86+
*/
87+
public static final ModConfigSpec.IntValue BLAZE_REAP_EXPLOSION_COUNT =
88+
COMMON_BUILDER
89+
.comment("The Boom counts of the Blaze REAP (Default: 4)| Blaze REAP武器攻击时的爆炸次数 (默认值: 4)")
90+
.defineInRange("blaze_reap.explosion_count", 3, 1, 64);
91+
92+
public static final ModConfigSpec.DoubleValue BLAZE_REAP_EXPLOSION_RADIUS =
93+
COMMON_BUILDER
94+
.comment("The Boom radius of the Blaze REAP (Default: 2) | Blaze REAP武器爆炸范围 (默认值: 2)")
95+
.defineInRange("blaze_reap.explosion_radius", 2.0, 0.1, 20.0);
8496
/**
8597
* 探窟者信标相关的配置
8698
*/

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,12 @@ public class MiaItemGroups {
154154

155155
output.accept(MiaBlocks.ENDLESS_CUP);
156156

157-
// Weapons
158-
output.accept(MiaItems.GROW_SWORD);
159-
output.accept(MiaItems.BLAZE_LEAP);
157+
// Weapons
158+
output.accept(MiaItems.GROW_SWORD);
159+
output.accept(MiaItems.BLAZE_REAP);
160+
161+
// Misc
162+
output.accept(MiaItems.PEACE_PHOBIA);
160163
}).build()
161164
);
162165

src/main/java/com/altnoir/mia/common/item/BlazeLeapItem.java

Lines changed: 0 additions & 66 deletions
This file was deleted.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package com.altnoir.mia.common.item;
2+
3+
import com.altnoir.mia.MiaConfig;
4+
import net.minecraft.core.particles.ParticleTypes;
5+
import net.minecraft.server.MinecraftServer;
6+
import net.minecraft.server.level.ServerLevel;
7+
import net.minecraft.world.entity.LivingEntity;
8+
import net.minecraft.world.entity.player.Player;
9+
import net.minecraft.world.item.DiggerItem;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.item.Items;
12+
import net.minecraft.world.item.Tiers;
13+
import net.minecraft.world.level.Level;
14+
import net.minecraft.world.level.Level.ExplosionInteraction;
15+
import net.minecraft.world.phys.Vec3;
16+
import net.minecraft.tags.BlockTags;
17+
18+
import java.util.concurrent.Executors;
19+
import java.util.concurrent.ScheduledExecutorService;
20+
import java.util.concurrent.TimeUnit;
21+
import java.util.function.Predicate;
22+
import com.altnoir.mia.init.MiaItems;
23+
24+
public class BlazeReapItem extends DiggerItem {
25+
26+
private static final ScheduledExecutorService SCHEDULER = Executors.newSingleThreadScheduledExecutor();
27+
28+
public static final Predicate<ItemStack> BLAZE_REAP_FUEL = (stack) ->
29+
stack.is(Items.GUNPOWDER) || stack.is(MiaItems.PEACE_PHOBIA.get());
30+
31+
public BlazeReapItem(Properties properties) {
32+
super(Tiers.NETHERITE, BlockTags.MINEABLE_WITH_PICKAXE, properties);
33+
}
34+
35+
public static Properties createAttributes() {
36+
return new Properties()
37+
.attributes(DiggerItem.createAttributes(Tiers.NETHERITE, 9.0F, -3.0F));
38+
}
39+
40+
@Override
41+
public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
42+
Level level = attacker.level();
43+
44+
if (!level.isClientSide && attacker instanceof Player player) {
45+
46+
ItemStack ammoStack = player.getProjectile(stack);
47+
48+
if (ammoStack.isEmpty() || !BLAZE_REAP_FUEL.test(ammoStack)) {
49+
ammoStack = findAmmoInInventory(player, BLAZE_REAP_FUEL);
50+
}
51+
52+
53+
if (!ammoStack.isEmpty() || player.getAbilities().instabuild) {
54+
55+
56+
if (!player.getAbilities().instabuild) {
57+
if (!ammoStack.is(MiaItems.PEACE_PHOBIA.get())) {
58+
ammoStack.shrink(1);
59+
if (ammoStack.isEmpty()) {
60+
player.getInventory().removeItem(ammoStack);
61+
}
62+
}
63+
}
64+
65+
triggerExplosionSequence(level, player, target);
66+
67+
68+
stack.hurtAndBreak(1, attacker, LivingEntity.getSlotForHand(attacker.getUsedItemHand()));
69+
}
70+
}
71+
72+
return super.hurtEnemy(stack, target, attacker);
73+
}
74+
75+
76+
private ItemStack findAmmoInInventory(Player player, Predicate<ItemStack> predicate) {
77+
if (predicate.test(player.getOffhandItem())) {
78+
return player.getOffhandItem();
79+
}
80+
for (int i = 0; i < player.getInventory().getContainerSize(); i++) {
81+
ItemStack is = player.getInventory().getItem(i);
82+
if (predicate.test(is)) {
83+
return is;
84+
}
85+
}
86+
return ItemStack.EMPTY;
87+
}
88+
89+
private void triggerExplosionSequence(Level level, Player player, LivingEntity target) {
90+
int explosionCount = MiaConfig.BLAZE_REAP_EXPLOSION_COUNT.get();
91+
double explosionRadius = MiaConfig.BLAZE_REAP_EXPLOSION_RADIUS.get();
92+
MinecraftServer server = level.getServer();
93+
94+
for (int i = 0; i < explosionCount; i++) {
95+
int delay = i;
96+
SCHEDULER.schedule(() -> {
97+
if (server != null) {
98+
server.execute(() -> {
99+
if (target != null && target.isAlive() && !target.isRemoved()) {
100+
Vec3 pos = target.position();
101+
102+
double x = pos.x + (Math.random() - 0.5) * explosionRadius;
103+
double y = pos.y + Math.random() * target.getBbHeight();
104+
double z = pos.z + (Math.random() - 0.5) * explosionRadius;
105+
106+
if (level instanceof ServerLevel serverLevel) {
107+
serverLevel.sendParticles(ParticleTypes.FLAME, x, y, z, 5, 0.1, 0.1, 0.1, 0.05);
108+
}
109+
110+
level.explode(
111+
player,
112+
null,
113+
null,
114+
x, y, z,
115+
2.0f,
116+
false,
117+
ExplosionInteraction.NONE
118+
);
119+
}
120+
});
121+
}
122+
}, delay, TimeUnit.SECONDS);
123+
}
124+
}
125+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.altnoir.mia.common.item;
2+
3+
import net.minecraft.world.item.Item;
4+
import net.minecraft.world.item.ItemStack;
5+
import net.minecraft.world.item.Rarity;
6+
7+
public class PeacePhobiaItem extends Item {
8+
9+
public PeacePhobiaItem(Properties properties) {
10+
super(properties.rarity(Rarity.EPIC).stacksTo(1));
11+
}
12+
13+
@Override
14+
public boolean isFoil(ItemStack stack) {
15+
return true;
16+
}
17+
18+
19+
}

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@ public class MiaItems {
5050
MiaTiers.PRASIOLITE, new Item.Properties()
5151
.attributes(SwordItem.createAttributes(MiaTiers.PRASIOLITE, 0.0F, -2.4F))
5252
));
53-
public static final DeferredItem<Item> BLAZE_LEAP = ITEMS.register("blaze_leap", () ->
54-
new BlazeLeapItem(
55-
new Item.Properties().durability(500)
56-
.attributes(DiggerItem.createAttributes(Tiers.NETHERITE, 9.0F, -3.0F))
57-
)
58-
);
53+
public static final DeferredItem<Item> BLAZE_REAP = ITEMS.register("blaze_reap", () ->
54+
new BlazeReapItem(
55+
new Item.Properties()
56+
)
57+
);
58+
public static final DeferredItem<Item> PEACE_PHOBIA = ITEMS.register("peace_phobia", () ->
59+
new PeacePhobiaItem(
60+
new Item.Properties()
61+
)
62+
);
5963
public static final DeferredItem<Item> PRASIOLITE_PICKAXE = ITEMS.register("prasiolite_pickaxe", () ->
6064
new CompositeItem(
6165
MiaTiers.PRASIOLITE, new Item.Properties()

src/main/resources/assets/mia/lang/zh_cn.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"item.mia.prasiolite_pickaxe": "翡翠镐",
2020
"item.mia.prasiolite_shard": "翡翠碎片",
2121
"item.mia.star_compass": "星之罗盘",
22-
"item.mia.blaze_leap": "无尽锤",
22+
"item.mia.blaze_reap": "无尽锤",
23+
"item.mia.peace_phobia": "无尽之火药",
2324

2425
"block.mia.abyss_andesite": "深界安山岩",
2526
"block.mia.abyss_andesite_slab": "深界安山岩台阶",

0 commit comments

Comments
 (0)