diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/CMRegistries.java b/neoforge-main/src/main/java/dev/compactmods/machines/CMRegistries.java index 00a473cf..ab950c87 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/CMRegistries.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/CMRegistries.java @@ -5,6 +5,7 @@ import dev.compactmods.machines.shrinking.Shrinking; import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.inventory.MenuType; @@ -48,7 +49,7 @@ public interface CMRegistries { DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, CompactMachines.MOD_ID); - DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(CompactMachines.MOD_ID); + DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, CompactMachines.MOD_ID); static Item basicItem() { return new Item(new Item.Properties()); diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/Rooms.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/Rooms.java index a4cd725c..b21bf04a 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/room/Rooms.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/Rooms.java @@ -39,7 +39,7 @@ interface Blocks { new SolidWallBlock(BlockBehaviour.Properties.of() .strength(-1.0F, 3600000.8F) .sound(SoundType.METAL) - .lightLevel((state) -> 15))); + .lightLevel((state) -> state.getValue(SolidWallBlock.LIGHTS_ON) ? 15 : 0))); DeferredBlock BREAKABLE_WALL = CMRegistries.BLOCKS.register("wall", () -> diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/block/SolidWallBlock.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/block/SolidWallBlock.java index 4933a02b..c0994a5f 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/room/block/SolidWallBlock.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/block/SolidWallBlock.java @@ -1,11 +1,31 @@ package dev.compactmods.machines.room.block; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + public class SolidWallBlock extends ProtectedWallBlock { + + public static final BooleanProperty LIGHTS_ON = BooleanProperty.create("lights_on"); + public SolidWallBlock(Properties props) { super(props); + this.registerDefaultState( + this.stateDefinition + .any() + .setValue(LIGHTS_ON, true) + ); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add( + LIGHTS_ON + ); } -// @Override + // @Override // public boolean isValidSpawn(BlockState state, BlockGetter world, BlockPos pos, SpawnPlacements.Type type, EntityType entityType) { // return pos.getY() == 40; // } diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/ui/upgrades/RoomUpgradeMenu.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/ui/upgrades/RoomUpgradeMenu.java index 749cac1d..bcbad207 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/room/ui/upgrades/RoomUpgradeMenu.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/ui/upgrades/RoomUpgradeMenu.java @@ -2,17 +2,25 @@ import dev.compactmods.machines.api.CompactMachines; import dev.compactmods.machines.api.room.RoomInstance; +import dev.compactmods.machines.api.room.upgrade.RoomUpgrade; +import dev.compactmods.machines.api.room.upgrade.events.RoomUpgradeEvent; +import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeAppliedEventListener; +import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeRemovedEventListener; import dev.compactmods.machines.client.render.ConditionalGhostSlot; +import dev.compactmods.machines.machine.Machines; import dev.compactmods.machines.room.Rooms; import dev.compactmods.machines.room.upgrade.RoomUpgradeInventory; +import dev.compactmods.machines.room.upgrade.RoomUpgrades; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.attachment.IAttachmentHolder; import net.neoforged.neoforge.items.SlotItemHandler; import org.jetbrains.annotations.NotNull; @@ -36,7 +44,45 @@ protected RoomUpgradeMenu(int winId, Inventory playerInv, String roomCode, RoomU public void onTake(Player pPlayer, ItemStack pStack) { // TODO: Room Upgrade removal event super.onTake(pPlayer, pStack); + if (!playerInv.player.level().isClientSide()) { + if (!pStack.has(RoomUpgrades.UPGRADE_LIST_COMPONENT)) return; + var list = pStack.get(RoomUpgrades.UPGRADE_LIST_COMPONENT); + if (list != null) { + list.upgrades() + .stream() + .flatMap(RoomUpgrade::gatherEvents) + .filter(UpgradeRemovedEventListener.class::isInstance) + .map(UpgradeRemovedEventListener.class::cast) + .forEach(upgrade -> upgrade.handle( + (ServerLevel) playerInv.player.level(), + CompactMachines.room(roomCode).get(), + pStack + )); + } + } } + + @Override + public void set(ItemStack pStack) { + super.set(pStack); + // TODO: Room Upgrade Add Event + if (!playerInv.player.level().isClientSide()) { + if (!pStack.has(RoomUpgrades.UPGRADE_LIST_COMPONENT)) return; + var list = pStack.get(RoomUpgrades.UPGRADE_LIST_COMPONENT); + if (list != null) { + list.upgrades() + .stream() + .flatMap(RoomUpgrade::gatherEvents) + .filter(UpgradeAppliedEventListener.class::isInstance) + .map(UpgradeAppliedEventListener.class::cast) + .forEach(upgrade -> upgrade.handle( + (ServerLevel) playerInv.player.level(), + CompactMachines.room(roomCode).get(), + pStack + )); + } + } + } }); } diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgrades.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgrades.java index 38576351..61c82cd0 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgrades.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgrades.java @@ -1,13 +1,17 @@ package dev.compactmods.machines.room.upgrade; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import dev.compactmods.machines.CMRegistries; import dev.compactmods.machines.api.CompactMachines; import dev.compactmods.machines.api.room.upgrade.RoomUpgradeType; import dev.compactmods.machines.api.room.upgrade.components.RoomUpgradeList; import dev.compactmods.machines.feature.CMFeatureFlags; +import dev.compactmods.machines.room.upgrade.example.LightsOutUpgrade; import dev.compactmods.machines.room.upgrade.example.TreeCutterUpgrade; import net.minecraft.core.component.DataComponentType; import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.Items; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.registries.DeferredHolder; @@ -28,6 +32,12 @@ public interface RoomUpgrades { .itemPredicate(stack -> stack.is(ItemTags.AXES)) .build()); + DeferredHolder, RoomUpgradeType> LIGHTS_OUT_UPGRADE = ROOM_UPGRADE_DEFINITIONS + .register("lights_out", () -> RoomUpgradeType.builder(LightsOutUpgrade::new, LightsOutUpgrade.CODEC) + .requiredFeatures(CMFeatureFlags.ROOM_UPGRADES) + .itemPredicate(stack -> stack.is(Items.REDSTONE_LAMP) || stack.is(Items.COPPER_BULB)) + .build()); + static void prepare() { ROOM_UPGRADE_DEFINITIONS.makeRegistry(builder -> { builder.sync(true); diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/LightsOutUpgrade.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/LightsOutUpgrade.java new file mode 100644 index 00000000..376496d7 --- /dev/null +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/LightsOutUpgrade.java @@ -0,0 +1,92 @@ +package dev.compactmods.machines.room.upgrade.example; + +import com.mojang.serialization.MapCodec; +import dev.compactmods.machines.api.CompactMachines; +import dev.compactmods.machines.api.dimension.CompactDimension; +import dev.compactmods.machines.api.room.RoomInstance; +import dev.compactmods.machines.api.room.upgrade.RoomUpgrade; +import dev.compactmods.machines.api.room.upgrade.RoomUpgradeType; +import dev.compactmods.machines.api.room.upgrade.events.RoomUpgradeEvent; +import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeAppliedEventListener; +import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeRemovedEventListener; +import dev.compactmods.machines.dimension.Dimension; +import dev.compactmods.machines.machine.Machines; +import dev.compactmods.machines.room.Rooms; +import dev.compactmods.machines.room.block.SolidWallBlock; +import dev.compactmods.machines.room.upgrade.RoomUpgrades; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; + +import java.util.function.Consumer; +import java.util.stream.Stream; + +public class LightsOutUpgrade implements RoomUpgrade { + public static final MapCodec CODEC = MapCodec.unit(LightsOutUpgrade::new); + + @Override + public RoomUpgradeType getType() { + return RoomUpgrades.LIGHTS_OUT_UPGRADE.get(); + } + + @Override + public Stream gatherEvents() { + final UpgradeRemovedEventListener removedEventListener = LightsOutUpgrade::lightsEventOn; + final UpgradeAppliedEventListener addedEventListener = LightsOutUpgrade::lightsEventOff; + return Stream.of( + removedEventListener, + addedEventListener + ); + } + + public static void lightsEventOn(ServerLevel level, RoomInstance room, ItemStack upgrade) { + // TURN ON LIGHTS + var outer = room.boundaries().outerBounds(); + + final var everythingLoaded = room.boundaries() + .innerChunkPositions() + .allMatch(cp -> level.shouldTickBlocksAt(cp.toLong())); + + // TODO - Implement upgrade cooldowns (i.e. retry in 100 ticks if room isn't loaded) + if (!everythingLoaded) return; + + ServerLevel machineLevel = level.getServer().getLevel(CompactDimension.LEVEL_KEY); + BlockPos.betweenClosedStream(outer) + .filter(pos -> machineLevel.getBlockState(pos).is(Rooms.Blocks.SOLID_WALL)) + .forEach(pos -> + machineLevel.setBlock(pos, Rooms.Blocks.SOLID_WALL.get().defaultBlockState().setValue(SolidWallBlock.LIGHTS_ON, true), 3) + ); + } + + public static void lightsEventOff(ServerLevel level, RoomInstance room, ItemStack upgrade) { + // TURN OFF LIGHTS + + var outer = room.boundaries().outerBounds(); + + final var everythingLoaded = room.boundaries() + .innerChunkPositions() + .allMatch(cp -> level.shouldTickBlocksAt(cp.toLong())); + + // TODO - Implement upgrade cooldowns (i.e. retry in 100 ticks if room isn't loaded) + if (!everythingLoaded) return; + + ServerLevel machineLevel = level.getServer().getLevel(CompactDimension.LEVEL_KEY); + BlockPos.betweenClosedStream(outer) + .filter(pos -> machineLevel.getBlockState(pos).is(Rooms.Blocks.SOLID_WALL)) + .forEach(pos -> + machineLevel.setBlock(pos, Rooms.Blocks.SOLID_WALL.get().defaultBlockState().setValue(SolidWallBlock.LIGHTS_ON, false), 3) + ); + } + + @Override + public void addToTooltip(Item.TooltipContext context, Consumer tooltipAdder, TooltipFlag tooltipFlag) { + tooltipAdder.accept( + Component.literal( + "Lights Out Upgrade" + ) + ); + } +}