Skip to content

Commit eb67285

Browse files
committed
添加方块位移需求 并修复multiplier异常问题
1 parent 99575f9 commit eb67285

4 files changed

Lines changed: 53 additions & 14 deletions

File tree

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
⚙️ **高级配置**
3030
- 配方成功率 (`0.0~1.0`)
3131
- 方块保留几率 (`0.0~1.0`)
32+
- 方块位移以及根据位移多出需求的量生成相应额外量的产物
3233
- 检测半径动态调整
3334
- 失败/成功音效定制化
3435
- NBT模糊匹配 (`fuzzyNBT`)
@@ -67,6 +68,8 @@ val builder = FallingAlchemy.addConversion(
6768
successChance as double, // 成功率(可选,默认1.0)
6869
keepBlockChance as double, // 方块保留率(可选,默认0.0)
6970
priority as int, // 优先级(可选,默认0)
71+
displacement as double, // 最小位移要求
72+
additionalProducts as boolean, // 是否根据额外位移生成额外产物
7073
successSound as string, // 成功音效(可选)
7174
successVolume as float, // 成功音量(0.1-2.0)
7275
successPitch as float, // 成功音高(0.5-2.0)
@@ -147,6 +150,8 @@ val builder = FallingAlchemy.addConversion(
147150
0.75,
148151
0.2,
149152
10,
153+
8,
154+
true,
150155
"minecraft:entity.endermen.teleport", 1.0, 1.2,
151156
"minecraft:block.glass.break", 0.8, 0.9
152157
);

src/main/java/work/crash/fallingalchemy/handler/FallingBlockHandler.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,31 @@
1515
import work.crash.fallingalchemy.item.ConsumedItem;
1616

1717
import java.lang.ref.WeakReference;
18-
import java.util.ArrayList;
19-
import java.util.Collections;
20-
import java.util.Iterator;
21-
import java.util.List;
18+
import java.util.*;
2219
import java.util.stream.Collectors;
2320

2421
import static work.crash.fallingalchemy.Tags.MOD_ID;
22+
import static work.crash.fallingalchemy.utils.Math.*;
2523

2624
@Mod.EventBusSubscriber(modid = MOD_ID)
2725
public class FallingBlockHandler {
2826

2927
private static final List<WeakReference<EntityFallingBlock>> trackedBlocks = new ArrayList<>();
28+
private final Dictionary<EntityFallingBlock, BlockPos> blockPosition = new Hashtable<>();
3029

3130
@SubscribeEvent
32-
public static void onEntityJoinWorld(EntityJoinWorldEvent event) {
31+
public void onEntityJoinWorld(EntityJoinWorldEvent event) {
3332
if (event.getEntity() instanceof EntityFallingBlock block) {
3433
Block blockType = block.getBlock().getBlock();
3534
if (FallingAlchemyTweaker.RULES.containsKey(blockType)) {
3635
trackedBlocks.add(new WeakReference<>(block));
36+
blockPosition.put(block, block.getPosition());
3737
}
3838
}
3939
}
4040

4141
@SubscribeEvent
42-
public static void onWorldTick(TickEvent.WorldTickEvent event) {
42+
public void onWorldTick(TickEvent.WorldTickEvent event) {
4343
if (event.phase == TickEvent.Phase.END && !event.world.isRemote) {
4444
Iterator<WeakReference<EntityFallingBlock>> iterator = trackedBlocks.iterator();
4545

@@ -48,15 +48,15 @@ public static void onWorldTick(TickEvent.WorldTickEvent event) {
4848
if (block == null || block.isDead) {
4949
BlockPos pos = new BlockPos(block.posX, block.posY, block.posZ);
5050
if (event.world.getBlockState(pos).getBlock() == block.getBlock().getBlock()) {
51-
processConversion(event.world, pos, block.getBlock().getBlock());
51+
processConversion(event.world, blockPosition.get(block), pos, block.getBlock().getBlock());
5252
}
5353
iterator.remove();
5454
}
5555
}
5656
}
5757
}
5858

59-
private static void processConversion(World world, BlockPos pos, Block triggerBlock) {
59+
private void processConversion(World world, BlockPos oriPos, BlockPos pos, Block triggerBlock) {
6060
List<FallingAlchemyTweaker.ConversionRule> rules = FallingAlchemyTweaker.RULES.getOrDefault(triggerBlock, Collections.emptyList());
6161

6262
List<FallingAlchemyTweaker.ConversionRule> sortedRules = rules.stream().sorted(FallingAlchemyTweaker.ConversionRule::compareTo).collect(Collectors.toList());
@@ -84,6 +84,15 @@ private static void processConversion(World world, BlockPos pos, Block triggerBl
8484
}
8585

8686
if (multiplier <= 0) continue;
87+
// 避免无消耗物时multiplier异常
88+
if (rule.consumedItems.isEmpty()) {
89+
multiplier = 1;
90+
}
91+
92+
// 计算位移是否满足要求
93+
if (positionDistance(oriPos, pos) < rule.displacement) {
94+
continue;
95+
}
8796

8897
// 扣除每个消耗品
8998
for (ConsumedItem consumed : rule.consumedItems) {
@@ -116,14 +125,19 @@ private static void processConversion(World world, BlockPos pos, Block triggerBl
116125
int finalMultiplier = multiplier;
117126
rule.outputs.forEach(output -> {
118127
ItemStack spawnedStack = output.copy();
119-
spawnedStack.setCount(spawnedStack.getCount() * finalMultiplier);
120-
128+
//
129+
if (rule.displacement > 0 && positionDistance(oriPos, pos) > rule.displacement && rule.additionalProducts) {
130+
spawnedStack.setCount((int) ((positionDistance(oriPos, pos) - rule.displacement) + (spawnedStack.getCount() * finalMultiplier)));
131+
} else {
132+
spawnedStack.setCount(spawnedStack.getCount() * finalMultiplier);
133+
}
121134
EntityItem newItem = new EntityItem(world, pos.getX() + 0.5, pos.getY() + 0.2, pos.getZ() + 0.5, spawnedStack);
122135
newItem.setDefaultPickupDelay();
123136
newItem.motionY = 0.1;
124137
world.spawnEntity(newItem);
125138
});
126139
rule.playSuccessSound(world, pos);
140+
// 是否消耗方块
127141
if (world.rand.nextFloat() >= rule.keepBlockChance) {
128142
world.setBlockToAir(pos);
129143
}

src/main/java/work/crash/fallingalchemy/modsupport/FallingAlchemyTweaker.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ public static ConversionBuilder addConversion(
5151
@Optional double successChance,
5252
@Optional double keepBlockChance,
5353
@Optional int priority,
54-
@Optional String successSound, // 新增音效参数
54+
@Optional double displacement,
55+
@Optional boolean additionalProducts,
56+
@Optional String successSound,
5557
@Optional float successVolume,
5658
@Optional float successPitch,
5759
@Optional String failureSound,
@@ -77,7 +79,6 @@ public static ConversionBuilder addConversion(
7779

7880
float success = (float) MathHelper.clamp(successChance, 0.0, 1.0);
7981
float keep = (float) MathHelper.clamp(keepBlockChance, 0.0, 1.0);
80-
int finalPriority = priority;
8182

8283
SoundEvent successSd = parseSound(successSound);
8384
SoundEvent failureSd = parseSound(failureSound);
@@ -90,10 +91,12 @@ public static ConversionBuilder addConversion(
9091
block,
9192
Arrays.asList(consumedItems),
9293
(float) radius,
94+
(float) displacement,
95+
additionalProducts,
9396
mcOutputs,
9497
success,
9598
keep,
96-
finalPriority,
99+
priority,
97100
successSd, sVol, sPitch,
98101
failureSd, fVol, fPitch
99102
);
@@ -111,6 +114,8 @@ public static class ConversionRule implements Comparable<ConversionRule> {
111114
final Block triggerBlock;
112115
public final float radius;
113116
public final List<ConsumedItem> consumedItems; // 使用List存储多个消耗条件
117+
public final float displacement;
118+
public final boolean additionalProducts;
114119
public final float successChance;
115120
public final float keepBlockChance;
116121
public final List<ItemStack> outputs;
@@ -124,13 +129,15 @@ public static class ConversionRule implements Comparable<ConversionRule> {
124129
float failurePitch;
125130

126131
public ConversionRule(Block trigger, List<ConsumedItem> consumedItems, float radius,
127-
List<ItemStack> output, float success, float keep, int priority,
132+
float displacement, boolean additionalProducts, List<ItemStack> output, float success, float keep, int priority,
128133
SoundEvent successSound, float successVolume, float successPitch,
129134
SoundEvent failureSound, float failureVolume, float failurePitch) {
130135
this.triggerBlock = trigger;
131136
this.consumedItems = consumedItems;
132137
this.radius = radius;
133138
this.outputs = output;
139+
this.displacement = displacement;
140+
this.additionalProducts = additionalProducts;
134141
this.successChance = success;
135142
this.keepBlockChance = keep;
136143
this.priority = priority;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package work.crash.fallingalchemy.utils;
2+
3+
import net.minecraft.util.math.BlockPos;
4+
5+
public class Math {
6+
public static double positionDistance(BlockPos pos1, BlockPos pos2) {
7+
double dx = pos2.getX() - pos1.getX();
8+
double dy = pos2.getY() - pos1.getY();
9+
double dz = pos2.getZ() - pos1.getZ();
10+
11+
return java.lang.Math.sqrt(dx*dx + dy*dy + dz*dz);
12+
}
13+
}

0 commit comments

Comments
 (0)