Get creeperheal to properly log blocks in the database, using the new queue system.

This commit is contained in:
zontreck 2024-04-24 04:24:16 -07:00
parent a02cd91bcb
commit 2d525f3c7f
25 changed files with 492 additions and 9 deletions

View file

@ -157,6 +157,8 @@ dependencies {
// then special handling is done to allow a setup of a vanilla dependency without the use of an external repository.
minecraft "net.neoforged:forge:${minecraft_version}-${neo_version}"
runtimeOnly fg.deobf("maven.modrinth:mariadb-jdbc:3.1.4+20230506")
implementation fg.deobf("dev.zontreck:LibZontreckMod:${libzontreck}")
// Example mod dependency with JEI - using fg.deobf() ensures the dependency is remapped to your development mappings
// The JEI API is declared for compile time use, while the full JEI artifact is used at runtime

View file

@ -3,7 +3,7 @@
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false
libzontreck=1201.13.041224.0832
libzontreck=1201.13.042424.0415
## Environment Properties

View file

@ -1,4 +1,4 @@
// 1.20.1 2024-03-03T19:44:16.098572878 Block States: ariasessentials
// 1.20.1 2024-04-23T21:56:19.854483943 Block States: ariasessentials
ae2f6cd918bd461be7fb693641eaa5b78410b538 assets/ariasessentials/blockstates/clinker_brick_block.json
f48474f63edb825feaa3cc2c990ecd5ed6909c74 assets/ariasessentials/blockstates/clinker_brick_slab.json
5b501afd2a40c586b6811b9784ca2cd1a2dba373 assets/ariasessentials/blockstates/clinker_brick_stained_block.json
@ -34,6 +34,7 @@ acdba80ab9bebc435f3cfdc80f845fa942eaf1d4 assets/ariasessentials/blockstates/stee
b2076aa8074c942d074509a3ee27df350f81ab0f assets/ariasessentials/blockstates/steel_floor_grating_top.json
a637df1cfe9b47f5691beb585ad9e7f72a8a641b assets/ariasessentials/blockstates/steel_railing.json
7c667fb64bd412a080e1d92d9b7e194ef1a7cb25 assets/ariasessentials/blockstates/steel_table.json
1bef53c224409e06091b0f9da5407589e173845b assets/ariasessentials/blockstates/tflipflop.json
e03106a0ee60bc58f97f5cc3b1ad921f245c99dd assets/ariasessentials/models/block/clinker_brick_block_model0.json
d777dea2873725f45fadd678d411040f530f8f58 assets/ariasessentials/models/block/clinker_brick_block_model1.json
c480c6d87ce48bdf5d6fbb846a9c435a5c263c06 assets/ariasessentials/models/block/clinker_brick_block_model2.json
@ -391,6 +392,7 @@ c33b748f6f17358bd7d58374caea829f5af46c8d assets/ariasessentials/models/block/ste
e7f3120933bf9c3e48b630a6451cbadc3cfb49cb assets/ariasessentials/models/block/steel_floor_grating_top.json
711b9bb46c9847800562b02eb8cb83ad18e9cc82 assets/ariasessentials/models/block/steel_railing.json
8f302a21d929580d8500d08ebb54ad6b98071de2 assets/ariasessentials/models/block/steel_table.json
585d5b3662ac26492f4e06ba82306930f94ae07e assets/ariasessentials/models/block/tflipflop.json
4fca23a45d563abf5cf473dc0d1c245d48174b2a assets/ariasessentials/models/item/clinker_brick_block.json
e4ed8c1d0d0f321a19c7e72b059778bbbc9b38b5 assets/ariasessentials/models/item/clinker_brick_slab.json
4fbbce22895215e022ceed79aada64c3a498da6a assets/ariasessentials/models/item/clinker_brick_stained_block.json
@ -426,3 +428,4 @@ cf2fb18ac1885dc8d29dd6910a480e6df6f0159a assets/ariasessentials/models/item/stee
609df26ad277d9ed6f9e10a8c03d828136dd8cbb assets/ariasessentials/models/item/steel_floor_grating_top.json
ac717f3bc13cb5de4400d736175cacc91f525bdc assets/ariasessentials/models/item/steel_railing.json
18a59a078fccb7d9a638033aa76c5175d4abaa01 assets/ariasessentials/models/item/steel_table.json
fadd2e7bba0010cc7e3c0139ffda671a728ebe3f assets/ariasessentials/models/item/tflipflop.json

View file

@ -1,7 +1,6 @@
// 1.20.1 2024-03-03T19:41:24.288854196 Loot Tables
// 1.20.1 2024-04-23T21:53:46.136412523 Loot Tables
2b4a329fcd0a69fdad6c43120bd5de86ad0565af data/ariasessentials/loot_tables/blocks/clinker_brick_block.json
1ec32912180bc6bc4127ed7ddba8be226035858c data/ariasessentials/loot_tables/blocks/clinker_brick_recessed.json
006e62eaf1f971fd385a92b5d6b5477d032c88e3 data/ariasessentials/loot_tables/blocks/clinker_brick_sastor_corner_block.json
f9732252ea209ddd741e2b993a1e8917dd2ea889 data/ariasessentials/loot_tables/blocks/clinker_brick_slab.json
1ebd50d212ef1833facb449ff4926ca684238f5f data/ariasessentials/loot_tables/blocks/clinker_brick_stained_block.json
28f5cc93c182169e183435e963ed928c69a225d9 data/ariasessentials/loot_tables/blocks/clinker_brick_stained_slab.json
@ -37,3 +36,4 @@ b5b1ddda0fb43e0b553667d8fc7b7a036a0c5150 data/ariasessentials/loot_tables/blocks
54db4e8dce7f9d4b654de37cb16f7e292cb4fac9 data/ariasessentials/loot_tables/blocks/steel_floor_grating_top.json
7716ab37ac37d21bcb205d283bda1658f75a2df8 data/ariasessentials/loot_tables/blocks/steel_railing.json
878361275ccef96377190d00986722463f8da79c data/ariasessentials/loot_tables/blocks/steel_table.json
9f87deac2a9b034e2b571cf6113bc9ffd90e778e data/ariasessentials/loot_tables/blocks/tflipflop.json

View file

@ -0,0 +1,64 @@
{
"variants": {
"facing=east,input_power=false,powered=false": {
"model": "ariasessentials:block/tflipflop",
"y": 90
},
"facing=east,input_power=false,powered=true": {
"model": "ariasessentials:block/tflipflop",
"y": 90
},
"facing=east,input_power=true,powered=false": {
"model": "ariasessentials:block/tflipflop",
"y": 90
},
"facing=east,input_power=true,powered=true": {
"model": "ariasessentials:block/tflipflop",
"y": 90
},
"facing=north,input_power=false,powered=false": {
"model": "ariasessentials:block/tflipflop"
},
"facing=north,input_power=false,powered=true": {
"model": "ariasessentials:block/tflipflop"
},
"facing=north,input_power=true,powered=false": {
"model": "ariasessentials:block/tflipflop"
},
"facing=north,input_power=true,powered=true": {
"model": "ariasessentials:block/tflipflop"
},
"facing=south,input_power=false,powered=false": {
"model": "ariasessentials:block/tflipflop",
"y": 180
},
"facing=south,input_power=false,powered=true": {
"model": "ariasessentials:block/tflipflop",
"y": 180
},
"facing=south,input_power=true,powered=false": {
"model": "ariasessentials:block/tflipflop",
"y": 180
},
"facing=south,input_power=true,powered=true": {
"model": "ariasessentials:block/tflipflop",
"y": 180
},
"facing=west,input_power=false,powered=false": {
"model": "ariasessentials:block/tflipflop",
"y": 270
},
"facing=west,input_power=false,powered=true": {
"model": "ariasessentials:block/tflipflop",
"y": 270
},
"facing=west,input_power=true,powered=false": {
"model": "ariasessentials:block/tflipflop",
"y": 270
},
"facing=west,input_power=true,powered=true": {
"model": "ariasessentials:block/tflipflop",
"y": 270
}
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "ariasessentials:block/logicgates/tflipflop"
}

View file

@ -0,0 +1,3 @@
{
"parent": "ariasessentials:block/tflipflop"
}

View file

@ -11,11 +11,11 @@
"entries": [
{
"type": "minecraft:item",
"name": "ariasessentials:clinker_brick_sastor_corner_block"
"name": "ariasessentials:tflipflop"
}
],
"rolls": 1.0
}
],
"random_sequence": "ariasessentials:blocks/clinker_brick_sastor_corner_block"
"random_sequence": "ariasessentials:blocks/tflipflop"
}

View file

@ -5,6 +5,9 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import dev.zontreck.essentials.blocks.ModBlocks;
import dev.zontreck.essentials.client.Keybindings;
@ -60,6 +63,7 @@ public class AriasEssentials {
public static boolean ALIVE;
public static Map<UUID, Homes> player_homes = new HashMap<>();
public static boolean DEBUG = true;
public static ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

View file

@ -1,12 +1,37 @@
package dev.zontreck.essentials.antiexplode;
import dev.zontreck.libzontreck.memory.world.BlockRestoreQueue;
import dev.zontreck.libzontreck.memory.world.PrimitiveBlock;
import dev.zontreck.libzontreck.memory.world.SortedBlockQueue;
public class CreeperHealQueue extends SortedBlockQueue
public class CreeperHealQueue extends BlockRestoreQueue
{
@Override
public String getRestoreQueueName() {
return "creeperheal";
}
@Override
public boolean usesDatabase() {
return true;
}
@Override
public void databaseUpdate(PrimitiveBlock block) {
super.databaseUpdate(block);
notifyDirtyQueue(true);
}
@Override
public void notifyDirtyQueue(boolean b) {
// Queue was modified.
// Restart the timer for repairing blocks if necessary
}
@Override
public boolean sorted() {
return true;
}
}

View file

@ -1,6 +1,7 @@
package dev.zontreck.essentials.blocks;
import dev.zontreck.essentials.AriasEssentials;
import dev.zontreck.essentials.blocks.logicgates.TFlipFlopBlock;
import dev.zontreck.essentials.items.CreativeModeTabs;
import dev.zontreck.libzontreck.edlibmc.Auxiliaries;
import dev.zontreck.libzontreck.edlibmc.StandardBlocks;
@ -318,4 +319,7 @@ public class ModBlocks {
public static final RegistryObject<Block> STEEL_CATWALK_BLOCK = registerWithItem(BLOCKS.register("steel_catwalk_block", ()-> new Block(gratingBlock)), new Item.Properties());
public static final RegistryObject<Block> TFLIPFLOP_BLOCK = registerWithItem(BLOCKS.register("tflipflop", () -> new TFlipFlopBlock(noViewBlocking().noOcclusion().noCollission())), new Item.Properties());
}

View file

@ -0,0 +1,75 @@
package dev.zontreck.essentials.blocks.logicgates;
import dev.zontreck.essentials.blocks.RotatableBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import org.jetbrains.annotations.Nullable;
public class TFlipFlopBlock extends RotatableBlock
{
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final BooleanProperty INPUTPOWER = BooleanProperty.create("input_power");
public TFlipFlopBlock(Properties p_49795_) {
super(p_49795_);
}
@Override
public BlockState rotate(BlockState p_55115_, Rotation p_55116_) {
return p_55115_.setValue(FACING, p_55116_.rotate(p_55115_.getValue(FACING)));
}
@Override
public BlockState mirror(BlockState p_55112_, Mirror p_55113_) {
return p_55112_.rotate(p_55113_.getRotation(p_55112_.getValue(FACING)));
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext p_55087_) {
return super.getStateForPlacement(p_55087_).setValue(POWERED, false).setValue(INPUTPOWER, false);
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder);
builder.add(POWERED, INPUTPOWER);
}
@Override
public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, @Nullable Direction direction) {
return true;
}
@Override
public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) {
return state.getValue(POWERED) && state.getValue(FACING) == direction ? 15 : 0;
}
public void updatePowered(BlockState state)
{
boolean powered = state.getValue(POWERED);
boolean inputPower = state.getValue(INPUTPOWER);
if(inputPower)return;
inputPower = true;
powered = !powered;
state.setValue((POWERED), powered);
state.setValue((INPUTPOWER), inputPower);
}
public void removePower(BlockState state)
{
state.setValue(INPUTPOWER, false);
}
}

View file

@ -22,6 +22,7 @@ public class AEServerConfig
public Teleportation teleport;
public Messages messages;
public Bottles bottles;
public CreeperHeal creeperHeal;
@ -45,6 +46,11 @@ public class AEServerConfig
config.bottles = Bottles.deserialize(tag.getCompound(Bottles.TAG_NAME));
} else config.bottles = new Bottles();
if(tag.contains(CreeperHeal.TAG_NAME))
{
config.creeperHeal = CreeperHeal.deserialize(tag.getCompound(CreeperHeal.TAG_NAME));
}
return config;
}
@ -55,6 +61,8 @@ public class AEServerConfig
if(serverConfig.toFile().exists())
{
inst = deserialize(SNbtIo.loadSnbt(serverConfig));
save(); // incase of updates
}else {
initNewConfig();
}
@ -65,7 +73,7 @@ public class AEServerConfig
private static void initNewConfig()
{
inst = new AEServerConfig();
inst.reset();
inst.reset(); // also saves
}
private void reset()
@ -95,6 +103,7 @@ public class AEServerConfig
);
messages = new Messages();
bottles = new Bottles();
creeperHeal = new CreeperHeal();
@ -124,6 +133,7 @@ public class AEServerConfig
tag.put(Teleportation.TAG_NAME, teleport.serialize());
tag.put(Messages.TAG_NAME, messages.serialize());
tag.put(Bottles.TAG_NAME, bottles.serialize());
tag.put(CreeperHeal.TAG_NAME, creeperHeal.serialize());

View file

@ -0,0 +1,67 @@
package dev.zontreck.essentials.configs.server.sections;
import dev.zontreck.essentials.configs.server.AEServerConfig;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
import java.util.ArrayList;
import java.util.List;
public class CreeperHeal
{
public static final String TAG_NAME = "creeper_heal";
public static final String TAG_BLACKLIST = "blacklisted_dims";
public static final String TAG_VERSION = "version";
public static final String TAG_DURATION = "duration";
public List<String> blacklistedDimensions = new ArrayList<>();
public int version = 0;
public int duration = 40; // Once every 2 seconds
public static final int VERSION = 1;
public CompoundTag serialize()
{
CompoundTag tag = new CompoundTag();
tag.putInt(TAG_VERSION, version);
ListTag blacklist = new ListTag();
for(String dimension : blacklistedDimensions)
{
blacklist.add(StringTag.valueOf(dimension));
}
tag.put(TAG_BLACKLIST, blacklist);
tag.putInt(TAG_DURATION, duration);
return tag;
}
public static CreeperHeal deserialize(CompoundTag tag)
{
CreeperHeal heal = new CreeperHeal();
heal.version = tag.getInt(TAG_VERSION);
if(heal.version == 0){
heal.version = VERSION;
return heal;
}
if(heal.version >= 1)
{
ListTag lst = tag.getList(TAG_BLACKLIST, StringTag.TAG_STRING);
for(Tag t : lst)
{
heal.blacklistedDimensions.add(t.getAsString());
}
heal.duration = tag.getInt(TAG_DURATION);
}
return heal;
}
}

View file

@ -138,6 +138,8 @@ public class ModBlockStatesProvider extends BlockStateProvider {
blockWithExistingModel(ModBlocks.STEEL_CATWALK_BLOCK, "block/engineersdecor/steel_catwalk_block", false);
blockWithExistingModel(ModBlocks.TFLIPFLOP_BLOCK, "block/logicgates/tflipflop", true);
}
private void blockWithExistingModel(RegistryObject<Block> blk, String model, boolean rotatable)

View file

@ -76,6 +76,8 @@ public class ModBlockLootTablesProvider extends BlockLootSubProvider
dropSelf(ModBlocks.STEEL_CATWALK_BLOCK.get());
dropSelf(ModBlocks.TFLIPFLOP_BLOCK.get());
}

View file

@ -1,13 +1,26 @@
package dev.zontreck.essentials.imc;
import dev.zontreck.essentials.AriasEssentials;
import dev.zontreck.essentials.antiexplode.CreeperHealQueue;
import dev.zontreck.essentials.commands.teleport.TeleportActioner;
import dev.zontreck.essentials.commands.teleport.TeleportContainer;
import dev.zontreck.essentials.configs.server.AEServerConfig;
import dev.zontreck.libzontreck.config.ServerConfig;
import dev.zontreck.libzontreck.events.BlockRestoreQueueRegistrationEvent;
import dev.zontreck.libzontreck.events.TeleportEvent;
import dev.zontreck.libzontreck.memory.world.BlockRestoreQueue;
import dev.zontreck.libzontreck.memory.world.BlockRestoreQueueRegistry;
import dev.zontreck.libzontreck.memory.world.BlockRestoreRunner;
import dev.zontreck.libzontreck.memory.world.SavedBlock;
import dev.zontreck.libzontreck.vectors.Vector3i;
import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec2;
import net.minecraftforge.event.level.ExplosionEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import java.util.Timer;
import java.util.concurrent.TimeUnit;
public class Events
{
@SubscribeEvent
@ -26,6 +39,23 @@ public class Events
@SubscribeEvent
public static void onRegisterRestoreQueues (BlockRestoreQueueRegistrationEvent event)
{
event.register(new CreeperHealQueue());
CreeperHealQueue queue = new CreeperHealQueue();
event.register(queue);
BlockRestoreRunner runner = new BlockRestoreRunner(queue);
AriasEssentials.executorService.scheduleAtFixedRate(runner, 0, AEServerConfig.getInstance().creeperHeal.duration * 1000 / 20, TimeUnit.MILLISECONDS);
}
@SubscribeEvent
public static void onExplosionEvent(ExplosionEvent.Detonate event)
{
for(BlockPos pos : event.getAffectedBlocks())
{
SavedBlock sb = SavedBlock.takeSnapshot(new Vector3i(pos), event.getLevel());
BlockRestoreQueue queue = BlockRestoreQueueRegistry.getQueue("creeperheal");
queue.enqueueBlock(sb);
}
}
}

View file

@ -43,6 +43,7 @@
"block.ariasessentials.steel_catwalk_stairs_rr": "Steel Catwalk Right Rail",
"block.ariasessentials.steel_catwalk_stairs_dr": "Steel Catwalk Double Rail",
"block.ariasessentials.steel_catwalk_block": "Steel Catwalk Block",
"block.ariasessentials.tflipflop": "T-Flip Flop",
"key.category.ariasessentials": "Aria's Essentials",
"key.ariasessentials.autowalk": "Auto Walk"

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,187 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "ariasessentials:block/logicgates/logic_gate",
"1": "ariasessentials:block/logicgates/tflipflop",
"2": "ariasessentials:block/logicgates/locked_bar",
"3": "ariasessentials:block/logicgates/torch",
"4": "ariasessentials:block/logicgates/off",
"particle": "ariasessentials:block/logicgates/logic_gate"
},
"elements": [
{
"from": [0.25, 0.25, 0.25],
"to": [15.75, 0.5, 15.75],
"faces": {
"north": {"uv": [0, 0, 15.5, 0.25], "texture": "#0"},
"east": {"uv": [0, 0, 15.5, 0.25], "texture": "#0"},
"south": {"uv": [0, 0, 15.5, 0.25], "texture": "#0"},
"west": {"uv": [0, 0, 15.5, 0.25], "texture": "#0"},
"up": {"uv": [0, 0, 15.5, 15.5], "rotation": 270, "texture": "#1"}
}
},
{
"name": "lock_bar",
"from": [3, 0.5, 11],
"to": [13, 1, 12],
"faces": {
"north": {"uv": [0, 0, 9, 1], "texture": "#2"},
"east": {"uv": [2, 3, 3, 4], "texture": "#2"},
"south": {"uv": [0, 1, 9, 2], "texture": "#2"},
"west": {"uv": [2, 2, 3, 3], "texture": "#2"},
"up": {"uv": [1, 11, 0, 2], "rotation": 270, "texture": "#2"}
}
},
{
"from": [0, 0, 0],
"to": [16, 0.25, 16],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "texture": "#0"},
"south": {"uv": [0, 0, 16, 16], "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "texture": "#0"},
"up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [16, 0, 0, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "indicator",
"from": [8.4, 3.25, 14.25],
"to": [9.15, 4.25, 15],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#4"},
"east": {"uv": [0, 0, 16, 16], "texture": "#4"},
"south": {"uv": [0, 0, 16, 16], "texture": "#4"},
"west": {"uv": [0, 0, 16, 16], "texture": "#4"},
"up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#4"}
}
},
{
"name": "torch",
"from": [8.4, 0.5, 14.25],
"to": [9.15, 3.25, 15],
"faces": {
"north": {"uv": [1, 0, 2, 3], "texture": "#3"},
"east": {"uv": [2, 0, 2.75, 2.75], "texture": "#3"},
"south": {"uv": [0, 3, 1, 6], "texture": "#3"},
"west": {"uv": [0, 0, 1, 3], "texture": "#3"},
"up": {"uv": [4, 1, 3, 0], "rotation": 270, "texture": "#3"},
"down": {"uv": [2, 3, 1, 4], "rotation": 90, "texture": "#3"}
}
},
{
"name": "indicator",
"from": [8.4, 3.25, 4.25],
"to": [9.15, 4.25, 5],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#4"},
"east": {"uv": [0, 0, 16, 16], "texture": "#4"},
"south": {"uv": [0, 0, 16, 16], "texture": "#4"},
"west": {"uv": [0, 0, 16, 16], "texture": "#4"},
"up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#4"}
}
},
{
"name": "torch",
"from": [8.4, 0.5, 4.25],
"to": [9.15, 3.25, 5],
"faces": {
"north": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"east": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"south": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"west": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"up": {"uv": [0, 0, 0.75, 0.75], "rotation": 270, "texture": "#3"},
"down": {"uv": [0, 0, 0.75, 0.75], "rotation": 90, "texture": "#3"}
}
},
{
"name": "indicator",
"from": [8.4, 3.25, 1.25],
"to": [9.15, 4.25, 2],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#4"},
"east": {"uv": [0, 0, 16, 16], "texture": "#4"},
"south": {"uv": [0, 0, 16, 16], "texture": "#4"},
"west": {"uv": [0, 0, 16, 16], "texture": "#4"},
"up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#4"}
}
},
{
"name": "torch",
"from": [8.4, 0.5, 1.25],
"to": [9.15, 3.25, 2],
"faces": {
"north": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"east": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"south": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"west": {"uv": [0, 0, 0.75, 2.75], "texture": "#3"},
"up": {"uv": [0, 0, 0.75, 0.75], "rotation": 270, "texture": "#3"},
"down": {"uv": [0, 0, 0.75, 0.75], "rotation": 90, "texture": "#3"}
}
}
],
"display": {
"thirdperson_righthand": {
"translation": [0, 4.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"thirdperson_lefthand": {
"translation": [0, 4, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_righthand": {
"translation": [0, 3.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"translation": [0, 4.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [45, 45, 0],
"translation": [0, -0.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"head": {
"translation": [0, 14.25, 0]
},
"fixed": {
"rotation": [-90, 0, 0],
"translation": [0, 0, -3.75],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "base",
"origin": [0, 0, 0],
"color": 0,
"nbt": "{}",
"children": [0, 1, 2]
},
{
"name": "input",
"origin": [0, 0, 0],
"color": 0,
"nbt": "{}",
"children": [3, 4]
},
{
"name": "state",
"origin": [0, 0, 0],
"color": 0,
"nbt": "{}",
"children": [5, 6]
},
{
"name": "state",
"origin": [0, 0, 0],
"color": 0,
"nbt": "{}",
"children": [7, 8]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B