fix(combinations): guard null response; reject self-combination at load
- Combinations.tryUse: only write response when non-null and non-blank, preventing NPE/IllegalArgument for effects-only recipes. - CombinationFactory.fromDto: throw WorldLoadException when a == b, since item singletons make a self-combination impossible at runtime. - Tests: +effectsOnlyRecipeAppliesEffectsWithoutProduceOrResponse (CombinationsTest 7→8), +rejectsSelfCombination (CombinationFactoryTest 4→5). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -47,7 +47,9 @@ public final class Combinations {
|
||||
}
|
||||
}
|
||||
Effects.applyAll(c.effects(), ctx);
|
||||
ctx.getIo().write(c.response());
|
||||
if (c.response() != null && !c.response().isBlank()) {
|
||||
ctx.getIo().write(c.response());
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean present(GameContext ctx, String id) {
|
||||
|
||||
@@ -18,6 +18,10 @@ public final class CombinationFactory {
|
||||
public static Combination fromDto(CombinationDto dto, Map<String, Item> items) {
|
||||
requireItem(items, dto.a(), "a");
|
||||
requireItem(items, dto.b(), "b");
|
||||
if (dto.a().equals(dto.b())) {
|
||||
throw new WorldLoadException(
|
||||
"Combination cannot combine an item with itself: '" + dto.a() + "'");
|
||||
}
|
||||
if (dto.consume() != null) {
|
||||
for (String id : dto.consume()) {
|
||||
requireItem(items, id, "consume");
|
||||
|
||||
Reference in New Issue
Block a user