From f7651c413c63a8a3281eeb82e0d7c6f541a1eb49 Mon Sep 17 00:00:00 2001 From: PinkGoosik Date: Fri, 12 Jan 2024 23:55:48 +0500 Subject: [PATCH] trading pedestal and new dimension --- build.gradle | 8 ++ gradle.properties | 2 +- src/main/java/artifality/ArtifalityMod.java | 3 + .../java/artifality/block/CrateBlock.java | 4 +- .../artifality/block/LunarPortalBlock.java | 40 +++++++++ .../block/TradingPedestalBlock.java | 46 ++++++++++ .../block/UpgradingPedestalBlock.java | 2 +- .../entity/TradingPedestalBlockEntity.java | 85 ++++++++++++++++++ .../artifality/client/ArtifalityClient.java | 20 +++-- .../client/render/TradingPedestalHud.java | 37 ++++++++ .../render/TradingPedestalRenderer.java | 45 ++++++++++ .../command/ArtifalityCommands.java | 45 ++++++++++ .../artifality/extension/PlayerExtension.java | 30 +++++++ .../artifality/item/ArtifactSettings.java | 29 +++--- .../artifality/item/base/ArtifactItem.java | 22 +++-- .../artifality/list/CrystalClusterPacks.java | 12 +-- .../artifality/list/Crystallizations.java | 19 ---- .../list/crystallization/Crystallization.java | 22 ----- .../crystallization/IncrementalElement.java | 39 -------- .../list/crystallization/LifeElement.java | 36 -------- .../list/crystallization/LunarElement.java | 40 --------- .../list/crystallization/WrathElement.java | 39 -------- .../artifality/mixin/common/PlayerMixin.java | 82 ++++++++++++++++- .../registry/ArtifalityBlockEntities.java | 36 ++++++++ .../artifality/registry/ArtifalityBlocks.java | 44 ++++----- .../registry/ArtifalityDimensions.java | 10 +++ .../artifality/registry/ArtifalityEvents.java | 62 +++++++++++++ .../artifality/registry/ArtifalityItems.java | 2 +- .../java/artifality/util/TooltipAppender.java | 16 ++-- src/main/resources/artifality.accesswidener | 1 + .../incremental_crystal_block.json | 3 +- .../artifality/blockstates/lunastone.json | 8 ++ .../artifality/models/block/lunastone.json | 6 ++ .../artifality/models/block/lunastone_2.json | 6 ++ .../artifality/models/item/lunastone.json | 3 + .../artifality/textures/block/lunastone.png | Bin 0 -> 504 bytes .../artifality/textures/block/lunastone_2.png | Bin 0 -> 459 bytes .../advancements/gather_all_crystals.json | 12 --- .../advancements/positive_vision.json | 12 --- .../artifality/dimension/lunar_bazaar.json | 23 +++++ .../dimension_type/lunar_bazaar.json | 20 +++++ .../blocks/medium_wrath_crystal_cluster.json | 51 ----------- .../blocks/small_wrath_crystal_cluster.json | 44 --------- .../blocks/wrath_crystal_block.json | 19 ---- .../blocks/wrath_crystal_cluster.json | 51 ----------- .../blocks/wrath_crystal_lens.json | 19 ---- .../blocks/wrath_crystal_slab.json | 34 ------- .../blocks/wrath_crystal_stairs.json | 19 ---- .../recipes/item/wrath_crystal.json | 12 --- .../recipes/item/wrath_crystal_block.json | 16 ---- .../recipes/item/wrath_crystal_lens.json | 20 ----- .../recipes/item/wrath_crystal_slab.json | 15 ---- .../recipes/item/wrath_crystal_stairs.json | 17 ---- .../loot_tables/recipes/item/wrath_orb.json | 17 ---- .../recipes/item/wrath_crystal_lens.json | 20 ----- .../artifality/structures/lunar_bazaar.nbt | Bin 0 -> 1575205 bytes .../data/artifality/tags/items/crystals.json | 3 +- .../data/artifality/tags/items/lenses.json | 3 +- .../artifality/worldgen/biome/lunar_void.json | 18 ++++ .../tags/blocks/mineable/pickaxe.json | 11 +-- 60 files changed, 695 insertions(+), 665 deletions(-) create mode 100644 src/main/java/artifality/block/LunarPortalBlock.java create mode 100644 src/main/java/artifality/block/TradingPedestalBlock.java create mode 100644 src/main/java/artifality/block/entity/TradingPedestalBlockEntity.java create mode 100644 src/main/java/artifality/client/render/TradingPedestalHud.java create mode 100644 src/main/java/artifality/client/render/TradingPedestalRenderer.java create mode 100644 src/main/java/artifality/command/ArtifalityCommands.java create mode 100644 src/main/java/artifality/extension/PlayerExtension.java delete mode 100644 src/main/java/artifality/list/Crystallizations.java delete mode 100644 src/main/java/artifality/list/crystallization/Crystallization.java delete mode 100644 src/main/java/artifality/list/crystallization/IncrementalElement.java delete mode 100644 src/main/java/artifality/list/crystallization/LifeElement.java delete mode 100644 src/main/java/artifality/list/crystallization/LunarElement.java delete mode 100644 src/main/java/artifality/list/crystallization/WrathElement.java create mode 100644 src/main/java/artifality/registry/ArtifalityBlockEntities.java create mode 100644 src/main/java/artifality/registry/ArtifalityDimensions.java create mode 100644 src/main/resources/artifality.accesswidener create mode 100644 src/main/resources/assets/artifality/blockstates/lunastone.json create mode 100644 src/main/resources/assets/artifality/models/block/lunastone.json create mode 100644 src/main/resources/assets/artifality/models/block/lunastone_2.json create mode 100644 src/main/resources/assets/artifality/models/item/lunastone.json create mode 100644 src/main/resources/assets/artifality/textures/block/lunastone.png create mode 100644 src/main/resources/assets/artifality/textures/block/lunastone_2.png create mode 100644 src/main/resources/data/artifality/dimension/lunar_bazaar.json create mode 100644 src/main/resources/data/artifality/dimension_type/lunar_bazaar.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/medium_wrath_crystal_cluster.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/small_wrath_crystal_cluster.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_block.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_cluster.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_lens.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_slab.json delete mode 100644 src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_stairs.json delete mode 100644 src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal.json delete mode 100644 src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_block.json delete mode 100644 src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_lens.json delete mode 100644 src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_slab.json delete mode 100644 src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_stairs.json delete mode 100644 src/main/resources/data/artifality/loot_tables/recipes/item/wrath_orb.json delete mode 100644 src/main/resources/data/artifality/recipes/item/wrath_crystal_lens.json create mode 100644 src/main/resources/data/artifality/structures/lunar_bazaar.nbt create mode 100644 src/main/resources/data/artifality/worldgen/biome/lunar_void.json diff --git a/build.gradle b/build.gradle index b67e32c..ac51a0d 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,14 @@ dependencies { // modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-api:${project.cca_version}" modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-base:${project.cca_version}" modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${project.cca_version}" + + modLocalRuntime "maven.modrinth:here-be-no-dragons:1.0.0" + modLocalRuntime "maven.modrinth:limitless-structure-block:1.0" + modLocalRuntime "dev.emi:emi-fabric:1.0.29+1.20.1" +} + +loom { + accessWidenerPath = file("src/main/resources/artifality.accesswidener") } base { diff --git a/gradle.properties b/gradle.properties index 7cd84e0..6eb3182 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ archives_base_name = artifality # Dependencies minecraft_version = 1.20.1 yarn_mappings = 1.20.1+build.10 -fabric_loader = 0.15.2 +fabric_loader = 0.15.3 fabric_api = 0.91.0+1.20.1 trinkets_version = 3.7.1 cca_version = 5.2.2 \ No newline at end of file diff --git a/src/main/java/artifality/ArtifalityMod.java b/src/main/java/artifality/ArtifalityMod.java index ced833d..88963ff 100644 --- a/src/main/java/artifality/ArtifalityMod.java +++ b/src/main/java/artifality/ArtifalityMod.java @@ -1,5 +1,6 @@ package artifality; +import artifality.command.ArtifalityCommands; import artifality.data.ArtifalityLootTables; import artifality.registry.*; import net.fabricmc.api.ModInitializer; @@ -36,11 +37,13 @@ public class ArtifalityMod implements ModInitializer { public void onInitialize() { ArtifalityItems.init(); ArtifalityBlocks.init(); + ArtifalityBlockEntities.init(); ArtifalityEnchants.init(); ArtifalityFeatures.init(); ArtifalityEvents.init(); ArtifalityLootTables.init(); ArtifalityEffects.init(); + ArtifalityCommands.init(); Registry.register(Registries.ITEM_GROUP, id("items"), ITEM_GROUP); } diff --git a/src/main/java/artifality/block/CrateBlock.java b/src/main/java/artifality/block/CrateBlock.java index f33bce7..88a9239 100644 --- a/src/main/java/artifality/block/CrateBlock.java +++ b/src/main/java/artifality/block/CrateBlock.java @@ -45,7 +45,7 @@ public class CrateBlock extends BaseBlock implements Waterloggable { public static final VoxelShape SHAPE = createCuboidShape(2, 0, 2, 14, 12, 14); public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public static final ArrayList CRYSTALS = new ArrayList<>(List.of(INCREMENTAL_CRYSTAL, LUNAR_CRYSTAL, LIFE_CRYSTAL, WRATH_CRYSTAL)); + public static final ArrayList CRYSTALS = new ArrayList<>(List.of(INCREMENTAL_CRYSTAL, LUNAR_CRYSTAL, LIFE_CRYSTAL)); private final ArrayList commonArtifacts = new ArrayList<>(); private final ArrayList rareArtifacts = new ArrayList<>(); @@ -58,7 +58,7 @@ public CrateBlock(Settings settings, ArtifactRarity rarity) { this.rarity = rarity; ArtifalityItems.ITEMS.forEach((id, item) -> { if(item instanceof ArtifactItem artifact) { - ArtifactRarity artifactRarity = artifact.config.rarity; + ArtifactRarity artifactRarity = artifact.artifactSettings.rarity; switch (artifactRarity) { case COMMON -> commonArtifacts.add(item); case RARE -> rareArtifacts.add(item); diff --git a/src/main/java/artifality/block/LunarPortalBlock.java b/src/main/java/artifality/block/LunarPortalBlock.java new file mode 100644 index 0000000..617e037 --- /dev/null +++ b/src/main/java/artifality/block/LunarPortalBlock.java @@ -0,0 +1,40 @@ +package artifality.block; + +import artifality.extension.PlayerExtension; +import artifality.registry.ArtifalityDimensions; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.Set; + +public class LunarPortalBlock extends Block { + + public LunarPortalBlock(Settings settings) { + super(settings); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + MinecraftServer server = world.getServer(); + + if(server != null && player instanceof PlayerExtension ex) { + if (!world.getDimensionKey().getValue().equals(ArtifalityDimensions.LUNAR_BAZAAR.getValue())) { + ex.savePrevPosition(); + player.teleport(server.getWorld(ArtifalityDimensions.LUNAR_BAZAAR), -20.5, 120.0, -20.5, Set.of(), -45, 0); + } + else { + ex.teleportToPrevPosition(); + } + return ActionResult.SUCCESS; + } + + return super.onUse(state, world, pos, player, hand, hit); + } +} diff --git a/src/main/java/artifality/block/TradingPedestalBlock.java b/src/main/java/artifality/block/TradingPedestalBlock.java new file mode 100644 index 0000000..d1df970 --- /dev/null +++ b/src/main/java/artifality/block/TradingPedestalBlock.java @@ -0,0 +1,46 @@ +package artifality.block; + +import artifality.block.base.BaseBlock; +import artifality.block.entity.TradingPedestalBlockEntity; +import net.minecraft.block.BlockEntityProvider; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +public class TradingPedestalBlock extends BaseBlock implements BlockEntityProvider { + + public TradingPedestalBlock(Settings settings) { + super(settings); + } + + @Nullable + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new TradingPedestalBlockEntity(pos, state); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if(world.getBlockEntity(pos) instanceof TradingPedestalBlockEntity be) { +// player.sendMessage(Text.literal(be.sellingItem.getName().getString() + " x" + be.sellingItem.getCount())); +// player.sendMessage(Text.literal(be.chargeItem.getName().getString() + " x" + be.chargeItem.getCount())); + + if(!be.sellingItem.isEmpty()) { + if(!world.isClient()) { + dropStack(world, pos.up(), be.sellingItem.copy()); + be.sellingItem = ItemStack.EMPTY; + be.updateListeners(); + } + return ActionResult.SUCCESS; + } + } + return super.onUse(state, world, pos, player, hand, hit); + } +} diff --git a/src/main/java/artifality/block/UpgradingPedestalBlock.java b/src/main/java/artifality/block/UpgradingPedestalBlock.java index 4198b75..c84044a 100644 --- a/src/main/java/artifality/block/UpgradingPedestalBlock.java +++ b/src/main/java/artifality/block/UpgradingPedestalBlock.java @@ -48,7 +48,7 @@ else if(stack.isOf(Items.NETHER_STAR) && getCharges(state) != 4) { stack.decrement(1); return ActionResult.SUCCESS; } - else if(item instanceof ArtifactItem artifact && artifact.config.hasTiers) { + else if(item instanceof ArtifactItem artifact && artifact.artifactSettings.hasTiers) { if(getCharges(state) == 3 && TiersUtils.getTier(stack) == 1) { world.playSound(null, pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.BLOCK_RESPAWN_ANCHOR_DEPLETE.value(), SoundCategory.BLOCKS, 1.0F, 1.0F); player.setStackInHand(Hand.MAIN_HAND, TiersUtils.withTier(item, 2)); diff --git a/src/main/java/artifality/block/entity/TradingPedestalBlockEntity.java b/src/main/java/artifality/block/entity/TradingPedestalBlockEntity.java new file mode 100644 index 0000000..1d9c228 --- /dev/null +++ b/src/main/java/artifality/block/entity/TradingPedestalBlockEntity.java @@ -0,0 +1,85 @@ +package artifality.block.entity; + +import artifality.registry.ArtifalityBlockEntities; +import artifality.registry.ArtifalityItems; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.listener.ClientPlayPacketListener; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +public class TradingPedestalBlockEntity extends BlockEntity { + public ItemStack sellingItem = ItemStack.EMPTY; + public ItemStack chargeItem = new ItemStack(ArtifalityItems.LUNAR_CRYSTAL, 10); + + public TradingPedestalBlockEntity(BlockPos pos, BlockState state) { + super(ArtifalityBlockEntities.TRADING_PEDESTAL, pos, state); + } + + @Override + public void writeNbt(NbtCompound nbt) { + super.writeNbt(nbt); + + NbtCompound sellingItemNbt = new NbtCompound(); + sellingItemNbt.putString("item", Registries.ITEM.getId(sellingItem.getItem()).toString()); + sellingItemNbt.put("nbt", sellingItem.getOrCreateNbt()); + sellingItemNbt.putInt("count", sellingItem.getCount()); + nbt.put("sellingItem", sellingItemNbt); + + NbtCompound chargeItemNbt = new NbtCompound(); + chargeItemNbt.putString("item", Registries.ITEM.getId(chargeItem.getItem()).toString()); + chargeItemNbt.put("nbt", chargeItem.getOrCreateNbt()); + chargeItemNbt.putInt("count", chargeItem.getCount()); + nbt.put("chargeItem", chargeItemNbt); + } + + @Override + public void readNbt(NbtCompound nbt) { + super.readNbt(nbt); + + if(nbt.contains("sellingItem")) { + NbtCompound sellingItemNbt = nbt.getCompound("sellingItem"); + var item = Registries.ITEM.getOrEmpty(new Identifier(sellingItemNbt.getString("item"))); + + if(item.isPresent()) { + this.sellingItem = new ItemStack(item.get(), sellingItemNbt.getInt("count")); + this.sellingItem.setNbt((NbtCompound)sellingItemNbt.get("nbt")); + } + } + + if(nbt.contains("chargeItem")) { + NbtCompound chargeItemNbt = nbt.getCompound("chargeItem"); + var item = Registries.ITEM.getOrEmpty(new Identifier(chargeItemNbt.getString("item"))); + + if(item.isPresent()) { + this.chargeItem = new ItemStack(item.get(), chargeItemNbt.getInt("count")); + this.chargeItem.setNbt((NbtCompound)chargeItemNbt.get("nbt")); + } + } + } + + @Override + public NbtCompound toInitialChunkDataNbt() { + NbtCompound nbtCompound = new NbtCompound(); + this.writeNbt(nbtCompound); + return nbtCompound; + } + + @Nullable + @Override + public Packet toUpdatePacket() { + return BlockEntityUpdateS2CPacket.create(this); + } + + public void updateListeners() { + this.markDirty(); + this.getWorld().updateListeners(this.getPos(), this.getCachedState(), this.getCachedState(), Block.NOTIFY_ALL); + } +} diff --git a/src/main/java/artifality/client/ArtifalityClient.java b/src/main/java/artifality/client/ArtifalityClient.java index 0834e22..8dd37fa 100644 --- a/src/main/java/artifality/client/ArtifalityClient.java +++ b/src/main/java/artifality/client/ArtifalityClient.java @@ -3,7 +3,10 @@ import artifality.ArtifalityMod; import artifality.block.CrateBlock; import artifality.block.base.*; +import artifality.client.render.TradingPedestalHud; +import artifality.client.render.TradingPedestalRenderer; import artifality.item.base.ArtifactItem; +import artifality.registry.ArtifalityBlockEntities; import artifality.registry.ArtifalityBlocks; import artifality.api.TwoModelsItemRegistry; import artifality.registry.ArtifalityItems; @@ -12,24 +15,25 @@ 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.resource.ResourceManagerHelper; -import net.fabricmc.fabric.api.resource.ResourcePackActivationType; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; import net.minecraft.client.util.ModelIdentifier; public class ArtifalityClient implements ClientModInitializer { @Override public void onInitializeClient() { + BlockEntityRendererFactories.register(ArtifalityBlockEntities.TRADING_PEDESTAL, ctx -> new TradingPedestalRenderer<>()); + + TradingPedestalHud.register(); ArtifalityParticles.register(); ArtifalityItems.ITEMS.forEach((id, item) -> { if(item instanceof ArtifactItem artifact) { - if (artifact.config.renderer != null) { - TrinketRendererRegistry.registerRenderer(item, artifact.config.renderer); + if (artifact.artifactSettings.renderer != null) { + TrinketRendererRegistry.registerRenderer(item, artifact.artifactSettings.renderer); } - if(artifact.config.hasTwoModels) { + if(artifact.artifactSettings.hasTwoModels) { TwoModelsItemRegistry.register(item); } } @@ -71,7 +75,7 @@ public void onInitializeClient() { // }); // Thanks Juce! :) - FabricLoader.getInstance().getModContainer(ArtifalityMod.MOD_ID).ifPresent(artifality -> - ResourceManagerHelper.registerBuiltinResourcePack(ArtifalityMod.id("fancyclusters"), artifality, ResourcePackActivationType.NORMAL)); +// FabricLoader.getInstance().getModContainer(ArtifalityMod.MOD_ID).ifPresent(artifality -> +// ResourceManagerHelper.registerBuiltinResourcePack(ArtifalityMod.id("fancyclusters"), artifality, ResourcePackActivationType.NORMAL)); } } diff --git a/src/main/java/artifality/client/render/TradingPedestalHud.java b/src/main/java/artifality/client/render/TradingPedestalHud.java new file mode 100644 index 0000000..943c271 --- /dev/null +++ b/src/main/java/artifality/client/render/TradingPedestalHud.java @@ -0,0 +1,37 @@ +package artifality.client.render; + +import artifality.block.TradingPedestalBlock; +import artifality.block.entity.TradingPedestalBlockEntity; +import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; + +public class TradingPedestalHud { + + public static void register() { + HudRenderCallback.EVENT.register((drawContext, tickDelta) -> { + MinecraftClient client = MinecraftClient.getInstance(); + HitResult hitResult = client.crosshairTarget; + + if (hitResult != null && hitResult.getType() == HitResult.Type.BLOCK) { + BlockPos blockPos = ((BlockHitResult)hitResult).getBlockPos(); + BlockState block = client.world.getBlockState(blockPos); + + if(block.getBlock() instanceof TradingPedestalBlock && client.world.getBlockEntity(blockPos) instanceof TradingPedestalBlockEntity entity && !entity.sellingItem.isEmpty()) { + drawContext.getMatrices().push(); + var height = drawContext.getScaledWindowHeight(); + var width = drawContext.getScaledWindowWidth(); + + var text = Text.literal("Requires: " + entity.chargeItem.getName().getString() + " x" + entity.chargeItem.getCount()); + drawContext.drawItem(entity.chargeItem, (width / 2) + 7, (height / 2) - 7); + drawContext.drawTextWithShadow(client.textRenderer, text, (width / 2) - (client.textRenderer.getWidth(text) / 2), (height / 2) + 10, 16777215); + drawContext.getMatrices().pop(); + } + } + }); + } +} diff --git a/src/main/java/artifality/client/render/TradingPedestalRenderer.java b/src/main/java/artifality/client/render/TradingPedestalRenderer.java new file mode 100644 index 0000000..0b2e3c9 --- /dev/null +++ b/src/main/java/artifality/client/render/TradingPedestalRenderer.java @@ -0,0 +1,45 @@ +package artifality.client.render; + +import artifality.block.entity.TradingPedestalBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.json.ModelTransformationMode; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.RotationAxis; +import org.joml.Vector3f; + +public class TradingPedestalRenderer implements BlockEntityRenderer { + + @Override + public void render(T entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { + var world = entity.getWorld(); + + if(world != null && !entity.isRemoved()) { + matrices.push(); + + ItemStack stack = entity.sellingItem; + MinecraftClient client = MinecraftClient.getInstance(); + BakedModel model = client.getItemRenderer().getModel(stack, world, null, 0); + Vector3f translate = model.getTransformation().ground.translation; + matrices.translate(translate.x() + 0.5, translate.y() + 1.25, translate.z() + 0.5); + + if (stack.getItem() instanceof BlockItem) { + matrices.scale(1.5F, 1.5F, 1.5F); + } + else { + matrices.scale(1.25F, 1.25F, 1.25F); + } + + float rotation = ((int) (MinecraftClient.getInstance().world.getTime() % 314) + tickDelta) / 25.0F + 6.0F; + matrices.multiply(RotationAxis.POSITIVE_Y.rotation(rotation)); + client.getItemRenderer().renderItem(stack, ModelTransformationMode.GROUND, false, matrices, vertexConsumers, light, overlay, model); + + matrices.pop(); + } + } + +} diff --git a/src/main/java/artifality/command/ArtifalityCommands.java b/src/main/java/artifality/command/ArtifalityCommands.java new file mode 100644 index 0000000..7b7525e --- /dev/null +++ b/src/main/java/artifality/command/ArtifalityCommands.java @@ -0,0 +1,45 @@ +package artifality.command; + +import artifality.block.entity.TradingPedestalBlockEntity; +import artifality.registry.ArtifalityBlocks; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.command.argument.ItemStackArgumentType; +import net.minecraft.item.ItemStack; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.math.BlockPos; + +import static net.minecraft.server.command.CommandManager.literal; +import static net.minecraft.server.command.CommandManager.argument; + +public class ArtifalityCommands { + + public static void init() { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> ArtifalityCommands.register(dispatcher, registryAccess)); + } + + private static void register(CommandDispatcher dispatcher, CommandRegistryAccess commandRegistryAccess) { + dispatcher.register(literal("artifality").then(literal("create-trading-pedestal").requires((source) -> source.hasPermissionLevel(4)) + .then(argument("selling-item", ItemStackArgumentType.itemStack(commandRegistryAccess)) + .then(CommandManager.argument("selling-count", IntegerArgumentType.integer(1)) + .then(CommandManager.argument("charge-item", ItemStackArgumentType.itemStack(commandRegistryAccess)) + .then(argument("charge-count", IntegerArgumentType.integer(1)).executes(context -> { + ItemStack sellingItem = ItemStackArgumentType.getItemStackArgument(context, "selling-item").createStack(IntegerArgumentType.getInteger(context, "selling-count"), true); + ItemStack chargeItem = ItemStackArgumentType.getItemStackArgument(context, "charge-item").createStack(IntegerArgumentType.getInteger(context, "charge-count"), true); + BlockPos pos = context.getSource().getPlayer().getBlockPos(); + + context.getSource().getWorld().setBlockState(pos, ArtifalityBlocks.LUNAR_TRADING_PEDESTAL.getDefaultState()); + + if(context.getSource().getWorld().getBlockEntity(pos) instanceof TradingPedestalBlockEntity be) { + be.sellingItem = sellingItem.copy(); + be.chargeItem = chargeItem.copy(); + be.updateListeners(); + } + + return 1; + }))))))); + } +} diff --git a/src/main/java/artifality/extension/PlayerExtension.java b/src/main/java/artifality/extension/PlayerExtension.java new file mode 100644 index 0000000..3404ffb --- /dev/null +++ b/src/main/java/artifality/extension/PlayerExtension.java @@ -0,0 +1,30 @@ +package artifality.extension; + +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Vec3d; + +public interface PlayerExtension { + void savePrevPosition(); + void teleportToPrevPosition(); + void resetPrevPosition(); + PlayerPosition getPrevPosition(); + void setPrevPosition(PlayerPosition pos); + + class PlayerPosition { + public Vec3d pos = null; + public float yaw = 0; + public float pitch = 0; + public Identifier dimension = null; + + public PlayerPosition(Vec3d pos, float yaw, float pitch, Identifier dimension) { + this.pos = pos; + this.yaw = yaw; + this.pitch = pitch; + this.dimension = dimension; + } + + public PlayerPosition copy() { + return new PlayerPosition(this.pos, this.yaw, this.pitch, this.dimension); + } + } +} diff --git a/src/main/java/artifality/item/ArtifactSettings.java b/src/main/java/artifality/item/ArtifactSettings.java index c7f2eec..7a53be8 100644 --- a/src/main/java/artifality/item/ArtifactSettings.java +++ b/src/main/java/artifality/item/ArtifactSettings.java @@ -6,34 +6,40 @@ public class ArtifactSettings { public final FabricItemSettings fabricItemSettings; - public final Parameters parameters = new Parameters(); + public ArtifactRarity rarity = ArtifactRarity.COMMON; + public TrinketRenderer renderer; + public boolean isCrateLoot = true; + public boolean isTrinket = false; + public boolean hasTiers = false; + public boolean hasTwoModels = false; + public ArtifactSettings() { fabricItemSettings = new FabricItemSettings(); } public ArtifactSettings rarity(ArtifactRarity rarity) { - this.parameters.rarity = rarity; + this.rarity = rarity; return this; } public ArtifactSettings nonCrateItem() { - this.parameters.isCrateLoot = false; + this.isCrateLoot = false; return this; } public ArtifactSettings twoModeled() { - this.parameters.hasTwoModels = true; + this.hasTwoModels = true; return this; } public ArtifactSettings trinket() { - this.parameters.isTrinket = true; + this.isTrinket = true; return this; } public ArtifactSettings tiered() { - this.parameters.hasTiers = true; + this.hasTiers = true; return this; } @@ -48,16 +54,7 @@ public ArtifactSettings maxDamage(int maxDamage) { } public ArtifactSettings renderer(TrinketRenderer renderer) { - this.parameters.renderer = renderer; + this.renderer = renderer; return this; } - - public static class Parameters { - public ArtifactRarity rarity = ArtifactRarity.COMMON; - public TrinketRenderer renderer; - public boolean isCrateLoot = true; - public boolean isTrinket = false; - public boolean hasTiers = false; - public boolean hasTwoModels = false; - } } diff --git a/src/main/java/artifality/item/base/ArtifactItem.java b/src/main/java/artifality/item/base/ArtifactItem.java index c3f7a15..d15081e 100644 --- a/src/main/java/artifality/item/base/ArtifactItem.java +++ b/src/main/java/artifality/item/base/ArtifactItem.java @@ -15,15 +15,13 @@ import java.util.List; public class ArtifactItem extends BaseItem { - public final ArtifactSettings.Parameters config; - public final ArtifactSettings settings; + public final ArtifactSettings artifactSettings; public ArtifactItem(ArtifactSettings settings) { super(settings.fabricItemSettings); - this.settings = settings; - this.config = settings.parameters; + this.artifactSettings = settings; - if(config.isTrinket) { + if(artifactSettings.isTrinket) { TrinketsApi.registerTrinket(this, (Trinket)this); } } @@ -33,7 +31,7 @@ public void appendTooltipInfo(ItemStack stack, List tooltip) { @Override public boolean hasGlint(ItemStack stack) { - if(config.hasTiers) { + if(artifactSettings.hasTiers) { return TiersUtils.getTier(stack) == 3; } return false; @@ -41,7 +39,7 @@ public boolean hasGlint(ItemStack stack) { @Override public ActionResult useOnBlock(ItemUsageContext context) { - if (config.hasTiers) { + if (artifactSettings.hasTiers) { if(context.getWorld().getBlockState(context.getBlockPos()).isOf(ArtifalityBlocks.UPGRADING_PEDESTAL)) { return ActionResult.FAIL; } @@ -49,9 +47,9 @@ public ActionResult useOnBlock(ItemUsageContext context) { return super.useOnBlock(context); } - @Override - public Text getName(ItemStack stack) { - Color color = config.rarity.getColor(); - return Text.translatable(this.getTranslationKey(stack)).setStyle(Style.EMPTY.withColor(color.getRGB())); - } +// @Override +// public Text getName(ItemStack stack) { +// Color color = artifactSettings.rarity.getColor(); +// return Text.translatable(this.getTranslationKey(stack)).setStyle(Style.EMPTY.withColor(color.getRGB())); +// } } diff --git a/src/main/java/artifality/list/CrystalClusterPacks.java b/src/main/java/artifality/list/CrystalClusterPacks.java index cfe9df3..3c317ea 100644 --- a/src/main/java/artifality/list/CrystalClusterPacks.java +++ b/src/main/java/artifality/list/CrystalClusterPacks.java @@ -29,12 +29,12 @@ public class CrystalClusterPacks { MEDIUM_LIFE_CRYSTAL_CLUSTER, LIFE_CRYSTAL_CLUSTER ); - add( - WRATH_CRYSTAL_GEODE, - SMALL_WRATH_CRYSTAL_CLUSTER, - MEDIUM_WRATH_CRYSTAL_CLUSTER, - WRATH_CRYSTAL_CLUSTER - ); +// add( +// WRATH_CRYSTAL_GEODE, +// SMALL_WRATH_CRYSTAL_CLUSTER, +// MEDIUM_WRATH_CRYSTAL_CLUSTER, +// WRATH_CRYSTAL_CLUSTER +// ); } public static void add(Block geode, Block... clusters) { diff --git a/src/main/java/artifality/list/Crystallizations.java b/src/main/java/artifality/list/Crystallizations.java deleted file mode 100644 index 71edfef..0000000 --- a/src/main/java/artifality/list/Crystallizations.java +++ /dev/null @@ -1,19 +0,0 @@ -package artifality.list; - -import artifality.list.crystallization.*; - -import java.util.ArrayList; - -public class Crystallizations { - public static final ArrayList ELEMENTS = new ArrayList<>(); - - public static final Crystallization INCREMENTAL = add(new IncrementalElement("incremental")); - public static final Crystallization LUNAR = add(new LunarElement("lunar")); - public static final Crystallization LIFE = add(new LifeElement("life")); -// public static final Crystallization WRATH = add(new WrathElement("wrath")); - - public static Crystallization add(Crystallization element) { - ELEMENTS.add(element); - return element; - } -} diff --git a/src/main/java/artifality/list/crystallization/Crystallization.java b/src/main/java/artifality/list/crystallization/Crystallization.java deleted file mode 100644 index c25d16c..0000000 --- a/src/main/java/artifality/list/crystallization/Crystallization.java +++ /dev/null @@ -1,22 +0,0 @@ -package artifality.list.crystallization; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.world.World; - -public abstract class Crystallization { - String name; - - public Crystallization(String name){ - this.name = name; - } - - public String getName() { - return name; - } - - public abstract void tick(LivingEntity entity, World world); - - public abstract void onAttack(LivingEntity target, World world); - - public abstract void onInit(LivingEntity entity, World world); -} diff --git a/src/main/java/artifality/list/crystallization/IncrementalElement.java b/src/main/java/artifality/list/crystallization/IncrementalElement.java deleted file mode 100644 index 0c18202..0000000 --- a/src/main/java/artifality/list/crystallization/IncrementalElement.java +++ /dev/null @@ -1,39 +0,0 @@ -package artifality.list.crystallization; - -import artifality.util.EffectsUtils; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.world.World; - -public class IncrementalElement extends Crystallization { - - public IncrementalElement(String name) { - super(name); - } - - @Override - public void tick(LivingEntity entity, World world) { - EffectsUtils.ticking(entity, StatusEffects.SPEED, 1); - EffectsUtils.ticking(entity, StatusEffects.JUMP_BOOST, 1); - } - - @Override - public void onAttack(LivingEntity target, World world) { - - } - - @Override - public void onInit(LivingEntity entity, World world) { - Multimap attributes; - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_MAX_HEALTH, new EntityAttributeModifier("Element modifier", 15, EntityAttributeModifier.Operation.ADDITION)); - attributes = builder.build(); - entity.getAttributes().addTemporaryModifiers(attributes); - entity.heal(15); - } -} diff --git a/src/main/java/artifality/list/crystallization/LifeElement.java b/src/main/java/artifality/list/crystallization/LifeElement.java deleted file mode 100644 index 7227e11..0000000 --- a/src/main/java/artifality/list/crystallization/LifeElement.java +++ /dev/null @@ -1,36 +0,0 @@ -package artifality.list.crystallization; - -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.world.World; - -public class LifeElement extends Crystallization { - - public LifeElement(String name) { - super(name); - } - - @Override - public void tick(LivingEntity entity, World world) { - - } - - @Override - public void onAttack(LivingEntity target, World world) { - - } - - @Override - public void onInit(LivingEntity entity, World world) { - Multimap attributes; - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_MAX_HEALTH, new EntityAttributeModifier("Element modifier", 30, EntityAttributeModifier.Operation.ADDITION)); - attributes = builder.build(); - entity.getAttributes().addTemporaryModifiers(attributes); - entity.heal(30); - } -} diff --git a/src/main/java/artifality/list/crystallization/LunarElement.java b/src/main/java/artifality/list/crystallization/LunarElement.java deleted file mode 100644 index f04c68b..0000000 --- a/src/main/java/artifality/list/crystallization/LunarElement.java +++ /dev/null @@ -1,40 +0,0 @@ -package artifality.list.crystallization; - -import artifality.util.EffectsUtils; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.world.World; - -public class LunarElement extends Crystallization { - - public LunarElement(String name) { - super(name); - } - - @Override - public void tick(LivingEntity entity, World world) { - if (world.getTime() % 100L == 0L) { - entity.addStatusEffect(new StatusEffectInstance(EffectsUtils.getRandomPositive(), 100, 0, true, true)); - } - } - - @Override - public void onAttack(LivingEntity target, World world) { - target.addStatusEffect(new StatusEffectInstance(EffectsUtils.getRandomNegative(), 100, 0, true, true)); - } - - @Override - public void onInit(LivingEntity entity, World world) { - Multimap attributes; - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_MAX_HEALTH, new EntityAttributeModifier("Element modifier", 15, EntityAttributeModifier.Operation.ADDITION)); - attributes = builder.build(); - entity.getAttributes().addTemporaryModifiers(attributes); - entity.heal(15); - } -} diff --git a/src/main/java/artifality/list/crystallization/WrathElement.java b/src/main/java/artifality/list/crystallization/WrathElement.java deleted file mode 100644 index d547615..0000000 --- a/src/main/java/artifality/list/crystallization/WrathElement.java +++ /dev/null @@ -1,39 +0,0 @@ -package artifality.list.crystallization; - -import artifality.util.EffectsUtils; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.world.World; - -public class WrathElement extends Crystallization { - - public WrathElement(String name) { - super(name); - } - - @Override - public void tick(LivingEntity entity, World world) { - EffectsUtils.ticking(entity, StatusEffects.STRENGTH, 0); - EffectsUtils.ticking(entity, StatusEffects.SPEED, 0); - } - - @Override - public void onAttack(LivingEntity target, World world) { - - } - - @Override - public void onInit(LivingEntity entity, World world) { - Multimap attributes; - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_MAX_HEALTH, new EntityAttributeModifier("Element modifier", 15, EntityAttributeModifier.Operation.ADDITION)); - attributes = builder.build(); - entity.getAttributes().addTemporaryModifiers(attributes); - entity.heal(15); - } -} diff --git a/src/main/java/artifality/mixin/common/PlayerMixin.java b/src/main/java/artifality/mixin/common/PlayerMixin.java index be94eae..525b975 100644 --- a/src/main/java/artifality/mixin/common/PlayerMixin.java +++ b/src/main/java/artifality/mixin/common/PlayerMixin.java @@ -1,5 +1,6 @@ package artifality.mixin.common; +import artifality.extension.PlayerExtension; import artifality.registry.ArtifalityEnchants; import artifality.registry.ArtifalityItems; import artifality.item.BalloonItem; @@ -7,6 +8,7 @@ import artifality.util.TiersUtils; import artifality.util.TrinketsUtils; import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.damage.DamageSource; @@ -14,7 +16,10 @@ import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -23,10 +28,18 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Set; + @Mixin(PlayerEntity.class) -public class PlayerMixin { +abstract class PlayerMixin extends LivingEntity implements PlayerExtension { PlayerEntity self = (PlayerEntity)(Object)this; + public PlayerExtension.PlayerPosition prevPosition = null; + + protected PlayerMixin(EntityType entityType, World world) { + super(entityType, world); + } + @Inject(method = "getAttackCooldownProgressPerTick", at = @At("HEAD"), cancellable = true) void getAttackCooldownProgressPerTick(CallbackInfoReturnable cir) { if(EnchantmentHelper.get(self.getStackInHand(Hand.MAIN_HAND)).containsKey(ArtifalityEnchants.LUNAR_DAMAGE)) { @@ -98,4 +111,71 @@ void useBalloon() { } }); } + + @Inject(method = "writeCustomDataToNbt", at = @At("HEAD")) + void writeCustomDataToNbt(NbtCompound nbt, CallbackInfo ci) { + + if(prevPosition != null) { + NbtCompound compound = new NbtCompound(); + compound.putDouble("x", prevPosition.pos.x); + compound.putDouble("y", prevPosition.pos.y); + compound.putDouble("z", prevPosition.pos.z); + compound.putFloat("yaw", prevPosition.yaw); + compound.putFloat("pitch", prevPosition.pitch); + compound.putString("dimension", prevPosition.dimension.toString()); + + nbt.put("PrevPositionBeforeBazaar", compound); + } + } + + @Inject(method = "readCustomDataFromNbt", at = @At("HEAD")) + void readCustomDataFromNbt(NbtCompound nbt, CallbackInfo ci) { + if(nbt.contains("PrevPositionBeforeBazaar")) { + NbtCompound compound = nbt.getCompound("PrevPositionBeforeBazaar"); + prevPosition = new PlayerPosition( + new Vec3d(compound.getDouble("x"), compound.getDouble("y"), compound.getDouble("z")), + compound.getFloat("yaw"), + compound.getFloat("pitch"), + new Identifier(compound.getString("dimension")) + ); + } + } + + @Override + public void savePrevPosition() { + prevPosition = new PlayerPosition( + getPos(), + getYaw(), + getPitch(), + getWorld().getDimensionKey().getValue() + ); + } + + @Override + public void teleportToPrevPosition() { + if(prevPosition != null) { + for(var world : getServer().getWorlds()) { + if(world.getDimensionKey().getValue().equals(prevPosition.dimension)) { + teleport(world, prevPosition.pos.x, prevPosition.pos.y + 0.5, prevPosition.pos.z, Set.of(), prevPosition.yaw, prevPosition.pitch); + resetPrevPosition(); + break; + } + } + } + } + + @Override + public void resetPrevPosition() { + prevPosition = null; + } + + @Override + public void setPrevPosition(PlayerPosition pos) { + this.prevPosition = pos; + } + + @Override + public PlayerPosition getPrevPosition() { + return this.prevPosition; + } } diff --git a/src/main/java/artifality/registry/ArtifalityBlockEntities.java b/src/main/java/artifality/registry/ArtifalityBlockEntities.java new file mode 100644 index 0000000..13005d6 --- /dev/null +++ b/src/main/java/artifality/registry/ArtifalityBlockEntities.java @@ -0,0 +1,36 @@ +package artifality.registry; + +import artifality.ArtifalityMod; +import artifality.block.TradingPedestalBlock; +import artifality.block.entity.TradingPedestalBlockEntity; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; + +import java.util.ArrayList; + +public class ArtifalityBlockEntities { + + public static final BlockEntityType TRADING_PEDESTAL = Registry.register( + Registries.BLOCK_ENTITY_TYPE, + ArtifalityMod.id("trading_pedestal"), + FabricBlockEntityTypeBuilder.create(TradingPedestalBlockEntity::new, collectPedestals()).build() + ); + + public static void init() { + + } + + public static TradingPedestalBlock[] collectPedestals() { + ArrayList pedestals = new ArrayList<>(); + + ArtifalityBlocks.BLOCKS.forEach((id, block) -> { + if(block instanceof TradingPedestalBlock pedestal) { + pedestals.add(pedestal); + } + }); + + return pedestals.toArray(new TradingPedestalBlock[0]); + } +} diff --git a/src/main/java/artifality/registry/ArtifalityBlocks.java b/src/main/java/artifality/registry/ArtifalityBlocks.java index 842c842..2a1dfa7 100644 --- a/src/main/java/artifality/registry/ArtifalityBlocks.java +++ b/src/main/java/artifality/registry/ArtifalityBlocks.java @@ -1,9 +1,7 @@ package artifality.registry; import artifality.ArtifalityMod; -import artifality.block.CrateBlock; -import artifality.block.CrystalGeodeBlock; -import artifality.block.UpgradingPedestalBlock; +import artifality.block.*; import artifality.block.base.*; import artifality.item.base.BaseBlockItem; import artifality.list.ArtifactRarity; @@ -27,10 +25,10 @@ public class ArtifalityBlocks { public static final Map ITEMS = new LinkedHashMap<>(); public static final Map BLOCKS = new LinkedHashMap<>(); - public static final Block COMMON_CRATE = add("common_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.WOOD).luminance(7), ArtifactRarity.COMMON)); - public static final Block RARE_CRATE = add("rare_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.STONE).luminance(7), ArtifactRarity.RARE)); - public static final Block LEGENDARY_CRATE = add("legendary_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.STONE).luminance(7), ArtifactRarity.LEGENDARY)); - public static final Block LUNAR_CRATE = add("lunar_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.STONE).luminance(7), ArtifactRarity.RARE)); +// public static final Block COMMON_CRATE = add("common_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.WOOD).luminance(7), ArtifactRarity.COMMON)); +// public static final Block RARE_CRATE = add("rare_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.STONE).luminance(7), ArtifactRarity.RARE)); +// public static final Block LEGENDARY_CRATE = add("legendary_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.STONE).luminance(7), ArtifactRarity.LEGENDARY)); +// public static final Block LUNAR_CRATE = add("lunar_crate", new CrateBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.STONE).luminance(7), ArtifactRarity.RARE)); public static final Block SMALL_INCREMENTAL_CRYSTAL_CLUSTER = cluster("small_incremental_crystal_cluster", "small"); public static final Block MEDIUM_INCREMENTAL_CRYSTAL_CLUSTER = cluster("medium_incremental_crystal_cluster", "medium"); @@ -74,26 +72,30 @@ public class ArtifalityBlocks { public static final Block LIFE_CRYSTAL_SLAB = crystalSlab("life_crystal_slab"); public static final Block LIFE_CRYSTAL_STAIRS = crystalStairs("life_crystal_stairs"); - public static final Block SMALL_WRATH_CRYSTAL_CLUSTER = cluster("small_wrath_crystal_cluster", "small"); - public static final Block MEDIUM_WRATH_CRYSTAL_CLUSTER = cluster("medium_wrath_crystal_cluster", "medium"); - public static final Block WRATH_CRYSTAL_CLUSTER = cluster("wrath_crystal_cluster", "large"); - - public static final Block WRATH_CRYSTAL_GEODE = geode("wrath_crystal_geode", - SMALL_WRATH_CRYSTAL_CLUSTER, - MEDIUM_WRATH_CRYSTAL_CLUSTER, - WRATH_CRYSTAL_CLUSTER - ); - - public static final Block WRATH_CRYSTAL_BLOCK = crystalBlock("wrath_crystal_block"); - public static final Block WRATH_CRYSTAL_SLAB = crystalSlab("wrath_crystal_slab"); - public static final Block WRATH_CRYSTAL_STAIRS = crystalStairs("wrath_crystal_stairs"); +// public static final Block SMALL_WRATH_CRYSTAL_CLUSTER = cluster("small_wrath_crystal_cluster", "small"); +// public static final Block MEDIUM_WRATH_CRYSTAL_CLUSTER = cluster("medium_wrath_crystal_cluster", "medium"); +// public static final Block WRATH_CRYSTAL_CLUSTER = cluster("wrath_crystal_cluster", "large"); +// +// public static final Block WRATH_CRYSTAL_GEODE = geode("wrath_crystal_geode", +// SMALL_WRATH_CRYSTAL_CLUSTER, +// MEDIUM_WRATH_CRYSTAL_CLUSTER, +// WRATH_CRYSTAL_CLUSTER +// ); +// +// public static final Block WRATH_CRYSTAL_BLOCK = crystalBlock("wrath_crystal_block"); +// public static final Block WRATH_CRYSTAL_SLAB = crystalSlab("wrath_crystal_slab"); +// public static final Block WRATH_CRYSTAL_STAIRS = crystalStairs("wrath_crystal_stairs"); public static final Block INCREMENTAL_CRYSTAL_LENS = lens("incremental_crystal_lens", LensEffects.INCREMENTAL); public static final Block LUNAR_CRYSTAL_LENS = lens("lunar_crystal_lens", LensEffects.LUNAR); public static final Block LIFE_CRYSTAL_LENS = lens("life_crystal_lens", LensEffects.LIFE); - public static final Block WRATH_CRYSTAL_LENS = lens("wrath_crystal_lens", LensEffects.WRATH); +// public static final Block WRATH_CRYSTAL_LENS = lens("wrath_crystal_lens", LensEffects.WRATH); public static final Block EMPTY_LENS = lens("empty_lens", LensEffects.EMPTY); + public static final Block LUNASTONE = add("lunastone", new BaseBlock(copyOf(Blocks.STONE))); + public static final Block LUNAR_PORTAL = add("lunar_portal", new LunarPortalBlock(copyOf(Blocks.STONE))); + public static final Block LUNAR_TRADING_PEDESTAL = add("lunar_trading_pedestal", new TradingPedestalBlock(copyOf(Blocks.STONE).nonOpaque().notSolid())); + public static final Block UPGRADING_PEDESTAL = add("upgrading_pedestal", new UpgradingPedestalBlock(copyOf(COBBLESTONE).luminance(state -> state.get(UpgradingPedestalBlock.CHARGES) * 3))); // public static final Block LUNAR_PEDESTAL = add("lunar_pedestal", new BaseBlock(copyOf(COBBLESTONE))); diff --git a/src/main/java/artifality/registry/ArtifalityDimensions.java b/src/main/java/artifality/registry/ArtifalityDimensions.java new file mode 100644 index 0000000..6aeda80 --- /dev/null +++ b/src/main/java/artifality/registry/ArtifalityDimensions.java @@ -0,0 +1,10 @@ +package artifality.registry; + +import artifality.ArtifalityMod; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.world.World; + +public class ArtifalityDimensions { + public static final RegistryKey LUNAR_BAZAAR = RegistryKey.of(RegistryKeys.WORLD, ArtifalityMod.id("lunar_bazaar")); +} diff --git a/src/main/java/artifality/registry/ArtifalityEvents.java b/src/main/java/artifality/registry/ArtifalityEvents.java index 75834f9..f1a714e 100644 --- a/src/main/java/artifality/registry/ArtifalityEvents.java +++ b/src/main/java/artifality/registry/ArtifalityEvents.java @@ -1,8 +1,70 @@ package artifality.registry; +import artifality.ArtifalityMod; +import artifality.extension.PlayerExtension; +import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.structure.StructurePlacementData; +import net.minecraft.structure.StructureTemplate; +import net.minecraft.util.ActionResult; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.BlockPos; + public class ArtifalityEvents { public static void init() { + + ServerLifecycleEvents.SERVER_STARTED.register(server -> { + var bazaar = server.getWorld(ArtifalityDimensions.LUNAR_BAZAAR); + + StructureTemplate structure = server.getStructureTemplateManager().getTemplateOrBlank(ArtifalityMod.id("lunar_bazaar")); + StructurePlacementData data = new StructurePlacementData().setMirror(BlockMirror.NONE).setIgnoreEntities(true); + structure.place(bazaar, new BlockPos(-32, 0, -32), new BlockPos(0, 0, 0), data, bazaar.getRandom(), Block.FORCE_STATE); + }); + + UseItemCallback.EVENT.register((player, world, hand) -> { + if (!player.isCreative() && world.getDimensionKey().getValue().equals(ArtifalityDimensions.LUNAR_BAZAAR.getValue())) { + return TypedActionResult.fail(ItemStack.EMPTY); + } + + return TypedActionResult.pass(ItemStack.EMPTY); + }); + + UseBlockCallback.EVENT.register((player, world, hand, res) -> { + if (!player.isCreative() && !player.getStackInHand(hand).isEmpty() && world.getDimensionKey().getValue().equals(ArtifalityDimensions.LUNAR_BAZAAR.getValue())) { + return ActionResult.FAIL; + } + + return ActionResult.PASS; + }); + + PlayerBlockBreakEvents.BEFORE.register((world, player, pos, state, blockEntity) -> { + if (!player.isCreative() && world.getDimensionKey().getValue().equals(ArtifalityDimensions.LUNAR_BAZAAR.getValue())) { + return false; + } + + return true; + }); + + ServerLivingEntityEvents.ALLOW_DEATH.register((entity, damageSource, damageAmount) -> { + if(entity instanceof ServerPlayerEntity player && player instanceof PlayerExtension ex) { + if (player.getWorld().getDimensionKey().getValue().equals(ArtifalityDimensions.LUNAR_BAZAAR.getValue())) { + player.setHealth(20F); + ex.teleportToPrevPosition(); + return false; + } + } + + return true; + }); + // ServerEntityCombatEvents.AFTER_KILLED_OTHER_ENTITY.register((world, entity, killedEntity) -> { // if (killedEntity instanceof ElementalExtension extension) { // if (world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT) && extension.artifality$isElemental()) { diff --git a/src/main/java/artifality/registry/ArtifalityItems.java b/src/main/java/artifality/registry/ArtifalityItems.java index 82e599b..deb05be 100644 --- a/src/main/java/artifality/registry/ArtifalityItems.java +++ b/src/main/java/artifality/registry/ArtifalityItems.java @@ -30,7 +30,7 @@ public class ArtifalityItems { public static final Item INCREMENTAL_CRYSTAL = add("incremental_crystal", new BaseItem(settings())); public static final Item LUNAR_CRYSTAL = add("lunar_crystal", new BaseItem(settings())); public static final Item LIFE_CRYSTAL = add("life_crystal", new BaseItem(settings())); - public static final Item WRATH_CRYSTAL = add("wrath_crystal", new BaseItem(settings())); +// public static final Item WRATH_CRYSTAL = add("wrath_crystal", new BaseItem(settings())); public static final Item INCREMENTAL_ORB = add("incremental_orb", new BaseItem(settings())); diff --git a/src/main/java/artifality/util/TooltipAppender.java b/src/main/java/artifality/util/TooltipAppender.java index b1cbb89..3eae9b9 100644 --- a/src/main/java/artifality/util/TooltipAppender.java +++ b/src/main/java/artifality/util/TooltipAppender.java @@ -31,10 +31,11 @@ public static void append(ItemStack stack, List tooltip) { if(!getTooltip(Registries.ITEM.getId(item).getPath()).isEmpty() && shiftPressed(tooltip, item)) { if(item instanceof ArtifactItem artifact) { - if(artifact.config.hasTiers) appendTier(stack, tooltip); + if(artifact.artifactSettings.hasTiers) appendTier(stack, tooltip); } appendItemTooltip(stack, tooltip); - }else if(item instanceof EnchantedBookItem) { + } + else if(item instanceof EnchantedBookItem) { if(!FabricLoader.getInstance().isModLoaded("enchdesc")) { appendEnchantmentTooltip(stack, tooltip); } @@ -44,18 +45,19 @@ public static void append(ItemStack stack, List tooltip) { private static boolean shiftPressed(List tooltip, Item item) { if(!Screen.hasShiftDown()) { if(item instanceof ArtifactItem artifact) { - ArtifactRarity rarity = artifact.config.rarity; - tooltip.add(Text.literal(ofKey(rarity.getName())).setStyle(Style.EMPTY.withColor(rarity.getColor().getRGB()))); +// ArtifactRarity rarity = artifact.artifactSettings.rarity; +// tooltip.add(Text.literal(ofKey(rarity.getName())).setStyle(Style.EMPTY.withColor(rarity.getColor().getRGB()))); } if(!(item instanceof EnchantedBookItem && FabricLoader.getInstance().isModLoaded("enchdesc"))) { tooltip.add(Text.literal("")); tooltip.add(Text.literal(ofKey("press_shift")).formatted(Formatting.GRAY)); } if(item instanceof ArtifactItem artifact) { - if(artifact.config.isTrinket) tooltip.add(Text.literal("")); + if(artifact.artifactSettings.isTrinket) tooltip.add(Text.literal("")); } return false; - }else{ + } + else { return true; } } @@ -77,7 +79,7 @@ private static void appendItemTooltip(ItemStack stack, List tooltip) { } if(stack.getItem() instanceof ArtifactItem artifact) { artifact.appendTooltipInfo(stack, tooltip); - if(artifact.config.isTrinket) tooltip.add(Text.literal("")); + if(artifact.artifactSettings.isTrinket) tooltip.add(Text.literal("")); } } diff --git a/src/main/resources/artifality.accesswidener b/src/main/resources/artifality.accesswidener new file mode 100644 index 0000000..22e331b --- /dev/null +++ b/src/main/resources/artifality.accesswidener @@ -0,0 +1 @@ +accessWidener v1 named \ No newline at end of file diff --git a/src/main/resources/assets/artifality/blockstates/incremental_crystal_block.json b/src/main/resources/assets/artifality/blockstates/incremental_crystal_block.json index 8e9ca0c..c5a8ff4 100644 --- a/src/main/resources/assets/artifality/blockstates/incremental_crystal_block.json +++ b/src/main/resources/assets/artifality/blockstates/incremental_crystal_block.json @@ -1,6 +1,5 @@ { "variants": { - "": { "model": "artifality:block/incremental_crystal_block" - } + "": { "model": "artifality:block/incremental_crystal_block" } } } \ No newline at end of file diff --git a/src/main/resources/assets/artifality/blockstates/lunastone.json b/src/main/resources/assets/artifality/blockstates/lunastone.json new file mode 100644 index 0000000..347ab04 --- /dev/null +++ b/src/main/resources/assets/artifality/blockstates/lunastone.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "artifality:block/lunastone" }, + { "model": "artifality:block/lunastone_2" } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/artifality/models/block/lunastone.json b/src/main/resources/assets/artifality/models/block/lunastone.json new file mode 100644 index 0000000..606289d --- /dev/null +++ b/src/main/resources/assets/artifality/models/block/lunastone.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "artifality:block/lunastone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/artifality/models/block/lunastone_2.json b/src/main/resources/assets/artifality/models/block/lunastone_2.json new file mode 100644 index 0000000..3c5637d --- /dev/null +++ b/src/main/resources/assets/artifality/models/block/lunastone_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "artifality:block/lunastone_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/artifality/models/item/lunastone.json b/src/main/resources/assets/artifality/models/item/lunastone.json new file mode 100644 index 0000000..cd95102 --- /dev/null +++ b/src/main/resources/assets/artifality/models/item/lunastone.json @@ -0,0 +1,3 @@ +{ + "parent": "artifality:block/lunastone" +} \ No newline at end of file diff --git a/src/main/resources/assets/artifality/textures/block/lunastone.png b/src/main/resources/assets/artifality/textures/block/lunastone.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff2a9bee3e988278857be51a02b7b630a0c89c4 GIT binary patch literal 504 zcmVPx$vPnciR5*=olfP=)P!xwhrz%FJ!cs^s;${d&OAV$&izpc~rF6-V7s#7*=}Yw) zJQy+rfrcQA+H!jl0$I@3EhKdZbFQyUf0IDx&+mNqoYC#|$1OlvElDPdFHJ=>j<~wK z!5D+cwl!Vf0FX=+UEeUvasmmMWjSTFBpOE~69s_Q8USMqD_anUidmKeke-}l+j>_( z0?P`QEZxg$$$HZal6^-(SuKGa+t$po9IZ8X_Y0ROl5c5d+Zuq;`**inna%I8E4)vf zrgOT!A(<%BlXDmMEQ!)j68QXR%*z)s0H?=ioF1R?t$A?C0KfnIPx$g-Jv~R5*=gQ@v_~P!#?QLdYOS2qG>)Tp~y*4N@{>O6igzFOWCsqx2a%cIgXr z$SOFA*x_;!!8m2KL-=lw_H6gwbH1N*&b7|Rw*df(@&eEG@za!W<_-?~6O>Y5=(a}J zHvj<7_0jbWk~o9Sge1;TlovR22cGK#0KzZ?04SwU=^V?2k0j0j0KsYv-PU&iCKe@3 zG1-gqg6pjr6-!0dcJn$UaR%MiczW1DDTVL+6Ec+KJ{>l;Ktic04r*(8w`X1s`k6iJ+!g08>&4#Uv&h|QBR>-uKIuG<=(>l>zz zuXiY=MnKZC6|Wx$Dv%FMl;G?K-vMC8hhVkFVSmD5e;To{NCs_GI=}A$S(H-HZ9Qr# z0hS9N*IR>KdK}rYwwu>sDvKkGg7lwf8I{gq%Q125$S6m=OOK|>(w_MXx~)xd6r{!{ zE%CDvkWIIlz`0An>FP>*+*qSPHjc^s(voBf_zO(w<=1Kqn002ovPDHLkV1l`0 B&sP8d literal 0 HcmV?d00001 diff --git a/src/main/resources/data/artifality/advancements/gather_all_crystals.json b/src/main/resources/data/artifality/advancements/gather_all_crystals.json index 6f5d949..d6e6fea 100644 --- a/src/main/resources/data/artifality/advancements/gather_all_crystals.json +++ b/src/main/resources/data/artifality/advancements/gather_all_crystals.json @@ -50,18 +50,6 @@ } ] } - }, - "wrath_crystal": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": [ - "artifality:wrath_crystal" - ] - } - ] - } } }, "parent": "artifality:gather_crystal" diff --git a/src/main/resources/data/artifality/advancements/positive_vision.json b/src/main/resources/data/artifality/advancements/positive_vision.json index 1a8dc20..b5df81a 100644 --- a/src/main/resources/data/artifality/advancements/positive_vision.json +++ b/src/main/resources/data/artifality/advancements/positive_vision.json @@ -50,18 +50,6 @@ } ] } - }, - "wrath_crystal_lens": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": [ - "artifality:wrath_crystal_lens" - ] - } - ] - } } }, "parent": "artifality:negative_vision" diff --git a/src/main/resources/data/artifality/dimension/lunar_bazaar.json b/src/main/resources/data/artifality/dimension/lunar_bazaar.json new file mode 100644 index 0000000..5634c40 --- /dev/null +++ b/src/main/resources/data/artifality/dimension/lunar_bazaar.json @@ -0,0 +1,23 @@ +{ + "type": "artifality:lunar_bazaar", + "generator": { + "type": "minecraft:flat", + "settings": { + "layers": [ + { + "height": 64, + "block": "minecraft:air" + }, + { + "height": 1, + "block": "minecraft:bedrock" + } + ], + "biome": "artifality:lunar_void" + }, + "biome_source": { + "type": "minecraft:fixed", + "biome": "artifality:lunar_void" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/artifality/dimension_type/lunar_bazaar.json b/src/main/resources/data/artifality/dimension_type/lunar_bazaar.json new file mode 100644 index 0000000..bb7efde --- /dev/null +++ b/src/main/resources/data/artifality/dimension_type/lunar_bazaar.json @@ -0,0 +1,20 @@ +{ + "ambient_light": 0.05, + "bed_works": false, + "respawn_anchor_works": false, + "coordinate_scale": 1.0, + "has_ceiling": false, + "has_raids": false, + "has_skylight": false, + "effects": "minecraft:the_nether", + "fixed_time": 6000, + "min_y": 0, + "height": 256, + "logical_height": 256, + "infiniburn": "#minecraft:infiniburn_overworld", + "monster_spawn_block_light_limit": 15, + "monster_spawn_light_level": 0, + "natural": false, + "piglin_safe": true, + "ultrawarm": false +} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/medium_wrath_crystal_cluster.json b/src/main/resources/data/artifality/loot_tables/blocks/medium_wrath_crystal_cluster.json deleted file mode 100644 index 1c101f4..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/medium_wrath_crystal_cluster.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ], - "name": "artifality:medium_wrath_crystal_cluster" - }, - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:set_count", - "count": 2.0, - "add": false - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "name": "artifality:wrath_crystal" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/small_wrath_crystal_cluster.json b/src/main/resources/data/artifality/loot_tables/blocks/small_wrath_crystal_cluster.json deleted file mode 100644 index 1075314..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/small_wrath_crystal_cluster.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ], - "name": "artifality:small_wrath_crystal_cluster" - }, - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "name": "artifality:wrath_crystal" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_block.json b/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_block.json deleted file mode 100644 index 159658a..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_block.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "artifality:wrath_crystal_block" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_cluster.json b/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_cluster.json deleted file mode 100644 index a5510cf..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_cluster.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ], - "name": "artifality:wrath_crystal_cluster" - }, - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:set_count", - "count": 3.0, - "add": false - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "name": "artifality:wrath_crystal" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_lens.json b/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_lens.json deleted file mode 100644 index 7ed131e..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_lens.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "artifality:wrath_crystal_lens" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_slab.json b/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_slab.json deleted file mode 100644 index 676176e..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_slab.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1.0, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:set_count", - "conditions": [ - { - "condition": "minecraft:block_state_property", - "block": "artifality:wrath_crystal_slab", - "properties": { - "type": "double" - } - } - ], - "count": 2.0, - "add": false - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "artifality:wrath_crystal_slab" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_stairs.json b/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_stairs.json deleted file mode 100644 index a26ef85..0000000 --- a/src/main/resources/data/artifality/loot_tables/blocks/wrath_crystal_stairs.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "artifality:wrath_crystal_stairs" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal.json b/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal.json deleted file mode 100644 index dd6e893..0000000 --- a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "artifality:wrath_crystal_block" - } - ], - "result": { - "item": "artifality:wrath_crystal", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_block.json b/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_block.json deleted file mode 100644 index 3a26358..0000000 --- a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_block.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "##", - "##" - ], - "key": { - "#": { - "item": "artifality:wrath_crystal" - } - }, - "result": { - "item": "artifality:wrath_crystal_block", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_lens.json b/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_lens.json deleted file mode 100644 index c5c444b..0000000 --- a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_lens.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "nWn", - "WWW", - "nWn" - ], - "key": { - "n": { - "item": "minecraft:netherite_ingot" - }, - "W": { - "item": "artifality:wrath_crystal_block" - } - }, - "result": { - "item": "artifality:wrath_crystal_lens", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_slab.json b/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_slab.json deleted file mode 100644 index 4851476..0000000 --- a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###" - ], - "key": { - "#": { - "item": "artifality:wrath_crystal_block" - } - }, - "result": { - "item": "artifality:wrath_crystal_slab", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_stairs.json b/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_stairs.json deleted file mode 100644 index 140f7ee..0000000 --- a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_crystal_stairs.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "# ", - "## ", - "###" - ], - "key": { - "#": { - "item": "artifality:wrath_crystal_block" - } - }, - "result": { - "item": "artifality:wrath_crystal_stairs", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_orb.json b/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_orb.json deleted file mode 100644 index 0df055d..0000000 --- a/src/main/resources/data/artifality/loot_tables/recipes/item/wrath_orb.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - " # ", - "###", - " # " - ], - "key": { - "#": { - "item": "artifality:wrath_crystal" - } - }, - "result": { - "item": "artifality:wrath_orb", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/recipes/item/wrath_crystal_lens.json b/src/main/resources/data/artifality/recipes/item/wrath_crystal_lens.json deleted file mode 100644 index bf26b51..0000000 --- a/src/main/resources/data/artifality/recipes/item/wrath_crystal_lens.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "NCN", - "CCC", - "NCN" - ], - "key": { - "N": { - "item": "minecraft:netherite_ingot" - }, - "C": { - "item": "artifality:wrath_crystal_block" - } - }, - "result": { - "item": "artifality:wrath_crystal_lens", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/artifality/structures/lunar_bazaar.nbt b/src/main/resources/data/artifality/structures/lunar_bazaar.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e685131dc7b98f8902df4807ad4480745ff0dd45 GIT binary patch literal 1575205 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

^*x)4ACB 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 o4;1A{oxI_J^Of