Skip to content

Commit de975b2

Browse files
committed
Lights out Commit
1 parent 7a02aa4 commit de975b2

File tree

6 files changed

+169
-3
lines changed

6 files changed

+169
-3
lines changed

neoforge-main/src/main/java/dev/compactmods/machines/CMRegistries.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import dev.compactmods.machines.shrinking.Shrinking;
66
import net.minecraft.commands.synchronization.ArgumentTypeInfo;
77
import net.minecraft.core.registries.BuiltInRegistries;
8+
import net.minecraft.core.registries.Registries;
89
import net.minecraft.world.entity.ai.village.poi.PoiType;
910
import net.minecraft.world.entity.npc.VillagerProfession;
1011
import net.minecraft.world.inventory.MenuType;
@@ -48,7 +49,7 @@ public interface CMRegistries {
4849

4950
DeferredRegister<AttachmentType<?>> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, CompactMachines.MOD_ID);
5051

51-
DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(CompactMachines.MOD_ID);
52+
DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, CompactMachines.MOD_ID);
5253

5354
static Item basicItem() {
5455
return new Item(new Item.Properties());

neoforge-main/src/main/java/dev/compactmods/machines/room/Rooms.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ interface Blocks {
3939
new SolidWallBlock(BlockBehaviour.Properties.of()
4040
.strength(-1.0F, 3600000.8F)
4141
.sound(SoundType.METAL)
42-
.lightLevel((state) -> 15)));
42+
.lightLevel((state) -> state.getValue(SolidWallBlock.LIGHTS_ON) ? 15 : 0)));
4343

4444

4545
DeferredBlock<BreakableWallBlock> BREAKABLE_WALL = CMRegistries.BLOCKS.register("wall", () ->

neoforge-main/src/main/java/dev/compactmods/machines/room/block/SolidWallBlock.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,31 @@
11
package dev.compactmods.machines.room.block;
22

3+
import net.minecraft.world.level.block.Block;
4+
import net.minecraft.world.level.block.state.BlockState;
5+
import net.minecraft.world.level.block.state.StateDefinition;
6+
import net.minecraft.world.level.block.state.properties.BooleanProperty;
7+
38
public class SolidWallBlock extends ProtectedWallBlock {
9+
10+
public static final BooleanProperty LIGHTS_ON = BooleanProperty.create("lights_on");
11+
412
public SolidWallBlock(Properties props) {
513
super(props);
14+
this.registerDefaultState(
15+
this.stateDefinition
16+
.any()
17+
.setValue(LIGHTS_ON, true)
18+
);
19+
}
20+
21+
@Override
22+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
23+
builder.add(
24+
LIGHTS_ON
25+
);
626
}
727

8-
// @Override
28+
// @Override
929
// public boolean isValidSpawn(BlockState state, BlockGetter world, BlockPos pos, SpawnPlacements.Type type, EntityType<?> entityType) {
1030
// return pos.getY() == 40;
1131
// }

neoforge-main/src/main/java/dev/compactmods/machines/room/ui/upgrades/RoomUpgradeMenu.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,25 @@
22

33
import dev.compactmods.machines.api.CompactMachines;
44
import dev.compactmods.machines.api.room.RoomInstance;
5+
import dev.compactmods.machines.api.room.upgrade.RoomUpgrade;
6+
import dev.compactmods.machines.api.room.upgrade.events.RoomUpgradeEvent;
7+
import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeAppliedEventListener;
8+
import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeRemovedEventListener;
59
import dev.compactmods.machines.client.render.ConditionalGhostSlot;
10+
import dev.compactmods.machines.machine.Machines;
611
import dev.compactmods.machines.room.Rooms;
712
import dev.compactmods.machines.room.upgrade.RoomUpgradeInventory;
13+
import dev.compactmods.machines.room.upgrade.RoomUpgrades;
814
import net.minecraft.network.FriendlyByteBuf;
915
import net.minecraft.network.chat.Component;
16+
import net.minecraft.server.level.ServerLevel;
1017
import net.minecraft.world.MenuProvider;
1118
import net.minecraft.world.entity.player.Inventory;
1219
import net.minecraft.world.entity.player.Player;
1320
import net.minecraft.world.inventory.AbstractContainerMenu;
1421
import net.minecraft.world.inventory.ClickType;
1522
import net.minecraft.world.item.ItemStack;
23+
import net.neoforged.neoforge.attachment.IAttachmentHolder;
1624
import net.neoforged.neoforge.items.SlotItemHandler;
1725
import org.jetbrains.annotations.NotNull;
1826

@@ -36,7 +44,45 @@ protected RoomUpgradeMenu(int winId, Inventory playerInv, String roomCode, RoomU
3644
public void onTake(Player pPlayer, ItemStack pStack) {
3745
// TODO: Room Upgrade removal event
3846
super.onTake(pPlayer, pStack);
47+
if (!playerInv.player.level().isClientSide()) {
48+
if (!pStack.has(RoomUpgrades.UPGRADE_LIST_COMPONENT)) return;
49+
var list = pStack.get(RoomUpgrades.UPGRADE_LIST_COMPONENT);
50+
if (list != null) {
51+
list.upgrades()
52+
.stream()
53+
.flatMap(RoomUpgrade::gatherEvents)
54+
.filter(UpgradeRemovedEventListener.class::isInstance)
55+
.map(UpgradeRemovedEventListener.class::cast)
56+
.forEach(upgrade -> upgrade.handle(
57+
(ServerLevel) playerInv.player.level(),
58+
CompactMachines.room(roomCode).get(),
59+
pStack
60+
));
61+
}
62+
}
3963
}
64+
65+
@Override
66+
public void set(ItemStack pStack) {
67+
super.set(pStack);
68+
// TODO: Room Upgrade Add Event
69+
if (!playerInv.player.level().isClientSide()) {
70+
if (!pStack.has(RoomUpgrades.UPGRADE_LIST_COMPONENT)) return;
71+
var list = pStack.get(RoomUpgrades.UPGRADE_LIST_COMPONENT);
72+
if (list != null) {
73+
list.upgrades()
74+
.stream()
75+
.flatMap(RoomUpgrade::gatherEvents)
76+
.filter(UpgradeAppliedEventListener.class::isInstance)
77+
.map(UpgradeAppliedEventListener.class::cast)
78+
.forEach(upgrade -> upgrade.handle(
79+
(ServerLevel) playerInv.player.level(),
80+
CompactMachines.room(roomCode).get(),
81+
pStack
82+
));
83+
}
84+
}
85+
}
4086
});
4187
}
4288

neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgrades.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package dev.compactmods.machines.room.upgrade;
22

3+
import com.mojang.serialization.Codec;
4+
import com.mojang.serialization.MapCodec;
35
import dev.compactmods.machines.CMRegistries;
46
import dev.compactmods.machines.api.CompactMachines;
57
import dev.compactmods.machines.api.room.upgrade.RoomUpgradeType;
68
import dev.compactmods.machines.api.room.upgrade.components.RoomUpgradeList;
79
import dev.compactmods.machines.feature.CMFeatureFlags;
10+
import dev.compactmods.machines.room.upgrade.example.LightsOutUpgrade;
811
import dev.compactmods.machines.room.upgrade.example.TreeCutterUpgrade;
912
import net.minecraft.core.component.DataComponentType;
1013
import net.minecraft.tags.ItemTags;
14+
import net.minecraft.world.item.Items;
1115
import net.neoforged.bus.api.IEventBus;
1216
import net.neoforged.neoforge.common.NeoForge;
1317
import net.neoforged.neoforge.registries.DeferredHolder;
@@ -28,6 +32,12 @@ public interface RoomUpgrades {
2832
.itemPredicate(stack -> stack.is(ItemTags.AXES))
2933
.build());
3034

35+
DeferredHolder<RoomUpgradeType<?>, RoomUpgradeType<LightsOutUpgrade>> LIGHTS_OUT_UPGRADE = ROOM_UPGRADE_DEFINITIONS
36+
.register("lights_out", () -> RoomUpgradeType.builder(LightsOutUpgrade::new, MapCodec.unit(LightsOutUpgrade::new))
37+
.requiredFeatures(CMFeatureFlags.ROOM_UPGRADES)
38+
.itemPredicate(stack -> stack.is(Items.REDSTONE_LAMP) || stack.is(Items.COPPER_BULB))
39+
.build());
40+
3141
static void prepare() {
3242
ROOM_UPGRADE_DEFINITIONS.makeRegistry(builder -> {
3343
builder.sync(true);
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package dev.compactmods.machines.room.upgrade.example;
2+
3+
import dev.compactmods.machines.api.CompactMachines;
4+
import dev.compactmods.machines.api.dimension.CompactDimension;
5+
import dev.compactmods.machines.api.room.RoomInstance;
6+
import dev.compactmods.machines.api.room.upgrade.RoomUpgrade;
7+
import dev.compactmods.machines.api.room.upgrade.RoomUpgradeType;
8+
import dev.compactmods.machines.api.room.upgrade.events.RoomUpgradeEvent;
9+
import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeAppliedEventListener;
10+
import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeRemovedEventListener;
11+
import dev.compactmods.machines.dimension.Dimension;
12+
import dev.compactmods.machines.machine.Machines;
13+
import dev.compactmods.machines.room.Rooms;
14+
import dev.compactmods.machines.room.block.SolidWallBlock;
15+
import dev.compactmods.machines.room.upgrade.RoomUpgrades;
16+
import net.minecraft.core.BlockPos;
17+
import net.minecraft.network.chat.Component;
18+
import net.minecraft.server.level.ServerLevel;
19+
import net.minecraft.world.item.Item;
20+
import net.minecraft.world.item.ItemStack;
21+
import net.minecraft.world.item.TooltipFlag;
22+
23+
import java.util.function.Consumer;
24+
import java.util.stream.Stream;
25+
26+
public class LightsOutUpgrade implements RoomUpgrade {
27+
@Override
28+
public RoomUpgradeType<?> getType() {
29+
return RoomUpgrades.LIGHTS_OUT_UPGRADE.get();
30+
}
31+
32+
@Override
33+
public Stream<RoomUpgradeEvent> gatherEvents() {
34+
final UpgradeRemovedEventListener removedEventListener = LightsOutUpgrade::lightsEventOn;
35+
final UpgradeAppliedEventListener addedEventListener = LightsOutUpgrade::lightsEventOff;
36+
return Stream.of(
37+
removedEventListener,
38+
addedEventListener
39+
);
40+
}
41+
42+
public static void lightsEventOn(ServerLevel level, RoomInstance room, ItemStack upgrade) {
43+
// TURN ON LIGHTS
44+
var outer = room.boundaries().outerBounds();
45+
46+
final var everythingLoaded = room.boundaries()
47+
.innerChunkPositions()
48+
.allMatch(cp -> level.shouldTickBlocksAt(cp.toLong()));
49+
50+
// TODO - Implement upgrade cooldowns (i.e. retry in 100 ticks if room isn't loaded)
51+
if (!everythingLoaded) return;
52+
53+
ServerLevel machineLevel = level.getServer().getLevel(CompactDimension.LEVEL_KEY);
54+
BlockPos.betweenClosedStream(outer)
55+
.filter(pos -> machineLevel.getBlockState(pos).is(Rooms.Blocks.SOLID_WALL))
56+
.forEach(pos ->
57+
machineLevel.setBlock(pos, Rooms.Blocks.SOLID_WALL.get().defaultBlockState().setValue(SolidWallBlock.LIGHTS_ON, true), 3)
58+
);
59+
}
60+
61+
public static void lightsEventOff(ServerLevel level, RoomInstance room, ItemStack upgrade) {
62+
// TURN OFF LIGHTS
63+
64+
var outer = room.boundaries().outerBounds();
65+
66+
final var everythingLoaded = room.boundaries()
67+
.innerChunkPositions()
68+
.allMatch(cp -> level.shouldTickBlocksAt(cp.toLong()));
69+
70+
// TODO - Implement upgrade cooldowns (i.e. retry in 100 ticks if room isn't loaded)
71+
if (!everythingLoaded) return;
72+
73+
ServerLevel machineLevel = level.getServer().getLevel(CompactDimension.LEVEL_KEY);
74+
BlockPos.betweenClosedStream(outer)
75+
.filter(pos -> machineLevel.getBlockState(pos).is(Rooms.Blocks.SOLID_WALL))
76+
.forEach(pos ->
77+
machineLevel.setBlock(pos, Rooms.Blocks.SOLID_WALL.get().defaultBlockState().setValue(SolidWallBlock.LIGHTS_ON, false), 3)
78+
);
79+
}
80+
81+
@Override
82+
public void addToTooltip(Item.TooltipContext context, Consumer<Component> tooltipAdder, TooltipFlag tooltipFlag) {
83+
tooltipAdder.accept(
84+
Component.literal(
85+
"Lights Out Upgrade"
86+
)
87+
);
88+
}
89+
}

0 commit comments

Comments
 (0)