Skip to content

Commit 8985232

Browse files
committed
More work on machine schemas, i.e. prefilled machines
It is now possible to save a machine schema and set a compact machine to restore that schema when it is first entered.
1 parent 8834fa1 commit 8985232

File tree

18 files changed

+1236
-105
lines changed

18 files changed

+1236
-105
lines changed

src/main/java/org/dave/compactmachines3/CompactMachines3.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.dave.compactmachines3.network.PackageHandler;
2121
import org.dave.compactmachines3.proxy.CommonProxy;
2222
import org.dave.compactmachines3.render.BakeryHandler;
23+
import org.dave.compactmachines3.schema.SchemaRegistry;
2324
import org.dave.compactmachines3.utility.AnnotatedInstanceUtil;
2425
import org.dave.compactmachines3.utility.Logz;
2526
import org.dave.compactmachines3.world.ChunkLoadingMachines;
@@ -71,6 +72,7 @@ public void init(FMLInitializationEvent event) {
7172
proxy.init(event);
7273

7374
MultiblockRecipes.init();
75+
SchemaRegistry.init();
7476
}
7577

7678
@EventHandler

src/main/java/org/dave/compactmachines3/block/BlockMachine.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,27 @@ public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, En
322322

323323
// TODO: Convert the ability to teleport into a machine into an itemstack capability
324324
if(playerItem instanceof ItemPersonalShrinkingDevice) {
325-
TeleportationTools.teleportPlayerToMachine((EntityPlayerMP) player, machine);
325+
// TODO: Clean up, this belongs into a separate class
326+
if(machine.coords == -1) {
327+
StructureTools.generateCubeForMachine(machine);
328+
329+
double[] destination = new double[] {
330+
machine.coords * 1024 + 0.5 + machine.getSize().getDimension() / 2,
331+
42,
332+
0.5 + machine.getSize().getDimension() / 2
333+
};
334+
335+
double x = machine.coords * 1024 + 0.5 + machine.getSize().getDimension() / 2;
336+
double y = 42;
337+
double z = 0.5 + machine.getSize().getDimension() / 2;
338+
WorldSavedDataMachines.INSTANCE.addSpawnPoint(machine.coords, x, y, z);
339+
}
326340

327341
WorldSavedDataMachines.INSTANCE.addMachinePosition(machine.coords, pos, world.provider.getDimension(), machine.getSize());
342+
343+
TeleportationTools.teleportPlayerToMachine((EntityPlayerMP) player, machine);
328344
StructureTools.setBiomeForCoords(machine.coords, world.getBiome(pos));
345+
329346
return true;
330347
}
331348
}
@@ -356,6 +373,12 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer play
356373
}
357374

358375
probeInfo.horizontal().text(TextFormatting.GREEN + "{*tooltip.compactmachines3.machine.coords*} " + TextFormatting.YELLOW + nameOrId + TextFormatting.RESET);
376+
if(player.isCreative() && mode == ProbeMode.EXTENDED) {
377+
if(machine.hasNewSchema()) {
378+
String schemaName = machine.getSchemaName();
379+
probeInfo.horizontal().text(TextFormatting.RED + "{*tooltip.compactmachines3.machine.schema*} " + TextFormatting.YELLOW + schemaName + TextFormatting.RESET);
380+
}
381+
}
359382

360383
String translate = "enumfacing." + data.getSideHit().getName();
361384
probeInfo.horizontal()
@@ -366,6 +389,7 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer play
366389
if(connectedStack != null && !connectedStack.isEmpty()) {
367390
probeInfo.horizontal().item(connectedStack).itemLabel(connectedStack);
368391
}
392+
369393
}
370394
}
371395
}

src/main/java/org/dave/compactmachines3/command/CommandSchema.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ public class CommandSchema extends CommandMenu {
66
public void initEntries() {
77
this.addSubcommand(new CommandSchemaSave());
88
this.addSubcommand(new CommandSchemaLoad());
9+
this.addSubcommand(new CommandSchemaSet());
10+
this.addSubcommand(new CommandSchemaReloadFiles());
911
}
1012

1113
@Override
Lines changed: 21 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,21 @@
11
package org.dave.compactmachines3.command;
22

3-
import com.google.gson.stream.JsonReader;
4-
import net.minecraft.block.state.IBlockState;
53
import net.minecraft.command.CommandException;
64
import net.minecraft.command.ICommandSender;
7-
import net.minecraft.entity.EntityLivingBase;
85
import net.minecraft.entity.player.EntityPlayer;
96
import net.minecraft.server.MinecraftServer;
10-
import net.minecraft.tileentity.TileEntity;
117
import net.minecraft.util.math.BlockPos;
12-
import net.minecraft.world.WorldServer;
8+
import net.minecraft.util.text.TextComponentTranslation;
139
import org.dave.compactmachines3.misc.ConfigurationHandler;
14-
import org.dave.compactmachines3.schema.BlockInformation;
10+
import org.dave.compactmachines3.reference.EnumMachineSize;
1511
import org.dave.compactmachines3.schema.Schema;
16-
import org.dave.compactmachines3.utility.SerializationHelper;
17-
import org.dave.compactmachines3.tile.TileEntityMachine;
12+
import org.dave.compactmachines3.schema.SchemaRegistry;
1813
import org.dave.compactmachines3.world.WorldSavedDataMachines;
19-
import org.dave.compactmachines3.world.tools.DimensionTools;
2014
import org.dave.compactmachines3.world.tools.StructureTools;
2115

22-
import java.io.File;
23-
import java.io.FileNotFoundException;
24-
import java.io.FileReader;
16+
import javax.annotation.Nullable;
2517
import java.util.List;
18+
import java.util.stream.Collectors;
2619

2720
public class CommandSchemaLoad extends CommandBaseExt {
2821
@Override
@@ -40,66 +33,28 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4033
if(args.length != 1) {
4134
throw this.getUsageException(sender);
4235
}
43-
String sane = args[0].replaceAll("[^a-zA-Z0-9\\._]+", "_") + ".json";
4436

45-
File schemaFile = new File(ConfigurationHandler.schemaDirectory, sane);
46-
Schema schema = null;
47-
try {
48-
schema = SerializationHelper.GSON.fromJson(new JsonReader(new FileReader(schemaFile)), Schema.class);
49-
} catch (FileNotFoundException e) {
50-
throw this.getException(sender, "invalid_file");
37+
if(!SchemaRegistry.instance.hasSchema(args[0])) {
38+
throw this.getException(sender, "unknown_schema");
5139
}
5240

53-
if(schema == null) {
54-
throw this.getException(sender, "not_deserializable");
41+
if (sender.getEntityWorld().provider.getDimension() != ConfigurationHandler.Settings.dimensionId) {
42+
throw this.getException(sender, "not_in_machine_dimension");
5543
}
5644

57-
List<BlockInformation> blockList = schema.blocks;
58-
59-
if(sender.getCommandSenderEntity() != null && sender.getCommandSenderEntity() instanceof EntityLivingBase) {
60-
if (sender.getEntityWorld().provider.getDimension() != ConfigurationHandler.Settings.dimensionId) {
61-
throw this.getException(sender, "not_in_machine_dimension");
62-
}
63-
64-
int coords = StructureTools.getCoordsForPos(sender.getCommandSenderEntity().getPosition());
65-
66-
TileEntity te = WorldSavedDataMachines.INSTANCE.getMachinePosition(coords).getTileEntity();
67-
if(te != null && te instanceof TileEntityMachine) {
68-
WorldServer machineWorld = DimensionTools.getServerMachineWorld();
69-
70-
TileEntityMachine machine = (TileEntityMachine) te;
71-
int size = machine.getSize().getDimension();
72-
int startX = machine.coords * 1024 + size - 1;
73-
int startY = 40 + size - 1;
74-
int startZ = 0 + size - 1;
75-
76-
for(BlockInformation bi : blockList) {
77-
BlockPos absolutePos = new BlockPos(
78-
startX - bi.position.getX(),
79-
startY - bi.position.getY(),
80-
startZ - bi.position.getZ()
81-
);
82-
83-
IBlockState state = bi.block.getStateFromMeta(bi.meta);
84-
machineWorld.setBlockState(absolutePos, state);
85-
86-
if(bi.nbt != null) {
87-
TileEntity restoredTe = machineWorld.getTileEntity(absolutePos);
88-
if (restoredTe == null) {
89-
restoredTe = bi.block.createTileEntity(machineWorld, state);
90-
}
45+
Schema schema = SchemaRegistry.instance.getSchema(args[0]);
46+
int coords = StructureTools.getCoordsForPos(sender.getCommandSenderEntity().getPosition());
47+
EnumMachineSize machineSize = WorldSavedDataMachines.INSTANCE.machineSizes.get(coords);
48+
if(machineSize != schema.size) {
49+
throw this.getException(sender, "machine_size_does_not_match");
50+
}
9151

92-
if(bi.writePositionData) {
93-
bi.nbt.setInteger("x", absolutePos.getX());
94-
bi.nbt.setInteger("y", absolutePos.getY());
95-
bi.nbt.setInteger("z", absolutePos.getZ());
96-
}
52+
sender.sendMessage(new TextComponentTranslation("commands.compactmachines3.schema.load.machine_schema_set_to", args[0]));
53+
StructureTools.restoreSchema(schema, coords);
54+
}
9755

98-
restoredTe.readFromNBT(bi.nbt);
99-
restoredTe.markDirty();
100-
}
101-
}
102-
}
103-
}
56+
@Override
57+
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) {
58+
return SchemaRegistry.instance.getSchemaNames().stream().filter(s -> args.length == 0 || s.startsWith(args[0])).collect(Collectors.toList());
10459
}
10560
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.dave.compactmachines3.command;
2+
3+
import net.minecraft.command.CommandException;
4+
import net.minecraft.command.ICommandSender;
5+
import net.minecraft.entity.player.EntityPlayer;
6+
import net.minecraft.server.MinecraftServer;
7+
import org.dave.compactmachines3.schema.SchemaRegistry;
8+
9+
public class CommandSchemaReloadFiles extends CommandBaseExt {
10+
@Override
11+
public String getName() {
12+
return "reload-files";
13+
}
14+
15+
@Override
16+
public boolean isAllowed(EntityPlayer player, boolean creative, boolean isOp) {
17+
return isOp;
18+
}
19+
20+
@Override
21+
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
22+
SchemaRegistry.init();
23+
}
24+
}

src/main/java/org/dave/compactmachines3/command/CommandSchemaSave.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import net.minecraft.entity.EntityLivingBase;
66
import net.minecraft.entity.player.EntityPlayer;
77
import net.minecraft.server.MinecraftServer;
8-
import net.minecraft.util.text.TextComponentString;
8+
import net.minecraft.util.text.TextComponentTranslation;
99
import org.dave.compactmachines3.misc.ConfigurationHandler;
1010
import org.dave.compactmachines3.schema.BlockInformation;
1111
import org.dave.compactmachines3.schema.Schema;
12+
import org.dave.compactmachines3.schema.SchemaRegistry;
1213
import org.dave.compactmachines3.utility.SerializationHelper;
14+
import org.dave.compactmachines3.world.WorldSavedDataMachines;
1315
import org.dave.compactmachines3.world.tools.StructureTools;
1416

1517
import java.io.BufferedWriter;
@@ -27,7 +29,7 @@ public String getName() {
2729

2830
@Override
2931
public boolean isAllowed(EntityPlayer player, boolean creative, boolean isOp) {
30-
return creative || isOp;
32+
return creative && isOp;
3133
}
3234

3335
@Override
@@ -44,11 +46,11 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4446

4547
int coords = StructureTools.getCoordsForPos(sender.getCommandSenderEntity().getPosition());
4648

47-
48-
List<BlockInformation> blockList = StructureTools.getSchema(coords);
49+
List<BlockInformation> blockList = StructureTools.createNewSchema(coords);
4950

5051
if(blockList != null) {
51-
Schema schema = new Schema(args[0], blockList);
52+
// TODO: Save and process the spawn point, including look direction this time!
53+
Schema schema = new Schema(args[0], blockList, WorldSavedDataMachines.INSTANCE.machineSizes.get(coords));
5254

5355
try {
5456
File schemaFile = new File(ConfigurationHandler.schemaDirectory, sane);
@@ -57,11 +59,12 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
5759
writer.write(json);
5860
writer.close();
5961

60-
// TODO: Localization
61-
sender.sendMessage(new TextComponentString("Wrote schema to file: " + sane));
62+
sender.sendMessage(new TextComponentTranslation("commands.compactmachines3.schema.save.success", sane));
6263
} catch (IOException e) {
6364
throw this.getException(sender, "invalid_file");
6465
}
66+
67+
SchemaRegistry.instance.addSchema(schema);
6568
} else {
6669
throw this.getException(sender, "not_serializable");
6770
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.dave.compactmachines3.command;
2+
3+
import net.minecraft.command.CommandException;
4+
import net.minecraft.command.ICommandSender;
5+
import net.minecraft.entity.player.EntityPlayer;
6+
import net.minecraft.server.MinecraftServer;
7+
import net.minecraft.tileentity.TileEntity;
8+
import net.minecraft.util.math.BlockPos;
9+
import net.minecraft.util.math.RayTraceResult;
10+
import net.minecraft.util.text.TextComponentTranslation;
11+
import net.minecraft.world.World;
12+
import org.dave.compactmachines3.schema.Schema;
13+
import org.dave.compactmachines3.schema.SchemaRegistry;
14+
import org.dave.compactmachines3.tile.TileEntityMachine;
15+
16+
import javax.annotation.Nullable;
17+
import java.util.List;
18+
import java.util.stream.Collectors;
19+
20+
public class CommandSchemaSet extends CommandBaseExt {
21+
@Override
22+
public String getName() {
23+
return "set";
24+
}
25+
26+
@Override
27+
public boolean isAllowed(EntityPlayer player, boolean creative, boolean isOp) {
28+
return creative || isOp;
29+
}
30+
31+
@Override
32+
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
33+
if(args.length != 1) {
34+
throw this.getUsageException(sender);
35+
}
36+
37+
String schemaName = args[0];
38+
if(!SchemaRegistry.instance.hasSchema(schemaName)) {
39+
throw this.getException(sender, "unknown_schema");
40+
}
41+
42+
RayTraceResult rayTraceResult = sender.getCommandSenderEntity().rayTrace(16.0f, 0.0f);
43+
if(rayTraceResult.typeOfHit != RayTraceResult.Type.BLOCK) {
44+
throw this.getException(sender, "look_at_compact_machine");
45+
}
46+
47+
BlockPos pos = rayTraceResult.getBlockPos();
48+
World world = sender.getEntityWorld();
49+
50+
TileEntity te = world.getTileEntity(pos);
51+
if(te == null || !(te instanceof TileEntityMachine)) {
52+
throw this.getException(sender, "look_at_compact_machine");
53+
}
54+
55+
TileEntityMachine machine = (TileEntityMachine)te;
56+
57+
Schema schema = SchemaRegistry.instance.getSchema(schemaName);
58+
if(machine.getSize() != schema.size) {
59+
throw this.getException(sender, "machine_size_does_not_match");
60+
}
61+
62+
sender.sendMessage(new TextComponentTranslation("commands.compactmachines3.schema.set.machine_schema_set_to", schemaName));
63+
64+
machine.setSchema(schemaName);
65+
machine.markDirty();
66+
}
67+
68+
@Override
69+
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) {
70+
return SchemaRegistry.instance.getSchemaNames().stream().filter(s -> args.length == 0 || s.startsWith(args[0])).collect(Collectors.toList());
71+
}
72+
}

src/main/java/org/dave/compactmachines3/miniaturization/MultiblockRecipes.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.minecraft.item.ItemStack;
66
import net.minecraft.util.math.BlockPos;
77
import net.minecraft.world.World;
8+
import org.dave.compactmachines3.CompactMachines3;
89
import org.dave.compactmachines3.misc.ConfigurationHandler;
910
import org.dave.compactmachines3.tile.TileEntityFieldProjector;
1011
import org.dave.compactmachines3.utility.Logz;
@@ -54,7 +55,7 @@ public static MultiblockRecipe getRecipeByName(String name) {
5455
}
5556

5657
private static void loadRecipes() {
57-
ResourceLoader loader = new ResourceLoader(ConfigurationHandler.recipeDirectory, "assets/compactmachines3/config/recipes/");
58+
ResourceLoader loader = new ResourceLoader(CompactMachines3.class, ConfigurationHandler.recipeDirectory, "assets/compactmachines3/config/recipes/");
5859
for(Map.Entry<String, InputStream> entry : loader.getResources().entrySet()) {
5960
String filename = entry.getKey();
6061
InputStream is = entry.getValue();
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package org.dave.compactmachines3.schema;
22

3+
import org.dave.compactmachines3.reference.EnumMachineSize;
4+
35
import java.util.List;
46

57
public class Schema {
68
public String name;
79
public List<BlockInformation> blocks;
10+
public EnumMachineSize size;
811

9-
public Schema(String name, List<BlockInformation> blocks) {
12+
public Schema(String name, List<BlockInformation> blocks, EnumMachineSize size) {
1013
this.name = name;
1114
this.blocks = blocks;
15+
this.size = size;
1216
}
1317
}

0 commit comments

Comments
 (0)