From 02f780ef0a81f433d31dbba982e4909409eda5f8 Mon Sep 17 00:00:00 2001 From: reoseah Date: Wed, 27 Nov 2024 17:35:04 +0100 Subject: [PATCH] progress on Arcane Resonator, a redstone component detecting spell usage --- .../reoseah/magisterium/Magisterium.java | 6 + .../magisterium/MagisteriumClient.java | 15 ++- .../block/ArcaneResonatorBlock.java | 122 ++++++++++++++++++ .../magisterium/block/IllusoryWallBlock.java | 1 + .../entity/ArcaneResonatorBlockEntity.java | 16 +++ .../{ => entity}/IllusoryWallBlockEntity.java | 3 +- .../render/ArcaneResonatorRenderer.java | 41 ++++++ .../IllusoryWallBlockEntityRenderer.java | 9 +- .../data/effect/IllusoryWallEffect.java | 2 +- .../blockstates/arcane_resonator.json | 10 ++ .../blockstates/arcane_resonator_crystal.json | 10 ++ .../assets/magisterium/lang/en_us.json | 5 +- .../models/block/arcane_resonator.json | 22 ++++ .../block/arcane_resonator_crystal.json | 23 ++++ .../block/arcane_resonator_crystal_on.json | 23 ++++ .../models/block/arcane_resonator_on.json | 22 ++++ .../models/item/arcane_resonator.json | 6 + .../textures/block/arcane_resonator.png | Bin 0 -> 581 bytes .../block/arcane_resonator_crystal.png | Bin 0 -> 816 bytes .../textures/block/arcane_resonator_on.png | Bin 0 -> 585 bytes .../textures/item/arcane_resonator.png | Bin 0 -> 437 bytes .../magisterium/textures/item/blaze_rune.png | Bin 408 -> 398 bytes .../textures/item/placeholder/fire.png | Bin 0 -> 225 bytes .../textures/item/placeholder/wind.png | Bin 0 -> 239 bytes .../magisterium/textures/item/wind_rune.png | Bin 464 -> 458 bytes .../loot_table/blocks/arcane_resonator.json | 21 +++ .../magisterium/pages/cold_snap.json | 6 +- .../magisterium/pages/conflagrate.json | 7 +- unused_assets/Sprite-0001.png | Bin 0 -> 4665 bytes unused_assets/jukebox_top.png | Bin 0 -> 716 bytes 30 files changed, 355 insertions(+), 15 deletions(-) create mode 100644 src/main/java/io/github/reoseah/magisterium/block/ArcaneResonatorBlock.java create mode 100644 src/main/java/io/github/reoseah/magisterium/block/entity/ArcaneResonatorBlockEntity.java rename src/main/java/io/github/reoseah/magisterium/block/{ => entity}/IllusoryWallBlockEntity.java (95%) create mode 100644 src/main/java/io/github/reoseah/magisterium/client/render/ArcaneResonatorRenderer.java rename src/main/java/io/github/reoseah/magisterium/{block => client/render}/IllusoryWallBlockEntityRenderer.java (69%) create mode 100644 src/main/resources/assets/magisterium/blockstates/arcane_resonator.json create mode 100644 src/main/resources/assets/magisterium/blockstates/arcane_resonator_crystal.json create mode 100644 src/main/resources/assets/magisterium/models/block/arcane_resonator.json create mode 100644 src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal.json create mode 100644 src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal_on.json create mode 100644 src/main/resources/assets/magisterium/models/block/arcane_resonator_on.json create mode 100644 src/main/resources/assets/magisterium/models/item/arcane_resonator.json create mode 100644 src/main/resources/assets/magisterium/textures/block/arcane_resonator.png create mode 100644 src/main/resources/assets/magisterium/textures/block/arcane_resonator_crystal.png create mode 100644 src/main/resources/assets/magisterium/textures/block/arcane_resonator_on.png create mode 100644 src/main/resources/assets/magisterium/textures/item/arcane_resonator.png create mode 100644 src/main/resources/assets/magisterium/textures/item/placeholder/fire.png create mode 100644 src/main/resources/assets/magisterium/textures/item/placeholder/wind.png create mode 100644 src/main/resources/data/magisterium/loot_table/blocks/arcane_resonator.json create mode 100644 unused_assets/Sprite-0001.png create mode 100644 unused_assets/jukebox_top.png diff --git a/src/main/java/io/github/reoseah/magisterium/Magisterium.java b/src/main/java/io/github/reoseah/magisterium/Magisterium.java index 6981350..5d19cf0 100644 --- a/src/main/java/io/github/reoseah/magisterium/Magisterium.java +++ b/src/main/java/io/github/reoseah/magisterium/Magisterium.java @@ -2,6 +2,8 @@ import com.google.common.collect.ImmutableSet; import io.github.reoseah.magisterium.block.*; +import io.github.reoseah.magisterium.block.entity.ArcaneResonatorBlockEntity; +import io.github.reoseah.magisterium.block.entity.IllusoryWallBlockEntity; import io.github.reoseah.magisterium.block.entity.MagicBarrierBlockEntity; import io.github.reoseah.magisterium.data.BookLoader; import io.github.reoseah.magisterium.data.SpellEffectLoader; @@ -64,11 +66,14 @@ public void onInitialize() { Registry.register(Registries.BLOCK, "magisterium:illusory_wall", IllusoryWallBlock.INSTANCE); Registry.register(Registries.BLOCK, "magisterium:arcane_lift", ArcaneLiftBlock.INSTANCE); Registry.register(Registries.BLOCK, "magisterium:magic_barrier", MagicBarrierBlock.INSTANCE); + Registry.register(Registries.BLOCK, "magisterium:arcane_resonator", ArcaneResonatorBlock.INSTANCE); Registry.register(Registries.BLOCK_ENTITY_TYPE, "magisterium:illusory_wall", IllusoryWallBlockEntity.TYPE); Registry.register(Registries.BLOCK_ENTITY_TYPE, "magisterium:magic_barrier", MagicBarrierBlockEntity.TYPE); + Registry.register(Registries.BLOCK_ENTITY_TYPE, "magisterium:arcane_resonator", ArcaneResonatorBlockEntity.TYPE); Registry.register(Registries.ITEM, "magisterium:arcane_table", ArcaneTableBlock.ITEM); + Registry.register(Registries.ITEM, "magisterium:arcane_resonator", ArcaneResonatorBlock.ITEM); Registry.register(Registries.ITEM, "magisterium:spell_book", SpellBookItem.SPELL_BOOK); Registry.register(Registries.ITEM, "magisterium:elements_of_pyromancy", SpellBookItem.ELEMENTS_OF_PYROMANCY); Registry.register(Registries.ITEM, "magisterium:lesser_arcanum", SpellBookItem.LESSER_ARCANUM); @@ -98,6 +103,7 @@ public void onInitialize() { .displayName(Text.translatable("itemGroup.magisterium")) // .entries((displayContext, entries) -> { entries.add(ArcaneTableBlock.INSTANCE); + entries.add(ArcaneResonatorBlock.INSTANCE); entries.add(SpellBookItem.SPELL_BOOK); var filledBook = new ItemStack(SpellBookItem.SPELL_BOOK); diff --git a/src/main/java/io/github/reoseah/magisterium/MagisteriumClient.java b/src/main/java/io/github/reoseah/magisterium/MagisteriumClient.java index c01cc22..8b3964d 100644 --- a/src/main/java/io/github/reoseah/magisterium/MagisteriumClient.java +++ b/src/main/java/io/github/reoseah/magisterium/MagisteriumClient.java @@ -1,6 +1,12 @@ package io.github.reoseah.magisterium; -import io.github.reoseah.magisterium.block.*; +import io.github.reoseah.magisterium.block.ArcaneTableBlock; +import io.github.reoseah.magisterium.block.GlyphBlock; +import io.github.reoseah.magisterium.block.MagicBarrierBlock; +import io.github.reoseah.magisterium.block.entity.ArcaneResonatorBlockEntity; +import io.github.reoseah.magisterium.block.entity.IllusoryWallBlockEntity; +import io.github.reoseah.magisterium.client.render.ArcaneResonatorRenderer; +import io.github.reoseah.magisterium.client.render.IllusoryWallBlockEntityRenderer; import io.github.reoseah.magisterium.data.BookLoader; import io.github.reoseah.magisterium.data.SpellPage; import io.github.reoseah.magisterium.network.SpellParticlePayload; @@ -15,6 +21,7 @@ import io.github.reoseah.magisterium.screen.SpellBookScreenHandler; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; @@ -36,6 +43,12 @@ public void onInitializeClient() { HandledScreens.register(ArcaneTableScreenHandler.TYPE, ArcaneTableScreen::new); BlockEntityRendererFactories.register(IllusoryWallBlockEntity.TYPE, IllusoryWallBlockEntityRenderer::new); + BlockEntityRendererFactories.register(ArcaneResonatorBlockEntity.TYPE, ArcaneResonatorRenderer::new); + + ModelLoadingPlugin.register(pluginContext -> { + pluginContext.addModels(Identifier.of("magisterium:block/arcane_resonator_crystal")); + pluginContext.addModels(Identifier.of("magisterium:block/arcane_resonator_crystal_on")); + }); ParticleFactoryRegistry.getInstance().register(MagisteriumParticles.ENERGY, EnergyParticle.Factory::new); ParticleFactoryRegistry.getInstance().register(MagisteriumParticles.GLYPH_A, GlyphParticle.Factory::new); diff --git a/src/main/java/io/github/reoseah/magisterium/block/ArcaneResonatorBlock.java b/src/main/java/io/github/reoseah/magisterium/block/ArcaneResonatorBlock.java new file mode 100644 index 0000000..3724459 --- /dev/null +++ b/src/main/java/io/github/reoseah/magisterium/block/ArcaneResonatorBlock.java @@ -0,0 +1,122 @@ +package io.github.reoseah.magisterium.block; + +import com.mojang.serialization.MapCodec; +import io.github.reoseah.magisterium.block.entity.ArcaneResonatorBlockEntity; +import net.minecraft.block.*; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.ai.pathing.NavigationType; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.particle.DustParticleEffect; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.random.Random; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; +import org.jetbrains.annotations.Nullable; + +public class ArcaneResonatorBlock extends BlockWithEntity { + public static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 2, 16); + public static final BooleanProperty POWERED = Properties.POWERED; + public static final MapCodec CODEC = createCodec(ArcaneResonatorBlock::new); + + public static final Block INSTANCE = new ArcaneResonatorBlock(Settings.create() // + .breakInstantly() // + .nonOpaque() // + .luminance(state -> state.get(POWERED) ? 13 : 0) // + .strength(0) // + .registryKey(RegistryKey.of(RegistryKeys.BLOCK, Identifier.of("magisterium", "arcane_resonator")))); + public static final Item ITEM = new BlockItem(INSTANCE, new Item.Settings() // + .registryKey(RegistryKey.of(RegistryKeys.ITEM, Identifier.of("magisterium", "arcane_resonator"))) // + .useBlockPrefixedTranslationKey()); + + public ArcaneResonatorBlock(Settings settings) { + super(settings); + this.setDefaultState(this.stateManager.getDefaultState().with(POWERED, false)); + } + + @Override + protected MapCodec getCodec() { + return CODEC; + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(POWERED); + } + + @Override + protected boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + BlockPos blockPos = pos.down(); + return this.canPlaceAbove(world, blockPos, world.getBlockState(blockPos)); + } + + protected boolean canPlaceAbove(WorldView world, BlockPos pos, BlockState state) { + return state.isSideSolid(world, pos, Direction.UP, SideShapeType.RIGID); + } + + @Override + protected VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return SHAPE; + } + + @Override + protected boolean emitsRedstonePower(BlockState state) { + return true; + } + + @Override + protected BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; + } + + @Override + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + if (state.get(POWERED)) { + double x = pos.getX() + 0.5 + (random.nextDouble() - 0.5); + double y = pos.getY() + 0.4 + (random.nextDouble() - 0.5); + double z = pos.getZ() + 0.5 + (random.nextDouble() - 0.5); + + world.addParticle(DustParticleEffect.DEFAULT, x, y, z, 0, 0, 0); + } + } + + @Override + public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new ArcaneResonatorBlockEntity(pos, state); + } + + private static void updateNeighbors(World world, BlockPos pos, BlockState state) { + var block = state.getBlock(); + world.updateNeighborsAlways(pos, block); + world.updateNeighborsAlways(pos.down(), block); + } + + @Override + protected int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { + return state.get(POWERED) ? 15 : 0; + } + + @Override + public int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { + return direction == Direction.UP ? state.getWeakRedstonePower(world, pos, direction) : 0; + } + + @Override + protected boolean canPathfindThrough(BlockState state, NavigationType type) { + return false; + } + + @Override + protected boolean hasSidedTransparency(BlockState state) { + return true; + } +} diff --git a/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlock.java b/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlock.java index 89753de..ab7a5c2 100644 --- a/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlock.java +++ b/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlock.java @@ -1,6 +1,7 @@ package io.github.reoseah.magisterium.block; import com.mojang.serialization.MapCodec; +import io.github.reoseah.magisterium.block.entity.IllusoryWallBlockEntity; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.BlockWithEntity; diff --git a/src/main/java/io/github/reoseah/magisterium/block/entity/ArcaneResonatorBlockEntity.java b/src/main/java/io/github/reoseah/magisterium/block/entity/ArcaneResonatorBlockEntity.java new file mode 100644 index 0000000..4d85622 --- /dev/null +++ b/src/main/java/io/github/reoseah/magisterium/block/entity/ArcaneResonatorBlockEntity.java @@ -0,0 +1,16 @@ +package io.github.reoseah.magisterium.block.entity; + +import io.github.reoseah.magisterium.block.ArcaneResonatorBlock; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.util.math.BlockPos; + +public class ArcaneResonatorBlockEntity extends BlockEntity { + public static final BlockEntityType TYPE = FabricBlockEntityTypeBuilder.create(ArcaneResonatorBlockEntity::new, ArcaneResonatorBlock.INSTANCE).build(); + + public ArcaneResonatorBlockEntity(BlockPos pos, BlockState state) { + super(TYPE, pos, state); + } +} diff --git a/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlockEntity.java b/src/main/java/io/github/reoseah/magisterium/block/entity/IllusoryWallBlockEntity.java similarity index 95% rename from src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlockEntity.java rename to src/main/java/io/github/reoseah/magisterium/block/entity/IllusoryWallBlockEntity.java index 7a3cb82..cfea78c 100644 --- a/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlockEntity.java +++ b/src/main/java/io/github/reoseah/magisterium/block/entity/IllusoryWallBlockEntity.java @@ -1,5 +1,6 @@ -package io.github.reoseah.magisterium.block; +package io.github.reoseah.magisterium.block.entity; +import io.github.reoseah.magisterium.block.IllusoryWallBlock; import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; diff --git a/src/main/java/io/github/reoseah/magisterium/client/render/ArcaneResonatorRenderer.java b/src/main/java/io/github/reoseah/magisterium/client/render/ArcaneResonatorRenderer.java new file mode 100644 index 0000000..6748347 --- /dev/null +++ b/src/main/java/io/github/reoseah/magisterium/client/render/ArcaneResonatorRenderer.java @@ -0,0 +1,41 @@ +package io.github.reoseah.magisterium.client.render; + +import io.github.reoseah.magisterium.block.ArcaneResonatorBlock; +import io.github.reoseah.magisterium.block.entity.ArcaneResonatorBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayers; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.BlockRenderManager; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.random.Random; + +public class ArcaneResonatorRenderer implements BlockEntityRenderer { + public static final Identifier CRYSTAL = Identifier.of("magisterium:block/arcane_resonator_crystal"); + public static final Identifier CRYSTAL_ON = Identifier.of("magisterium:block/arcane_resonator_crystal_on"); + + private final BlockRenderManager renderManager; + + public ArcaneResonatorRenderer(BlockEntityRendererFactory.Context ctx) { + this.renderManager = ctx.getRenderManager(); + } + + @Override + public void render(ArcaneResonatorBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { + boolean powered = entity.getCachedState().get(ArcaneResonatorBlock.POWERED); + var model = MinecraftClient.getInstance().getBakedModelManager().getModel(powered ? CRYSTAL_ON : CRYSTAL); + var world = entity.getWorld(); + var pos = entity.getPos(); + matrices.push(); + matrices.translate(.5F, MathHelper.sin((world.getTime() + tickDelta) / 20) * .1F, .5F); + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(world.getTime() + tickDelta)); + matrices.translate(-.5F, 0, -.5F); + this.renderManager.getModelRenderer().render(world, model, entity.getCachedState(), pos, matrices, vertexConsumers.getBuffer(RenderLayers.getMovingBlockLayer(entity.getCachedState())), false, Random.create(), 1, OverlayTexture.DEFAULT_UV); + matrices.pop(); + } +} diff --git a/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlockEntityRenderer.java b/src/main/java/io/github/reoseah/magisterium/client/render/IllusoryWallBlockEntityRenderer.java similarity index 69% rename from src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlockEntityRenderer.java rename to src/main/java/io/github/reoseah/magisterium/client/render/IllusoryWallBlockEntityRenderer.java index 9db0c6b..5250256 100644 --- a/src/main/java/io/github/reoseah/magisterium/block/IllusoryWallBlockEntityRenderer.java +++ b/src/main/java/io/github/reoseah/magisterium/client/render/IllusoryWallBlockEntityRenderer.java @@ -1,5 +1,6 @@ -package io.github.reoseah.magisterium.block; +package io.github.reoseah.magisterium.client.render; +import io.github.reoseah.magisterium.block.entity.IllusoryWallBlockEntity; import net.minecraft.block.BlockRenderType; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.RenderLayers; @@ -11,10 +12,10 @@ import net.minecraft.util.math.random.Random; public class IllusoryWallBlockEntityRenderer implements BlockEntityRenderer { - private final BlockRenderManager blockRenderManager; + private final BlockRenderManager renderManager; public IllusoryWallBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { - this.blockRenderManager = ctx.getRenderManager(); + this.renderManager = ctx.getRenderManager(); } @Override @@ -23,7 +24,7 @@ public void render(IllusoryWallBlockEntity entity, float tickDelta, MatrixStack if (state.getRenderType() == BlockRenderType.MODEL) { var world = entity.getWorld(); var pos = entity.getPos(); - this.blockRenderManager.getModelRenderer().render(world, this.blockRenderManager.getModel(state), state, pos, matrices, vertexConsumers.getBuffer(RenderLayers.getMovingBlockLayer(state)), false, Random.create(), 1, OverlayTexture.DEFAULT_UV); + this.renderManager.getModelRenderer().render(world, this.renderManager.getModel(state), state, pos, matrices, vertexConsumers.getBuffer(RenderLayers.getMovingBlockLayer(state)), false, Random.create(), 1, OverlayTexture.DEFAULT_UV); } } } diff --git a/src/main/java/io/github/reoseah/magisterium/data/effect/IllusoryWallEffect.java b/src/main/java/io/github/reoseah/magisterium/data/effect/IllusoryWallEffect.java index 8cd5606..0687203 100644 --- a/src/main/java/io/github/reoseah/magisterium/data/effect/IllusoryWallEffect.java +++ b/src/main/java/io/github/reoseah/magisterium/data/effect/IllusoryWallEffect.java @@ -3,7 +3,7 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.github.reoseah.magisterium.block.IllusoryWallBlock; -import io.github.reoseah.magisterium.block.IllusoryWallBlockEntity; +import io.github.reoseah.magisterium.block.entity.IllusoryWallBlockEntity; import io.github.reoseah.magisterium.screen.SpellBookScreenHandler; import net.minecraft.block.BlockRenderType; import net.minecraft.block.Blocks; diff --git a/src/main/resources/assets/magisterium/blockstates/arcane_resonator.json b/src/main/resources/assets/magisterium/blockstates/arcane_resonator.json new file mode 100644 index 0000000..46bdfad --- /dev/null +++ b/src/main/resources/assets/magisterium/blockstates/arcane_resonator.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "magisterium:block/arcane_resonator" + }, + "powered=true": { + "model": "magisterium:block/arcane_resonator_on" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/magisterium/blockstates/arcane_resonator_crystal.json b/src/main/resources/assets/magisterium/blockstates/arcane_resonator_crystal.json new file mode 100644 index 0000000..9e1a832 --- /dev/null +++ b/src/main/resources/assets/magisterium/blockstates/arcane_resonator_crystal.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "magisterium:block/arcane_resonator_crystal" + }, + "powered=true": { + "model": "magisterium:block/arcane_resonator_crystal_on" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/magisterium/lang/en_us.json b/src/main/resources/assets/magisterium/lang/en_us.json index 2d45550..31cf398 100644 --- a/src/main/resources/assets/magisterium/lang/en_us.json +++ b/src/main/resources/assets/magisterium/lang/en_us.json @@ -4,6 +4,7 @@ "block.magisterium.glyph": "Arcane Glyph", "block.magisterium.illusory_wall": "Illusory Wall", "block.magisterium.arcane_lift": "Arcane Lift", + "block.magisterium.arcane_resonator": "Arcane Resonator", "item.magisterium.spell_book": "Spell Tome", "item.magisterium.spell_book.empty": "Empty", "item.magisterium.spell_book.pages": "%s Entries", @@ -38,8 +39,8 @@ "magisterium.page.magisterium.awaken_the_flame.heading": "awaken the flame", "magisterium.page.magisterium.awaken_the_flame.description": "Ignite nearby candles, torches and other kinds of fire bearers and receptacles.", "magisterium.page.magisterium.awaken_the_flame.spell": "Ignis dormiens, nunc surge!\n\nLumen tibi impero, flammae revelete!", - "magisterium.page.magisterium.quench_the_flame": "Quench the Flame", - "magisterium.page.magisterium.quench_the_flame.heading": "quench the flame", + "magisterium.page.magisterium.quench_the_flame": "Soothe the Flame", + "magisterium.page.magisterium.quench_the_flame.heading": "sooth the flame", "magisterium.page.magisterium.quench_the_flame.description": "Extinguish nearby candles, torches and other kinds of fire bearers and receptacles.", "magisterium.page.magisterium.quench_the_flame.spell": "Ignis vivens, nunc quiesce!\n\nLumen tibi negatur, flammae extinguete!", "magisterium.page.magisterium.glyphic_ignition": "Glyphic Ignition", diff --git a/src/main/resources/assets/magisterium/models/block/arcane_resonator.json b/src/main/resources/assets/magisterium/models/block/arcane_resonator.json new file mode 100644 index 0000000..e4e3e9c --- /dev/null +++ b/src/main/resources/assets/magisterium/models/block/arcane_resonator.json @@ -0,0 +1,22 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "magisterium:block/arcane_resonator", + "slab": "block/smooth_stone", + "top": "magisterium:block/arcane_resonator" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 2, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#slab", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "north" }, + "south": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "south" }, + "west": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "west" }, + "east": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal.json b/src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal.json new file mode 100644 index 0000000..12e28c5 --- /dev/null +++ b/src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal.json @@ -0,0 +1,23 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [32, 32], + "textures": { + "0": "magisterium:block/arcane_resonator_crystal", + "particle": "magisterium:block/arcane_resonator_crystal" + }, + "elements": [ + { + "from": [4, 5, 4], + "to": [12, 13, 12], + "faces": { + "north": {"uv": [4, 4, 8, 8], "texture": "#0"}, + "east": {"uv": [8, 4, 12, 8], "texture": "#0"}, + "south": {"uv": [12, 4, 16, 8], "texture": "#0"}, + "west": {"uv": [0, 4, 4, 8], "texture": "#0"}, + "up": {"uv": [4, 0, 8, 4], "texture": "#0"}, + "down": {"uv": [8, 0, 12, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal_on.json b/src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal_on.json new file mode 100644 index 0000000..d4f9d89 --- /dev/null +++ b/src/main/resources/assets/magisterium/models/block/arcane_resonator_crystal_on.json @@ -0,0 +1,23 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [32, 32], + "textures": { + "0": "magisterium:block/arcane_resonator_crystal", + "particle": "magisterium:block/arcane_resonator_crystal" + }, + "elements": [ + { + "from": [4, 5, 4], + "to": [12, 13, 12], + "faces": { + "north": {"uv": [4, 12, 8, 16], "texture": "#0"}, + "east": {"uv": [8, 12, 12, 16], "texture": "#0"}, + "south": {"uv": [12, 12, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 12, 4, 16], "texture": "#0"}, + "up": {"uv": [4, 8, 8, 12], "texture": "#0"}, + "down": {"uv": [8, 8, 12, 12], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/magisterium/models/block/arcane_resonator_on.json b/src/main/resources/assets/magisterium/models/block/arcane_resonator_on.json new file mode 100644 index 0000000..a972df0 --- /dev/null +++ b/src/main/resources/assets/magisterium/models/block/arcane_resonator_on.json @@ -0,0 +1,22 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "magisterium:block/arcane_resonator_on", + "slab": "block/smooth_stone", + "top": "magisterium:block/arcane_resonator_on" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 2, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#slab", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "north" }, + "south": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "south" }, + "west": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "west" }, + "east": { "uv": [ 0, 14, 16, 16 ], "texture": "#slab", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/magisterium/models/item/arcane_resonator.json b/src/main/resources/assets/magisterium/models/item/arcane_resonator.json new file mode 100644 index 0000000..82211ef --- /dev/null +++ b/src/main/resources/assets/magisterium/models/item/arcane_resonator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "magisterium:item/arcane_resonator" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/magisterium/textures/block/arcane_resonator.png b/src/main/resources/assets/magisterium/textures/block/arcane_resonator.png new file mode 100644 index 0000000000000000000000000000000000000000..e54387a1860974ad385aacc271c6ce5a819edd26 GIT binary patch literal 581 zcmV-L0=oT)P)Px$|4BqaR5*=olQC=CP!xr~2o1%{d)g|4k+rLh6AUQ{1yh=#E*T7+oL|tUbnzHE zX7o^Ke?pVRdzTVSjfGo^6>3kVU>jp;30P`Dw2R$Aea~vhT^{J&bB^vk=WU(7K3z*G zQ5DBAQc8US>_6Pc@A=$TCP3wWg=CpzUrN~##DOMMB&yORC0Qm+<`YaQCCM^DSb~Bm z=!TtpI|QSE`ca)UNdYz@xiSFkvQ0r0NRw2v2cv*@A0F}a#c!^@T>&60fnBz-%QnIi z8-i#W5lthlqQG}ts2(`92fLaiFA~Rbwgbg>6I|;&2B7iw7ws;z7~+;(ge4G`KuU=j z$1&YcT|Kh`dqoF;v9ad5`x&q3&>s9F!6g`FOE#5Nw<&j@eFR{;a|nR<>N{r_aPs6* zTWlz+>PPjgDW~ie9U8Sg7RHK&v0@y~s2(^pkDJ=wt^Sw(S}k%ipU@uc;uRgn;f(Fh zAq!*0-IqTYhcmpQ!<*-S20=MMSdN5=h&S=#3wAWwz8*uzHQ;wz) ze$UUANC_P#7nc@8+TCpC>u^Rj2Uej{qnlDnZKJYOk(^y*Ik*W{iIh@iIZz)Ik+1|6 ztHMcqN%Oc#I1d5z+Px%>PbXFR9J=WmO*P8Q4q&}Mv)w|kVEw1C5lj~-a>B58j@S7?3R9oLYsV+nDje@ z?2?jOL>F@_xg}u>K?7wkYYv6=(1U~+dx-D3tJbxc9159}@SE8;GjIOBi4bC+zWyGF z-|f~N>CBq^ZMzQdiyO@1cZM37_5D~_0s!C6F966TQ?y%m0NAd>qjw2xgz(w66y_j4 zSTxH-s~K$9VYQm3=Xn91H@5&-t)>G!%tAXLS_*Kb)d4tD4FK-Dg#fo*2egJv=Du49 zO(3)b!p^k@06ouR$I@9=lmJ&4P&CW(@Nxb(n`;Ja*P&>ZIa3WbtPglZCOBF{wtdIa z=Q@0@1jHSmsRql6BCjErOmXd<(r%@Ir_P9~&$Wi+3nyT^4!xfM3XfcJ-z^Ydx#W5{ z;bAq@KB^E~1N{|5wD7|>IV0MDCS^mkiwV5f0~0p~-R z_S9qIz*0K1MlP9>2McEy={%QA@oTpo@EPX-(P~D}VnElf}P^#1bP|7ASeIH2ZmQ3bZ_ko0N0Z*@<*U%=UnC(B% zF;sc@v+n~PLq#c@d~bf_CK{XI3Eh%y_Zr$1Sa46Ql%y@E2`=n)ANT_usUV|?bmu1k0000Px%14%?dR5*=old)^tKp4e;F&c`OJB>0JTf1AF5J*WVgmwsV$&jIo^A|Kp>EJPR z%;=$%{0U8lLJD0vH4!m3X(?8yJp^}S*6qJa9>#f)kjt0Nu2H!)5TZ5A=D(gk~krr#0292OG-&Ri4nFS zFY=~g@!=wV&!@IkBZ(7$xk#pR08ZH|JPoYv1UH48{S?%Oxs>68&(* z`RN9O>5O-;2lT@cl|qTPFaHvbLt}Za)9MfnBZMt*i!P1FUHajO?e!Jo_4oE1tbV1+ z(J-RZ>R>6Qpoj^Ri%WwpO%HzVU#DYdz&cd=>Xww!*r+YlB!?$y4(@_=BBhjR4)lg5 z61JdfSJ_i%)OYHH;}F2yJBzV&ly%DVf#36yQgZzM*f^9u*JS~>zH0Ux>oM>4Wc&UB X8_FlH#Eg_J00000NkvXXu0mjfypj;Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magisterium/textures/item/arcane_resonator.png b/src/main/resources/assets/magisterium/textures/item/arcane_resonator.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe71d6b6d325adfc9420298b8e2a0fb29f630d0 GIT binary patch literal 437 zcmV;m0ZRUfP)Px$Z%IT!R5*>Ll08U5Q5c4w8%D%k3PRHc6K=JJ2oY)2ZbQ^!TySV8f`({nYix;{ z`WYI6=tAIR;NXy^OOs0wMT8A$WlKX41m`yBxuo6`LGN_F^L_8bIqx~}Pid+~Ahu)w ztSf~z*IAFs90*028Xuuj`{eHaky>@p{<=SEgSY|!hK(S-s{!7Hpfa(oyh4Yv)6j!Q zClHD#`>rRbRj f2NERJYLxm0lSqm%E1w}G00000NkvXXu0mjfeLlNU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magisterium/textures/item/blaze_rune.png b/src/main/resources/assets/magisterium/textures/item/blaze_rune.png index d6e21b504a5243afb2e749eb133bfce9f56f7034..2a4ab0afb973147aa7d11d10aea0b1151e317828 100644 GIT binary patch delta 358 zcmV-s0h#`o1C9fbF@H!&L_t(IjjfU~NCQC-MPJk=ofatsNhMgNxe$^{BvvWyZ4ZlR zV`X(kDp9aYWos|kq>31@NC>+KhoEgZ2qcBqX%p6Ba(j1rmqrJM9cE_#|2wnrM=N9{ zm5Yhu>TPyUt|=E|zC7^(M!Dj7{TsPRqYePh@e&wJ7{Fm~g?}Q;KETYbVplH445Zd? zVY<~=(OMSsd?exPi@387Or+Ml_h>i}fmi_LVw{_bG%oF90tYRaPsMR6=(7%C5cgPs zFaWe~3(pU7KJ^mnw4b_c0s1XW^8%=QP>zdRWl;c7s>9=@#BVcbD;cKUg1&>r_?p_O zN2v}++p>lE^k3JMQdR&NNW+Pfi@hSXlik#lve@kt+KR$Z!%$0d{rwYt?lT@2SJRX6 zm810}6@>w8?g&AW9Ws7m)X*gj^mF>T3i1>s!T;610htVqyX!nRKXdGnh>mIfrY~L@!6fbdeo_jjHSB1p1><|RfAZPGwL-Op5zr6>vhukj5`*Ni@VDK`@U O0000hkm diff --git a/src/main/resources/assets/magisterium/textures/item/placeholder/fire.png b/src/main/resources/assets/magisterium/textures/item/placeholder/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c00c3a75be7fb7a8409904878718923beb0292 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|W_!9ghFJ9W z23zwrDDbR3W*`)4+xXqS;dw%FvQeYKrUxyWPeOlfTlUHBheFT-m3Z$@qHn{_K9p(R z5pUAI*80R7^*?2=9F+1VhGiNSt6H5foZ!-=RLYWOFaEl(KV^=f=AIdWo#%Z$dKwPQ z?Fsn$K>ysg^!Xijp{2sJCxytE&Qf~s=DE-A`&G-C|5*7#vM;JtxoF(_V)#+=?rCnt Xq}i>)XFZ++oyp+o>gTe~DWM4f?pj!j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magisterium/textures/item/placeholder/wind.png b/src/main/resources/assets/magisterium/textures/item/placeholder/wind.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3d15345bec11e382850fc2709cc37edf1a1dcf GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(iTPhFJ8j z4Kn0wG2roD73>}o7I)$Q{$=_JOOxINsm=HC5S()^*faZhp}BZ3`njxgN@xNAAD>>a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magisterium/textures/item/wind_rune.png b/src/main/resources/assets/magisterium/textures/item/wind_rune.png index 073ec50c6eb520ea9af398dca53ced2c65356f84..a49fced48b851dade46cd45726eb0b88271c4b53 100644 GIT binary patch delta 419 zcmV;U0bKsj1Ih!CF@JU?=S$IEXGT z7MG4)96LFQlar$$j!xRe#g00tlSoC8+7y#6riDm{R3dJ1kQ_ZtCjFs1fW}4?EY~5eXynx#hOLtr{p9fCiB8WJeFD&UGiZ0C z02sDTUd@T7tAExlX+@*mjY^LNAYa_`3Yj%#QXc^1)f|@VVAwhUot{l{IL_(AIe?VG zV84syYAnxwLonl@Xi|_tiU4F+x4bEJP88FM#{Bq@SP2Mp7c1OX4g>-D2q_pE6dsgXv_(T8Shlnj zEsidYPEFC&)EGo#Q@ONslhh!zL}+DL38zu1pop1x6b;wp(dkJ;z0>!-yx;G6c-{~G zSSF)pC>&86=Y!o(-uL58n5J<`w0Oaab zQW=5ml?BEf(|7|LstyneN7ThhhYseSS^_}2jsjpE{$T&?j>3DfHG_wejJxd8JqUPw z8YEY*k}vn_9)AOL0?Y?@)HU}qqEn$%>1M_*QhIx$Sb3qZ-$L!{6PtO6Px`^GQTORCt{2oquptRhGv;37rf}2h%-4@}p%#Oo+H5K};2E5DX?+HDWoq!2$+< zpi|}GXe#RsYMe)93ek|Hr1VUAln_1 zW}Ad`?;kJs=5^*zSxb&FmOvDZ5cCX=if0$|UEOzx@rmX{8JtC$FV0~-WCb99VLoZo(lq&Y zyIrpH!RxyC?Dcx(G7%piPft$|FnCG09$|31-B=G5sNH>6SC?EG z)W#7P7bo9~jNy8QLCnIMlQr@Jt5Yu*N|xkkamZO%bFyYoY8HxrYJy=@{NnkuNlCVF zv7?}$d#n!#T+@pm zD#q=0%g;mc8~R4izu3{v4M|f0xY;y8lkaxBnLK$iNl8gEAQXy?i;Kf(G|E?TOn8i; z>I>Hk40#Lk03{GiG$#&OcyY8ixOMied{_6KRG2^{`Ni{Rlah2JHzZBvVn;hE$rjq2 zcG@)fyLarC3Izh*L*TLy{8?>;*DDN14<99CS_X;cL^=C1re(+?jT)Vu#9OLVG%>6aeDcnC|txI3IdH#%{Rmv0xEv$R8SO!)LuaZisPkV1qMKtV#T_u zuF?spOSQqJ*@*HVDjrl347C>kiq{Zz0O8^Vg1vz-2BG}%7+{D}aNdGE@~RI93=UP3 z55@oAufAZ)DEVq*Q6CTHdpsVxy1D@E(y!O+mB)fBhU0aBegimq_^3QE-1e*1xNFHb z8jYMdaYEMh#jFnAQdTQlYzL3m0YLX&c&L5?wIcHt{cBBz1Z!snb&fQa`=? zk>ZSDeC-#Ahyk>oYn6NYYUNGLfZX}%tUoqaDp9Ru;okM~M*`EDd&ydy6^TFlM}dgM z0Kwa|LV5WWg#aws)Wv!$tmPY7_SGr`1@l{X769<8wB2uS7C5`vJ80|4l5rhvAPk2*rO~ z{t0_8EM)PNYPOYc^#fzh5F!!;0-7`5T2cu>PDK#_vq~Fyqa1$qz~`F%0Kqdqb!im< z2Y1~E!1K?Y3ds)@+=&Z+#9GboHvcxp=DZko0cfO3+g85SpPV{XDn7-yoYi|4an9%C z zl{Rw0VZ&0E&EZ%dDbF=g@31i|EuFVlU&hhm(Ch~g{Gu0>@dr1}q@mBp#uplf<(t;r zOIGuFUM_vp?`&|R05$}cG0d@NwR+7OOdt9kEVl^({@%`Mcd{DKAB?%}Y{$J~GUo`xnH z?cX2cqt|Bvv-r6DlhI%F2qGduAkzkR^rRB4%9?+{VIwzfKzZto9d$o|7QgYiQ;ORk zhJV1i&)@K;4S+J^Yp+~kqjevTq6A{U+x*)hUA{1mKmWc2XKOp9n_Jku;vfsQ-Gk@# zbJR51I3tyZrtFMB=&VE^YI4O0AYzv*frB0-?KD5F;58|4Jd+~A6y zRzJXK_y8if+i2Yfj4bt1DMKnSIklTro)5XCQl7K5T?Uikoafgi^GHse3M7s>#S28F z4j>dF6q#sFWR7_bzjA-hil48*(c%CC_w|GO0rc>lt?d*&^%_M_>C3s*3cNdi9`8Lr zI^_i$!brGR8@hkgZ`S|DF9JdJe!pnlR!8{3{QzPO*TawIZlH+l$Exxofrxm3q4x8& z_WXm#>E%ZYVh*x*+;QK*|Ij7B3KkB9E=ZW0m_?g43!-{`4MO=&r<3O9W&jcr5=cl$z+^H>qYz`-+S&lf z%*^~jwp4|?9h|mcLqMU%ad`BGzPmrmn3a}JV}o-2>K!(Gu3BK;F!Jca07`G%A3K&Z z(eMr4D|7L+)$&MIBVT|0H2^6oidEin%Pp+?!))SBwXDv(_=9b!I%6hkqoa;>e@Z7Ip_N@tGnjqb!`x~41h?Cb+wG>T)J{i7EOxv0 z>>tkM4d>GI@`r|I0IOeY(_4kS24{)MHxk+|^!A<~r z+;alt^$r`9RLZ@R9`~G4e{Z-jh-c=w-EMim{Nj|aX={VW=YXYO`C@qxw`31B`}MlC z(ek6w?Q_OpBrPMC^R4x|&LcL)ye=2_S1rX_Qi)f!ongi=y#&BSvpGN>Ef~}fOzQ6L zrn|eF%FCHb7<5%Y~)uIvcF&_^Qs;VxYJ3< zDXGNkashCE)lyyGHxd}c#b|DBX78z0sVoAl zT)ri&-yMv4hYjyp05d*n>2c2?-c(Cn|8h2*JlZf=EEaNm2ZE7~jt=Se_qP3v#VLQJ z^71NtO||glc~;Li4$2OKq1UBpDStSqH-xly>xNqz)aL5w}QjU^Yeu~ zym0gl`055Efso@1hq#lyXfsG!45n4AsqZeB~GHt+0pe=+T$w>y_(+!Rd4YN|6U(ds895 zNH|79LITUOD%pN~DWoZD^Mli4vD*{Ky=@Nr+t2bu_Fx0h>(WNcceb`uQu-z(z_0)A zQEtBCfybVv&*y`+g+n%i3Pag(Is?dH?U9whKvTzpZTA3heB~GH*nEsfZ#m1h@~!@r z%b$n|&htS@_e9XDB{$;_SqBgSqn6x^A8UV_=q=b0kvf4v%=TSPGw5+A0t5HlTPzmJ z^6Y?JE)5oo1y6hmumt#E&cuBRhJ6^ZcBOB62Erz{2mWLsP`rnhe6%o#dVh0sGaiqJ+TLHXd{qj&trgHH=y2Olhr%3#=|V?9X9gu2PijKF8F{f6a~mpj7!KPg_ze~d(E%j z{oDMPg-XEn?H=BG{6?Cao5{>nyn`?j0i)6QqkG!6SVr#77u`GxLN$dHzR={aci6Op z)^GPP`?iOPro6p!t-dS(0-u+s>l{;p%`T2f`@YZ>T%+Iw2VQm{DvkQkS>)!DQOxhMhnhpeDM&dci3p%S%A5) zg0BuPlS)?0QHVnLvmlEZx;X^39FHjf>e29Bo~Eo5h<%RT<90kOuL z3oDptHp^vTsD6OdrBzq0A0Q&PhmSQl&MOauTvm9moc%Zd_1|8T-y-vPw;7+S7VlZ` zxoWBVc28LHXhYX540hvM?pe6E9y<$j@@VM4sZ%IFJ1d=?@2?wmcaIkI z=J|T%y88k2kkyLRG6s?MX}SJrDPM8_=^Q$7RL=bDEah|CiRk<%Q9tN@06pYTIlWrR zLwSQp8^M|HkICRq1bsk%FbK{Q2O>KAAu!Ju!QG-qJ{{B#pq9_=Pg7`6C|9{H4myYAzzMcX6O51{u1T1pHR;fL}Tk-+)ZdUEofWdG+M0mzx(&}5^{ zV~>jRVQ`**aMyiOLFzoe=!GUWZkoxWM?RI$Knkt{Y}_<6;M~D{(JH5w>qW%Uz>yq} zRtC`Ku?M*P6Yu|*ltnx57kU0&i?-vcEE$x?3*`#s2g`+Fh$2xa{>;8Bn)1=&N3$2u z+q5Od34SN&Zsi^+>K!&&y%P!wmJ7EJ+Wi2656D81S`LbF33;S2z8k0$KlFZpaRbna vl%-XEZ~wEZ;!Okl^#ZZxIYd*g*8u(>D6u*8&@**d00000NkvXXu0mjfa*rgd literal 0 HcmV?d00001 diff --git a/unused_assets/jukebox_top.png b/unused_assets/jukebox_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7a42cec677ce89629d21d8d043af00b41a7b820f GIT binary patch literal 716 zcmV;-0yF)IP)Px%hDk(0R9J=GmqCl-Fc^kkOLvU1by_GmUY7A7%p8002kbAOA20`Rd+|`1iwp!B zXl?`oZhV zbLaqMG!Hzq5HSt_B44Eda94U8DAhBUwEbb`K5Y^aF*v`hbho`Lz3mLgKrwU4CJ}Ka z0PswBl=zgW>B`4N3@8&?%v|#Glk-eSO?|cM`b{F*0=h%@{1)1u^=Sg~Bb%A6i^Vh=RZPj9Je@F`iiMHq}!(a5;9^3sM<@6pzDYx+(u)mzm; zbq(T7$ZP;m3DGzm`faeC;dmZQ#t}#fcvBXE{v3r{u?X|Lr3V1E?0Xa0|%A zZelro;8_7+#qz4szu~^Jpw0!rrz8wU>%@xKp+%~eIuATqVN&l?;!{#Bn|a{*mHw;g zJL#vl>)!(WYhz%YSV;B@SIpd}wg-8XIK#3|ZjU|z9QPuRKA^HC8cV{bWI1i#Hk~DO zy}q2lCK1)LtFQMa5whxA^m_EC^>upd?R2-rH$)6T^Fesnks?ob0B~3Ofwa?TPhX?m zy&t_@RX6(YM$Xqijyq1JM|+~)&q34MDE)Ua4?LjpDU*nCxT9mgeu3U7#_t0rg05nl z_Uop(V1-Qk`+iua{kmz4?@`l8|9w`jJ literal 0 HcmV?d00001