Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1.21.x] Lights Out Room Upgrade #599

Open
wants to merge 2 commits into
base: 1.21.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -48,7 +49,7 @@ public interface CMRegistries {

DeferredRegister<AttachmentType<?>> 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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<BreakableWallBlock> BREAKABLE_WALL = CMRegistries.BLOCKS.register("wall", () ->
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Block, BlockState> 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;
// }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
));
}
}
}
});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -28,6 +32,12 @@ public interface RoomUpgrades {
.itemPredicate(stack -> stack.is(ItemTags.AXES))
.build());

DeferredHolder<RoomUpgradeType<?>, RoomUpgradeType<LightsOutUpgrade>> 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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<LightsOutUpgrade> CODEC = MapCodec.unit(LightsOutUpgrade::new);

@Override
public RoomUpgradeType<?> getType() {
return RoomUpgrades.LIGHTS_OUT_UPGRADE.get();
}

@Override
public Stream<RoomUpgradeEvent> 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<Component> tooltipAdder, TooltipFlag tooltipFlag) {
tooltipAdder.accept(
Component.literal(
"Lights Out Upgrade"
)
);
}
}