Skip to content

Commit d7a2a17

Browse files
committed
Add server-level support for machine breakability config
1 parent 500b2e1 commit d7a2a17

File tree

6 files changed

+113
-4
lines changed

6 files changed

+113
-4
lines changed

src/main/java/com/robotgryphon/compactmachines/CompactMachines.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.robotgryphon.compactmachines.compat.theoneprobe.TheOneProbeCompat;
44
import com.robotgryphon.compactmachines.config.CommonConfig;
55
import com.robotgryphon.compactmachines.config.EnableVanillaRecipesConfigCondition;
6+
import com.robotgryphon.compactmachines.config.ServerConfig;
67
import com.robotgryphon.compactmachines.core.Registration;
78
import com.robotgryphon.compactmachines.network.NetworkHandler;
89
import net.minecraft.item.ItemGroup;
@@ -56,6 +57,7 @@ public CompactMachines() {
5657

5758
ModLoadingContext mlCtx = ModLoadingContext.get();
5859
mlCtx.registerConfig(ModConfig.Type.COMMON, CommonConfig.CONFIG);
60+
mlCtx.registerConfig(ModConfig.Type.SERVER, ServerConfig.CONFIG);
5961

6062
CraftingHelper.register(EnableVanillaRecipesConfigCondition.Serializer.INSTANCE);
6163
}

src/main/java/com/robotgryphon/compactmachines/block/BlockCompactMachine.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import com.robotgryphon.compactmachines.compat.theoneprobe.providers.CompactMachineProvider;
55
import com.robotgryphon.compactmachines.compat.theoneprobe.IProbeData;
66
import com.robotgryphon.compactmachines.compat.theoneprobe.IProbeDataProvider;
7+
import com.robotgryphon.compactmachines.config.CommonConfig;
8+
import com.robotgryphon.compactmachines.config.ServerConfig;
9+
import com.robotgryphon.compactmachines.core.EnumMachinePlayersBreakHandling;
710
import com.robotgryphon.compactmachines.core.Registration;
811
import com.robotgryphon.compactmachines.reference.EnumMachineSize;
912
import com.robotgryphon.compactmachines.reference.Reference;
@@ -29,6 +32,8 @@
2932
import net.minecraft.world.server.ServerWorld;
3033

3134
import javax.annotation.Nullable;
35+
import java.util.Optional;
36+
import java.util.UUID;
3237

3338
public class BlockCompactMachine extends Block implements IProbeDataProvider {
3439

@@ -42,14 +47,34 @@ public BlockCompactMachine(EnumMachineSize size, Block.Properties props) {
4247
@Override
4348
public float getPlayerRelativeBlockHardness(BlockState state, PlayerEntity player, IBlockReader worldIn, BlockPos pos) {
4449
CompactMachineTile tile = (CompactMachineTile) worldIn.getTileEntity(pos);
50+
float normalHardness = super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
51+
4552
if (tile == null)
46-
return super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
53+
return normalHardness;
4754

4855
boolean hasPlayers = tile.hasPlayersInside();
49-
if (hasPlayers)
50-
return 0;
5156

52-
return super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
57+
58+
// If there are players inside, check config for break handling
59+
if(hasPlayers) {
60+
EnumMachinePlayersBreakHandling hand = ServerConfig.MACHINE_PLAYER_BREAK_HANDLING.get();
61+
switch (hand) {
62+
case UNBREAKABLE:
63+
return 0;
64+
65+
case OWNER:
66+
Optional<UUID> ownerUUID = tile.getOwnerUUID();
67+
return ownerUUID
68+
.map(uuid -> player.getUniqueID() == uuid ? normalHardness : 0)
69+
.orElse(normalHardness);
70+
71+
case ANYONE:
72+
return normalHardness;
73+
}
74+
}
75+
76+
// No players inside - let anyone break it
77+
return normalHardness;
5378
}
5479

5580
@Override

src/main/java/com/robotgryphon/compactmachines/block/tiles/CompactMachineTile.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ public CompoundNBT getUpdateTag() {
172172
CompoundNBT playerNbt = data.serializeNBT();
173173
base.put("players", playerNbt);
174174
});
175+
176+
if(this.owner != null)
177+
base.putUniqueId("owner", this.owner);
175178
}
176179

177180
return base;
@@ -188,6 +191,9 @@ public void handleUpdateTag(BlockState state, CompoundNBT tag) {
188191

189192
CompactMachineCommonData.getInstance().updatePlayerData(playerData);
190193
}
194+
195+
if(tag.contains("owner"))
196+
owner = tag.getUniqueId("owner");
191197
}
192198

193199
@Override

src/main/java/com/robotgryphon/compactmachines/config/CommonConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
package com.robotgryphon.compactmachines.config;
22

3+
import com.electronwill.nightconfig.core.EnumGetMethod;
34
import com.robotgryphon.compactmachines.CompactMachines;
5+
import com.robotgryphon.compactmachines.core.EnumMachinePlayersBreakHandling;
46
import net.minecraftforge.common.ForgeConfigSpec;
57
import net.minecraftforge.eventbus.api.SubscribeEvent;
68
import net.minecraftforge.fml.common.Mod;
79
import net.minecraftforge.fml.config.ModConfig;
810

11+
import java.util.Arrays;
12+
import java.util.List;
13+
import java.util.stream.Collectors;
14+
915
@Mod.EventBusSubscriber(modid = CompactMachines.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
1016
public class CommonConfig {
1117

1218
public static ForgeConfigSpec CONFIG;
1319

1420
public static ForgeConfigSpec.BooleanValue ENABLE_VANILLA_RECIPES;
1521

22+
23+
1624
static {
1725
generateConfig();
1826
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.robotgryphon.compactmachines.config;
2+
3+
import com.electronwill.nightconfig.core.EnumGetMethod;
4+
import com.robotgryphon.compactmachines.core.EnumMachinePlayersBreakHandling;
5+
import net.minecraftforge.common.ForgeConfigSpec;
6+
7+
import java.util.Arrays;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
public class ServerConfig {
12+
public static ForgeConfigSpec CONFIG;
13+
14+
public static ForgeConfigSpec.EnumValue<EnumMachinePlayersBreakHandling> MACHINE_PLAYER_BREAK_HANDLING;
15+
16+
static {
17+
generateConfig();
18+
}
19+
20+
private static void generateConfig() {
21+
ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder();
22+
23+
builder
24+
.comment("Machines")
25+
.push("machines");
26+
27+
List<String> handling = Arrays
28+
.stream(EnumMachinePlayersBreakHandling.values())
29+
.map(v -> String.format(" '%s' = %s", v.configName(), v.configDesc()))
30+
.collect(Collectors.toList());
31+
32+
handling.add(0, "Specifies machine breakability while players are inside.");
33+
String[] handlingFinal = handling.toArray(new String[0]);
34+
35+
MACHINE_PLAYER_BREAK_HANDLING = builder
36+
.comment(handlingFinal)
37+
.defineEnum("breakHandling",
38+
EnumMachinePlayersBreakHandling.UNBREAKABLE,
39+
EnumGetMethod.NAME_IGNORECASE);
40+
41+
builder.pop();
42+
43+
CONFIG = builder.build();
44+
}
45+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.robotgryphon.compactmachines.core;
2+
3+
public enum EnumMachinePlayersBreakHandling {
4+
UNBREAKABLE("unbreakable", "Nobody can break while players are inside."),
5+
OWNER("owner", "Only the owner can break while players are inside."),
6+
ANYONE("anyone", "Anyone can break while players are inside.");
7+
8+
private final String configValue;
9+
private final String configDesc;
10+
11+
EnumMachinePlayersBreakHandling(String configValue, String configDesc) {
12+
this.configValue = configValue;
13+
this.configDesc = configDesc;
14+
}
15+
16+
public String configName() {
17+
return configValue;
18+
}
19+
20+
public String configDesc() {
21+
return configDesc;
22+
}
23+
}

0 commit comments

Comments
 (0)