added stuff

This commit is contained in:
Chipperfluff 2025-12-17 13:32:28 +01:00
parent ca55f5a503
commit f087190fa9
23 changed files with 266 additions and 65 deletions

View File

@ -15,7 +15,7 @@ import net.minecraft.structure.StructureTemplate;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.GameRules; import net.minecraft.world.GameRules;
import net.Chipperfluff.chipi.item.ModItemGroups;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKey;
@ -39,6 +39,7 @@ public class ChipiMod implements ModInitializer {
ModBlocks.register(); ModBlocks.register();
ModItems.register(); ModItems.register();
ModItemGroups.register();
ModCriteria.register(); ModCriteria.register();
BiomeModifications.addFeature( BiomeModifications.addFeature(

View File

@ -13,6 +13,9 @@ public class ModCriteria {
public static final VoidConsumedTrigger VOID_CONSUMED_TRIGGER = public static final VoidConsumedTrigger VOID_CONSUMED_TRIGGER =
Criteria.register(new VoidConsumedTrigger()); Criteria.register(new VoidConsumedTrigger());
public static final VoidConsumedFireTrigger VOID_CONSUMED_FIRE_TRIGGER =
Criteria.register(new VoidConsumedFireTrigger());
public static void register() { public static void register() {
// classload trigger // classload trigger
} }

View File

@ -0,0 +1,40 @@
package net.Chipperfluff.chipi.advancement;
import com.google.gson.JsonObject;
import net.minecraft.advancement.criterion.AbstractCriterion;
import net.minecraft.advancement.criterion.AbstractCriterionConditions;
import net.minecraft.predicate.entity.AdvancementEntityPredicateDeserializer;
import net.minecraft.predicate.entity.LootContextPredicate;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
public class VoidConsumedFireTrigger
extends AbstractCriterion<VoidConsumedFireTrigger.Conditions> {
public static final Identifier ID =
new Identifier("chipi", "void_consumed_fire");
@Override
public Identifier getId() {
return ID;
}
@Override
protected Conditions conditionsFromJson(
JsonObject json,
LootContextPredicate player,
AdvancementEntityPredicateDeserializer deserializer
) {
return new Conditions(player);
}
public void trigger(ServerPlayerEntity player) {
this.trigger(player, conditions -> true);
}
public static class Conditions extends AbstractCriterionConditions {
public Conditions(LootContextPredicate player) {
super(ID, player);
}
}
}

View File

@ -5,18 +5,17 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext; import net.minecraft.block.ShapeContext;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.packet.s2c.play.PositionFlag;
import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryKeys;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes; import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.TeleportTarget;
import net.minecraft.network.packet.s2c.play.PositionFlag;
import java.util.EnumSet; import java.util.EnumSet;
public class ChipperPortalBlock extends Block { public class ChipperPortalBlock extends Block {
@ -25,6 +24,7 @@ public class ChipperPortalBlock extends Block {
super(settings); super(settings);
} }
// Walk-through portal
@Override @Override
public VoxelShape getCollisionShape( public VoxelShape getCollisionShape(
BlockState state, BlockState state,
@ -54,29 +54,34 @@ public class ChipperPortalBlock extends Block {
if (targetWorld == null) return; if (targetWorld == null) return;
TeleportTarget target = new TeleportTarget( // SAFE spawn position inside your dungeon
new Vec3d(5.5, 90, 5.5), BlockPos spawn = new BlockPos(5, 90, 6);
Vec3d.ZERO,
player.getYaw(), // Safety: make sure feet are not in air
player.getPitch() if (!targetWorld.getBlockState(spawn.down()).isSolidBlock(targetWorld, spawn.down())) {
); spawn = spawn.up();
}
player.teleport( player.teleport(
targetWorld, targetWorld,
5.5, spawn.getX() + 0.5,
88.0, spawn.getY(),
6.5, spawn.getZ() + 0.5,
EnumSet.noneOf(PositionFlag.class), EnumSet.noneOf(PositionFlag.class),
player.getYaw(), player.getYaw(),
player.getPitch() player.getPitch()
); );
} }
@Override @Override
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { public float calcBlockBreakingDelta(
if (!player.isCreative()) { BlockState state,
return 0.0F; PlayerEntity player,
} BlockView world,
return super.calcBlockBreakingDelta(state, player, world, pos); BlockPos pos
) {
return player.isCreative()
? super.calcBlockBreakingDelta(state, player, world, pos)
: 0.0F;
} }
} }

View File

@ -17,7 +17,6 @@ import net.minecraft.world.World;
import net.Chipperfluff.chipi.advancement.ModCriteria; import net.Chipperfluff.chipi.advancement.ModCriteria;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
public class VoidBlock extends Block { public class VoidBlock extends Block {
public VoidBlock(Settings settings) { public VoidBlock(Settings settings) {
@ -40,23 +39,33 @@ public class VoidBlock extends Block {
} }
} }
RegistryEntry<DamageType> voidType = world boolean burning = living.isOnFire();
Identifier damageId = burning
? new Identifier("chipi", "void_block_fire")
: new Identifier("chipi", "void_block");
RegistryEntry<DamageType> damageType = world
.getRegistryManager() .getRegistryManager()
.get(RegistryKeys.DAMAGE_TYPE) .get(RegistryKeys.DAMAGE_TYPE)
.entryOf( .entryOf(
RegistryKey.of( RegistryKey.of(
RegistryKeys.DAMAGE_TYPE, RegistryKeys.DAMAGE_TYPE,
new Identifier("chipi", "void_block") damageId
) )
); );
DamageSource voidSource = new DamageSource(voidType); DamageSource source = new DamageSource(damageType);
if (living instanceof ServerPlayerEntity serverPlayer) { if (living instanceof ServerPlayerEntity serverPlayer) {
ModCriteria.VOID_CONSUMED_TRIGGER.trigger(serverPlayer); if (burning) {
ModCriteria.VOID_CONSUMED_FIRE_TRIGGER.trigger(serverPlayer);
} else {
ModCriteria.VOID_CONSUMED_TRIGGER.trigger(serverPlayer);
}
} }
living.damage(voidSource, Float.MAX_VALUE); living.damage(source, Float.MAX_VALUE);
} }
} }

View File

@ -0,0 +1,43 @@
package net.Chipperfluff.chipi.item;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.Chipperfluff.chipi.ChipiMod;
import net.Chipperfluff.chipi.block.ModBlocks;
import net.Chipperfluff.chipi.item.ModItems;
public class ModItemGroups {
public static final ItemGroup CHIPI_GROUP = Registry.register(
Registries.ITEM_GROUP,
new Identifier(ChipiMod.MOD_ID, "chipi"),
FabricItemGroup.builder()
.displayName(Text.translatable("itemGroup.chipi.chipi"))
.icon(() -> new ItemStack(ModBlocks.VOID_BLOCK.asItem()))
.entries((context, entries) -> {
// Blocks
entries.add(ModBlocks.VOID_BLOCK);
entries.add(ModBlocks.CHIPPER_FRAME);
entries.add(ModBlocks.CHIPPER_PORTAL);
entries.add(ModBlocks.CHIPPER_ORE);
entries.add(ModBlocks.CHIPPER_ALLOY_BLOCK);
// Items
entries.add(ModItems.NUT);
entries.add(ModItems.RAW_CHIPPER_ORE);
entries.add(ModItems.CHIPPER_INGOT);
entries.add(ModItems.CHIPPER_ALLOY);
})
.build()
);
public static void register() {
// force class load
}
}

View File

@ -1,14 +1,11 @@
package net.Chipperfluff.chipi.world.gen; package net.Chipperfluff.chipi.world.gen;
import net.Chipperfluff.chipi.world.gen.DungeonContext;
import net.Chipperfluff.chipi.world.gen.struct.CorridorEWStructure; import net.Chipperfluff.chipi.world.gen.struct.CorridorEWStructure;
import net.Chipperfluff.chipi.world.gen.struct.CorridorNSStructure; import net.Chipperfluff.chipi.world.gen.struct.CorridorNSStructure;
import net.Chipperfluff.chipi.world.gen.struct.RoomBaseStructure; import net.Chipperfluff.chipi.world.gen.struct.RoomBaseStructure;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.enums.BlockHalf;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.state.property.Properties;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
public class ChipiDungeonGenerator { public class ChipiDungeonGenerator {
@ -33,18 +30,6 @@ public class ChipiDungeonGenerator {
private static final int ROWS_SOUTH = 40; // rows of rooms south of spawn (spawn room itself is already placed) private static final int ROWS_SOUTH = 40; // rows of rooms south of spawn (spawn room itself is already placed)
private static final int COLS_EW = 40; // columns across X (split roughly evenly around center) private static final int COLS_EW = 40; // columns across X (split roughly evenly around center)
private static RoomBaseStructure getRoom() {
return new RoomBaseStructure();
}
private static CorridorNSStructure getTunnelNS() {
return new CorridorNSStructure();
}
private static CorridorEWStructure getTunnelEW() {
return new CorridorEWStructure();
}
private ChipiDungeonGenerator() {} private ChipiDungeonGenerator() {}
public static void generateInitialLayout(ServerWorld world, BlockPos portalSpawnPos) { public static void generateInitialLayout(ServerWorld world, BlockPos portalSpawnPos) {
@ -54,13 +39,11 @@ public class ChipiDungeonGenerator {
BlockPos firstCorridorAnchor = new BlockPos(5, CORRIDOR_Y, 11); BlockPos firstCorridorAnchor = new BlockPos(5, CORRIDOR_Y, 11);
BlockPos firstGeneratedRoomCenter = new BlockPos(5, ROOM_Y, 24); // explicit first floor anchor BlockPos firstGeneratedRoomCenter = new BlockPos(5, ROOM_Y, 24); // explicit first floor anchor
// First room/corridor use direct instances as requested. DungeonContext ctx = DungeonContext.EMPTY;
RoomBaseStructure firstRoom = new RoomBaseStructure();
CorridorNSStructure firstCorridor = new CorridorNSStructure();
RoomBaseStructure room = getRoom(); // First room/corridor use direct instances as requested.
CorridorNSStructure corridorNS = getTunnelNS(); RoomBaseStructure firstRoom = WorldMaster.getDefaultRoom();
CorridorEWStructure corridorEW = getTunnelEW(); CorridorNSStructure firstCorridor = WorldMaster.getDefaultCorridorNS();
// Place the first room (absolute coordinates). // Place the first room (absolute coordinates).
firstRoom.placeAt(world, firstGeneratedRoomCenter); firstRoom.placeAt(world, firstGeneratedRoomCenter);
@ -75,11 +58,16 @@ public class ChipiDungeonGenerator {
// Place rooms strictly southward (Z never decreases), across X in both directions. // Place rooms strictly southward (Z never decreases), across X in both directions.
for (int row = 0; row < ROWS_SOUTH; row++) { for (int row = 0; row < ROWS_SOUTH; row++) {
for (int col = minCol; col <= maxCol; col++) { for (int col = minCol; col <= maxCol; col++) {
int gridX = col; // grid 0,0 is the first generated room; -X -> negative gridX, +X -> positive gridX
int gridY = row; // gridY increases southward only
BlockPos center = new BlockPos( BlockPos center = new BlockPos(
firstGeneratedRoomCenter.getX() + (col * STEP_X), firstGeneratedRoomCenter.getX() + (col * STEP_X),
ROOM_Y, ROOM_Y,
firstGeneratedRoomCenter.getZ() + (row * STEP_Z) firstGeneratedRoomCenter.getZ() + (row * STEP_Z)
); );
RoomBaseStructure room = WorldMaster.resolveRoom(gridX, gridY, ctx);
room.placeAt(world, center); room.placeAt(world, center);
} }
} }
@ -87,6 +75,9 @@ public class ChipiDungeonGenerator {
// Connect each room to the next one south with a corridor at fixed Y (no northward connections). // Connect each room to the next one south with a corridor at fixed Y (no northward connections).
for (int row = 0; row < ROWS_SOUTH - 1; row++) { for (int row = 0; row < ROWS_SOUTH - 1; row++) {
for (int col = minCol; col <= maxCol; col++) { for (int col = minCol; col <= maxCol; col++) {
int gridX = col;
int gridY = row;
BlockPos currentCenter = new BlockPos( BlockPos currentCenter = new BlockPos(
firstGeneratedRoomCenter.getX() + (col * STEP_X), firstGeneratedRoomCenter.getX() + (col * STEP_X),
ROOM_Y, ROOM_Y,
@ -99,6 +90,7 @@ public class ChipiDungeonGenerator {
currentCenter.getZ() + ROOM_EXTENT_SOUTH currentCenter.getZ() + ROOM_EXTENT_SOUTH
); );
CorridorNSStructure corridorNS = WorldMaster.resolveCorridorNS(gridX, gridY, ctx);
corridorNS.placeAt(world, anchorSouth); corridorNS.placeAt(world, anchorSouth);
} }
} }
@ -106,6 +98,9 @@ public class ChipiDungeonGenerator {
// Connect east-west neighbors in each row. // Connect east-west neighbors in each row.
for (int row = 0; row < ROWS_SOUTH; row++) { for (int row = 0; row < ROWS_SOUTH; row++) {
for (int col = minCol; col < maxCol; col++) { for (int col = minCol; col < maxCol; col++) {
int gridX = col;
int gridY = row;
BlockPos currentCenter = new BlockPos( BlockPos currentCenter = new BlockPos(
firstGeneratedRoomCenter.getX() + (col * STEP_X), firstGeneratedRoomCenter.getX() + (col * STEP_X),
ROOM_Y, ROOM_Y,
@ -118,6 +113,7 @@ public class ChipiDungeonGenerator {
currentCenter.getZ() currentCenter.getZ()
); );
CorridorEWStructure corridorEW = WorldMaster.resolveCorridorEW(gridX, gridY, ctx);
corridorEW.placeAt(world, anchorEast); corridorEW.placeAt(world, anchorEast);
} }
} }

View File

@ -0,0 +1,11 @@
package net.Chipperfluff.chipi.world.gen;
/**
* Placeholder context for dungeon generation decisions.
* Will later hold seed, reservations, phases, etc.
*/
public final class DungeonContext {
public static final DungeonContext EMPTY = new DungeonContext();
private DungeonContext() {}
}

View File

@ -0,0 +1,65 @@
package net.Chipperfluff.chipi.world.gen;
import net.Chipperfluff.chipi.world.gen.struct.CorridorEWStructure;
import net.Chipperfluff.chipi.world.gen.struct.CorridorNSStructure;
import net.Chipperfluff.chipi.world.gen.struct.RoomBaseStructure;
public final class WorldMaster {
private WorldMaster() {}
public static RoomBaseStructure getDefaultRoom() {
return new RoomBaseStructure();
}
public static CorridorNSStructure getDefaultCorridorNS() {
return new CorridorNSStructure();
}
public static CorridorEWStructure getDefaultCorridorEW() {
return new CorridorEWStructure();
}
/**
* Decide which ROOM exists at this grid position.
*
* @param gridX logical dungeon grid X
* @param gridY logical dungeon grid Y
* @param ctx snapshot of dungeon state (seed, reserved map, phase, etc.)
*/
public static RoomBaseStructure resolveRoom(
int gridX,
int gridY,
DungeonContext ctx
) {
// later:
// - check reserved HashMap
// - check spawn/boss rules
// - check generation phase
// - check random seed
return getDefaultRoom();
}
/**
* Decide which NORTH-SOUTH corridor exists at this grid position.
*/
public static CorridorNSStructure resolveCorridorNS(
int gridX,
int gridY,
DungeonContext ctx
) {
return getDefaultCorridorNS();
}
/**
* Decide which EAST-WEST corridor exists at this grid position.
*/
public static CorridorEWStructure resolveCorridorEW(
int gridX,
int gridY,
DungeonContext ctx
) {
return getDefaultCorridorEW();
}
}

View File

@ -1,5 +1,8 @@
{ {
"death.attack.void_block": "%1$s stepped beyond safety and the Outside took them", "death.attack.void_block": "§8%1$s stepped beyond safety — the Outside answered.",
"death.attack.chipi.void_block_fire": "§c%1$s tried to save themselves.§r §8It got worse.",
"itemGroup.chipi.chipi": "Chipi",
"block.chipi.void_block": "Void Block", "block.chipi.void_block": "Void Block",
"block.chipi.chipper_frame": "Chipper Frame", "block.chipi.chipper_frame": "Chipper Frame",

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:nut" }, "icon": { "item": "chipi:nut" },
"title": "Nutty Preworkout", "title": "Nutty Preworkout",
"description": "Munch a nut to impress the gym-rat squirrels", "description": "Munch a nut to impress the swole floofs, uwu",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -0,0 +1,17 @@
{
"parent": "chipi:root",
"display": {
"icon": { "item": "minecraft:lava_bucket" },
"title": "That Didnt Help",
"description": "Tried to save yourself. Landed somewhere even worse.",
"frame": "challenge",
"hidden": true,
"show_toast": true,
"announce_to_chat": false
},
"criteria": {
"burning_void": {
"trigger": "chipi:void_consumed_fire"
}
}
}

View File

@ -2,8 +2,8 @@
"parent": "chipi:progression/light_portal", "parent": "chipi:progression/light_portal",
"display": { "display": {
"icon": { "item": "chipi:chipper_portal" }, "icon": { "item": "chipi:chipper_portal" },
"title": "Into the Twink Zone", "title": "Into the Nya Zone",
"description": "Leap through the portal and let the feral squirrels judge you", "description": "Leap through the portal; feral fluffers judge you with big eyes, nya",
"frame": "challenge" "frame": "challenge"
}, },
"criteria": { "criteria": {

View File

@ -2,8 +2,8 @@
"parent": "chipi:root", "parent": "chipi:root",
"display": { "display": {
"icon": { "item": "chipi:nut" }, "icon": { "item": "chipi:nut" },
"title": "Certified Nut Goblin", "title": "Nuts OwO",
"description": "Pocket a nut before the other femboys gossip", "description": "Nyaa~ stash a nut before the other fluffballs start gossiping",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:raw_chipper_ore" }, "icon": { "item": "chipi:raw_chipper_ore" },
"title": "Shiny Squirrel Snack", "title": "Shiny Squirrel Snack",
"description": "Dig up raw chipper ore before someone nibbles it", "description": "Dig up raw chipper ore before someone nibbles it, nya",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:chipper_portal" }, "icon": { "item": "chipi:chipper_portal" },
"title": "Absolutely Do Not Light This", "title": "Absolutely Do Not Light This",
"description": "Ignite the portal as femboy squirrels chant \"oh no don't go in... or do\"", "description": "Ignite the portal as the burrow whispers \"oh no don't go out there... nya\"",
"frame": "challenge", "frame": "challenge",
"hidden": true, "hidden": true,
"show_toast": true, "show_toast": true,

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:chipper_alloy_block" }, "icon": { "item": "chipi:chipper_alloy_block" },
"title": "Bulked-Up Bling", "title": "Bulked-Up Bling",
"description": "Press that alloy into a block—swole femboy decor", "description": "Press that alloy into a block—buff shiny burrow decor, uwu",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -2,8 +2,8 @@
"parent": "chipi:root", "parent": "chipi:root",
"display": { "display": {
"icon": { "item": "chipi:chipper_frame" }, "icon": { "item": "chipi:chipper_frame" },
"title": "Framing the Twink Door", "title": "Framing the Nya Door",
"description": "Assemble the portal while squirrels whisper this is a bad idea", "description": "Assemble the portal while the squirrels whisper this is a bad idea, nya",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:chipper_alloy_block" }, "icon": { "item": "chipi:chipper_alloy_block" },
"title": "Bulk Metal Feng Shui", "title": "Bulk Metal Feng Shui",
"description": "Place a chipper alloy block like it's a shiny gym mirror", "description": "Place a chipper alloy block like it's a shiny gym mirror, OwO",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:chipper_ingot" }, "icon": { "item": "chipi:chipper_ingot" },
"title": "Spa Day for Rocks", "title": "Spa Day for Rocks",
"description": "Smelt chipper ore into ingots, pampered femboy style", "description": "Smelt chipper ore into ingots—pampered den-day treatment, uwu",
"frame": "task" "frame": "task"
}, },
"criteria": { "criteria": {

View File

@ -3,7 +3,7 @@
"display": { "display": {
"icon": { "item": "chipi:chipper_frame" }, "icon": { "item": "chipi:chipper_frame" },
"title": "Forbidden IKEA Manual", "title": "Forbidden IKEA Manual",
"description": "Unlock the portal frame recipe while femboy squirrels look concerned", "description": "Unlock the portal frame recipe while the fluffy crowd side-eyes you, nya",
"frame": "goal" "frame": "goal"
}, },
"criteria": { "criteria": {

View File

@ -2,7 +2,7 @@
"display": { "display": {
"icon": { "item": "chipi:chipper_ingot" }, "icon": { "item": "chipi:chipper_ingot" },
"title": "Welcome to the Burrow", "title": "Welcome to the Burrow",
"description": "Industrial femboy nonsense kicks off", "description": "Industrial fluff nonsense kicks off, nya~",
"background": "minecraft:textures/block/stone.png", "background": "minecraft:textures/block/stone.png",
"show_toast": false, "show_toast": false,
"announce_to_chat": false, "announce_to_chat": false,

View File

@ -0,0 +1,8 @@
{
"message_id": "chipi.void_block_fire",
"scaling": "never",
"exhaustion": 0.0,
"effects": {
"burning": true
}
}