This commit is contained in:
parent
807ffa76a1
commit
032d553038
7 changed files with 392 additions and 1 deletions
|
@ -4,7 +4,7 @@ org.gradle.parallel=true
|
||||||
org.gradle.caching=false
|
org.gradle.caching=false
|
||||||
|
|
||||||
# Project Info
|
# Project Info
|
||||||
version=1.0.10
|
version=1.0.11
|
||||||
group=net.pietru
|
group=net.pietru
|
||||||
id=cookie_utils
|
id=cookie_utils
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ public class TextCommands {
|
||||||
commands.put("vis_claim",new vis_area_claim_command());
|
commands.put("vis_claim",new vis_area_claim_command());
|
||||||
commands.put("my_claims",new my_claims_command());
|
commands.put("my_claims",new my_claims_command());
|
||||||
commands.put("setup",new setup_command());
|
commands.put("setup",new setup_command());
|
||||||
|
commands.put("schem_paste",new schematic_command());
|
||||||
commands.put("region",new region_command());
|
commands.put("region",new region_command());
|
||||||
commands.put("kit",new kit_command());
|
commands.put("kit",new kit_command());
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
package net.pietru.cookie_utils.commands;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
|
import com.badlogic.gdx.utils.Json;
|
||||||
|
import finalforeach.cosmicreach.entities.player.Player;
|
||||||
|
import finalforeach.cosmicreach.io.SaveLocation;
|
||||||
|
import finalforeach.cosmicreach.networking.NetworkIdentity;
|
||||||
|
import finalforeach.cosmicreach.networking.packets.MessagePacket;
|
||||||
|
import finalforeach.cosmicreach.world.Zone;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import net.pietru.cookie_utils.utils.Schematic;
|
||||||
|
import net.pietru.cookie_utils.utils.block_util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static net.pietru.cookie_utils.utils.directory_utils.get_path_string;
|
||||||
|
|
||||||
|
public class schematic_command extends BaseCommand {
|
||||||
|
@Override
|
||||||
|
public String get_command_key() {
|
||||||
|
return "schem_paste";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(String[] args, NetworkIdentity networkIdentity, ChannelHandlerContext ctx) {
|
||||||
|
Player player = networkIdentity.getPlayer();
|
||||||
|
MessagePacket packet = new MessagePacket("");
|
||||||
|
|
||||||
|
|
||||||
|
if (args.length<=1){
|
||||||
|
packet.message="[Server] Invalid arguments...";
|
||||||
|
packet.setupAndSend(ctx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
System.out.println(Arrays.toString(args));
|
||||||
|
Zone zone = player.getZone();
|
||||||
|
|
||||||
|
boolean ignored = new File(SaveLocation.getSaveFolderLocation() + "/schematics").mkdirs();
|
||||||
|
File file_path = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"schematics",args[1]+".json"));
|
||||||
|
if (!file_path.exists()) {
|
||||||
|
packet.message="File no exists " + args[1] + ".json";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
FileHandle file = new FileHandle(file_path);
|
||||||
|
Json json = new Json();
|
||||||
|
Schematic data = json.fromJson(Schematic.class,file);
|
||||||
|
data.paste_blocks(block_util.getBlockPositionFromGlobalXYZ(zone,player.getPosition()),zone);
|
||||||
|
System.out.println("Successfully pasted schematic.");
|
||||||
|
packet.message="Loaded schematic from "+args[1]+".json";
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("An error occurred while loading schematic.");
|
||||||
|
packet.message="Error occured when loading from "+args[1]+".json";
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
packet.setupAndSend(ctx);
|
||||||
|
}
|
||||||
|
public String getDescription() {
|
||||||
|
return "save [name] | load [name] | near | Allows to save schematics made with anchors";
|
||||||
|
}
|
||||||
|
}
|
146
src/main/java/net/pietru/cookie_utils/setups/schemSave.java
Normal file
146
src/main/java/net/pietru/cookie_utils/setups/schemSave.java
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
package net.pietru.cookie_utils.setups;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.math.Vector3;
|
||||||
|
import com.badlogic.gdx.math.collision.BoundingBox;
|
||||||
|
import finalforeach.cosmicreach.blocks.BlockPosition;
|
||||||
|
import finalforeach.cosmicreach.blocks.BlockState;
|
||||||
|
import finalforeach.cosmicreach.entities.player.Player;
|
||||||
|
import finalforeach.cosmicreach.io.SaveLocation;
|
||||||
|
import finalforeach.cosmicreach.networking.packets.MessagePacket;
|
||||||
|
import finalforeach.cosmicreach.networking.server.ServerIdentity;
|
||||||
|
import finalforeach.cosmicreach.networking.server.ServerSingletons;
|
||||||
|
import finalforeach.cosmicreach.world.Zone;
|
||||||
|
import net.pietru.cookie_utils.api.Area;
|
||||||
|
import net.pietru.cookie_utils.api.Region;
|
||||||
|
import net.pietru.cookie_utils.permissions.ObjectPermList;
|
||||||
|
import net.pietru.cookie_utils.permissions.PlayerAreaPerm;
|
||||||
|
import net.pietru.cookie_utils.utils.Schematic;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static net.pietru.cookie_utils.utils.directory_utils.get_path_string;
|
||||||
|
import static net.pietru.cookie_utils.utils.player_utils.*;
|
||||||
|
|
||||||
|
public class schemSave extends Setup {
|
||||||
|
BlockPosition p1;
|
||||||
|
BlockPosition p2;
|
||||||
|
BlockPosition p3;
|
||||||
|
String name="";
|
||||||
|
Zone zone;
|
||||||
|
String ownerId="";
|
||||||
|
|
||||||
|
Schematic data;
|
||||||
|
|
||||||
|
public schemSave() {
|
||||||
|
steps.add(()->{});
|
||||||
|
steps.add(()->{});
|
||||||
|
steps.add(()->{});
|
||||||
|
steps.add(()->{
|
||||||
|
if (zone==null) {
|
||||||
|
Setup.cancel(creatorId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
data = new Schematic();
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 a = new Vector3(p1.getGlobalX(),p1.getGlobalY(),p1.getGlobalZ());
|
||||||
|
Vector3 b = new Vector3(p2.getGlobalX(),p2.getGlobalY(),p2.getGlobalZ());
|
||||||
|
BoundingBox bb = new BoundingBox(a,b);
|
||||||
|
bb.update();
|
||||||
|
|
||||||
|
data.store_blocks(p1,p2,zone,new Vector3(
|
||||||
|
p3.getGlobalX()-bb.min.x,
|
||||||
|
p3.getGlobalY()-bb.min.y,
|
||||||
|
p3.getGlobalZ()-bb.min.z
|
||||||
|
));
|
||||||
|
|
||||||
|
step_hints.add("Schematic saved...");
|
||||||
|
|
||||||
|
run_setup_finish();
|
||||||
|
});
|
||||||
|
|
||||||
|
step_hints.add("Please select first position...");
|
||||||
|
step_hints.add("Please select second position...");
|
||||||
|
step_hints.add("Please select offset position...");
|
||||||
|
step_hints.add("Please enter schematic name (single word)...");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register() {
|
||||||
|
setupCreator.registerSetupCreator("schemSave", schemSave::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get_setup_perm() {
|
||||||
|
return "setup.schemSave";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run_setup_finish() {
|
||||||
|
isActive=false;
|
||||||
|
|
||||||
|
File schem_file = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"schematics",name));
|
||||||
|
if (!schem_file.getParentFile().exists())
|
||||||
|
schem_file.getParentFile().mkdirs();
|
||||||
|
|
||||||
|
MessagePacket packet;
|
||||||
|
ServerIdentity idt = ServerSingletons.getConnection(parseAsPlayer(creatorId));
|
||||||
|
|
||||||
|
try {
|
||||||
|
Schematic.save_schematic_by_name(data,name);
|
||||||
|
packet = new MessagePacket("1/4 Saved as "+name+".json");
|
||||||
|
packet.setupAndSend(idt);
|
||||||
|
Schematic.save_schematic_by_name(Schematic.rotate_schematic(Vector3.Y,90,data),name+"_90");
|
||||||
|
packet = new MessagePacket("2/4 Saved as "+name+"_90.json");
|
||||||
|
packet.setupAndSend(idt);
|
||||||
|
Schematic.save_schematic_by_name(Schematic.rotate_schematic(Vector3.Y,180,data),name+"_180");
|
||||||
|
packet = new MessagePacket("3/4 Saved as "+name+"_180.json");
|
||||||
|
packet.setupAndSend(idt);
|
||||||
|
Schematic.save_schematic_by_name(Schematic.rotate_schematic(Vector3.Y,-90,data),name+"_270");
|
||||||
|
packet = new MessagePacket("4/4 Saved as "+name+"_270.json");
|
||||||
|
packet.setupAndSend(idt);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("An error occurred while saving schematic.");
|
||||||
|
packet = new MessagePacket("Error occured when saving to "+name+".json");
|
||||||
|
packet.setupAndSend(idt);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run_setup_canceled() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean set_setup_text(String value) {
|
||||||
|
if (step==3)
|
||||||
|
name=value;
|
||||||
|
return step==3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean set_setup_vector3(Vector3 value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean set_setup_block_pos(BlockPosition value) {
|
||||||
|
if (step==0) {
|
||||||
|
p1 = value;//new Vector3(value.getGlobalX(), value.getGlobalY(), value.getGlobalZ());
|
||||||
|
zone = value.getZone();
|
||||||
|
}
|
||||||
|
else if (step==1) {
|
||||||
|
p2 = value;
|
||||||
|
if (!Objects.equals(zone, value.getZone()))
|
||||||
|
zone=null;
|
||||||
|
}
|
||||||
|
else if (step==2) {
|
||||||
|
p3 = value;
|
||||||
|
if (!Objects.equals(zone, value.getZone()))
|
||||||
|
zone=null;
|
||||||
|
}
|
||||||
|
return step==0 || step==1 || step==2;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ public interface setupCreator {
|
||||||
regionSetup.register();
|
regionSetup.register();
|
||||||
areaPermSetup.register();
|
areaPermSetup.register();
|
||||||
areaFillSetup.register();
|
areaFillSetup.register();
|
||||||
|
schemSave.register();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void registerSetupCreator(String setupId, setupCreator creator) {
|
static void registerSetupCreator(String setupId, setupCreator creator) {
|
||||||
|
|
175
src/main/java/net/pietru/cookie_utils/utils/Schematic.java
Normal file
175
src/main/java/net/pietru/cookie_utils/utils/Schematic.java
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
package net.pietru.cookie_utils.utils;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
|
import com.badlogic.gdx.math.Vector3;
|
||||||
|
import com.badlogic.gdx.math.collision.BoundingBox;
|
||||||
|
import com.badlogic.gdx.utils.*;
|
||||||
|
import finalforeach.cosmicreach.GameAssetLoader;
|
||||||
|
import finalforeach.cosmicreach.blocks.BlockPosition;
|
||||||
|
import finalforeach.cosmicreach.blocks.BlockState;
|
||||||
|
import finalforeach.cosmicreach.blocks.MissingBlockStateResult;
|
||||||
|
import finalforeach.cosmicreach.io.SaveLocation;
|
||||||
|
import finalforeach.cosmicreach.world.BlockSetter;
|
||||||
|
import finalforeach.cosmicreach.world.Zone;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class Schematic implements Json.Serializable {
|
||||||
|
public Vector3 offset = Vector3.Zero;
|
||||||
|
public Vector3 size = Vector3.Zero;
|
||||||
|
public String[] blockStates = new String[0];
|
||||||
|
|
||||||
|
public void store_blocks(BlockPosition start, BlockPosition end, Zone zone){
|
||||||
|
store_blocks(start,end,zone,Vector3.Zero);
|
||||||
|
}
|
||||||
|
public void store_blocks(BlockPosition start, BlockPosition end, Zone zone, Vector3 offset){
|
||||||
|
this.offset=offset;
|
||||||
|
Vector3 a = new Vector3(start.getGlobalX(),start.getGlobalY(),start.getGlobalZ());
|
||||||
|
Vector3 b = new Vector3(end.getGlobalX(),end.getGlobalY(),end.getGlobalZ());
|
||||||
|
BoundingBox bb = new BoundingBox(a,b);
|
||||||
|
bb.update();
|
||||||
|
bb.getDimensions(size);
|
||||||
|
blockStates=new String[(int) (size.x*size.y*size.z)];
|
||||||
|
start=block_util.getBlockPositionFromGlobalXYZ(zone,(int)bb.min.x,(int)bb.min.y,(int)bb.min.z);
|
||||||
|
for (int x = 0; x < size.x; x++) {
|
||||||
|
for (int y = 0; y < size.y; y++) {
|
||||||
|
for (int z = 0; z < size.z; z++) {
|
||||||
|
blockStates[(int) (x+y*size.x+z*size.x*size.y)]=start.getOffsetBlockPos(zone,x,y,z).getBlockState().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void paste_blocks(BlockPosition start, Zone zone){
|
||||||
|
paste_blocks(start,zone,offset);
|
||||||
|
}
|
||||||
|
public void paste_blocks(BlockPosition start, Zone zone, Vector3 offset){
|
||||||
|
for (int x = 0; x < size.x; x++) {
|
||||||
|
for (int y = 0; y < size.y; y++) {
|
||||||
|
for (int z = 0; z < size.z; z++) {
|
||||||
|
BlockPosition pos = start.getOffsetBlockPos(zone, (int) (x-offset.x), (int) (y-offset.y), (int) (z-offset.z));
|
||||||
|
String block = get_block(x,y,z);
|
||||||
|
BlockSetter.get().replaceBlock(zone, BlockState.getInstance(block, MissingBlockStateResult.MISSING_OBJECT),pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String get_block(BlockPosition pos){
|
||||||
|
return get_block(pos.getGlobalX(),pos.getGlobalY(),pos.getGlobalZ());
|
||||||
|
}
|
||||||
|
public String get_block(Vector3 pos){
|
||||||
|
return get_block((int) pos.x, (int) pos.y, (int) pos.z);
|
||||||
|
}
|
||||||
|
public String get_block(int x, int y, int z){
|
||||||
|
return blockStates[(int) (x+y*size.x+z*size.x*size.y)];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Schematic rotate_schematic(Vector3 axis, int degrees, Schematic schem){
|
||||||
|
Schematic new_schematic = new Schematic();
|
||||||
|
|
||||||
|
new_schematic.blockStates=new String[schem.blockStates.length];
|
||||||
|
|
||||||
|
while (degrees>180 || degrees<-180){
|
||||||
|
if (degrees>180)
|
||||||
|
degrees-=360;
|
||||||
|
if (degrees<-180)
|
||||||
|
degrees+=360;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (degrees) {
|
||||||
|
case 0 -> {
|
||||||
|
new_schematic.size.set(schem.size);
|
||||||
|
new_schematic.offset=schem.offset.cpy();
|
||||||
|
}
|
||||||
|
case 90 -> {
|
||||||
|
new_schematic.size=new Vector3(schem.size.z,schem.size.y,schem.size.x);
|
||||||
|
new_schematic.offset=new Vector3(schem.offset.z,schem.offset.y,-schem.offset.x+schem.size.x-1);
|
||||||
|
}
|
||||||
|
case 180 -> {
|
||||||
|
new_schematic.size=schem.size.cpy();
|
||||||
|
new_schematic.offset=new Vector3(-schem.offset.z+schem.size.z-1,schem.offset.y,-schem.offset.x+schem.size.x-1);
|
||||||
|
}
|
||||||
|
case -90 -> {
|
||||||
|
new_schematic.size=new Vector3(schem.size.z,schem.size.y,schem.size.x);
|
||||||
|
new_schematic.offset=new Vector3(-schem.offset.z+schem.size.z-1,schem.offset.y,schem.offset.x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 size = new_schematic.size;
|
||||||
|
for (int x = 0; x < schem.size.x; x++) {
|
||||||
|
for (int y = 0; y < schem.size.y; y++) {
|
||||||
|
for (int z = 0; z < schem.size.z; z++) {
|
||||||
|
switch (degrees) {
|
||||||
|
case 0 -> {
|
||||||
|
new_schematic.blockStates[(int) (x + y * size.x + z * size.x * size.y)] = schem.get_block(x, y, z);
|
||||||
|
}
|
||||||
|
case 90 -> {
|
||||||
|
new_schematic.blockStates[(int) (z + y * size.x + (-x+schem.size.x-1) * size.x * size.y)] = schem.get_block(x, y, z);
|
||||||
|
}
|
||||||
|
case 180 -> {
|
||||||
|
new_schematic.blockStates[(int) ((-x+schem.size.x-1) + y * size.x + (-z+schem.size.z-1) * size.x * size.y)] = schem.get_block(x, y, z);
|
||||||
|
}
|
||||||
|
case -90 -> {
|
||||||
|
new_schematic.blockStates[(int) ((-z+schem.size.z-1) + y * size.x + x * size.x * size.y)] = schem.get_block(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return new_schematic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void save_schematic_by_name(Schematic schem, String name) throws IOException {
|
||||||
|
boolean ignored = new File(SaveLocation.getSaveFolderLocation() + "/schematics").mkdirs();
|
||||||
|
String file_path = SaveLocation.getSaveFolderLocation() + "/schematics/"+name+".json";
|
||||||
|
save_schematic(schem,file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void save_schematic(Schematic schem, String path) throws IOException {
|
||||||
|
File file = new File(path);
|
||||||
|
FileWriter myWriter = new FileWriter(file);
|
||||||
|
Json json = new Json();
|
||||||
|
json.setOutputType(JsonWriter.OutputType.json);
|
||||||
|
myWriter.write(json.toJson(schem));
|
||||||
|
myWriter.close();
|
||||||
|
System.out.println("Successfully saved schematic.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Schematic load_schematic_by_name(String name){
|
||||||
|
String file_path = SaveLocation.getSaveFolderLocation() + "/schematics/"+name+".json";
|
||||||
|
return load_schematic(file_path);
|
||||||
|
}
|
||||||
|
public static Schematic load_schematic(String path){
|
||||||
|
FileHandle fh = GameAssetLoader.loadAsset(path);
|
||||||
|
if (!fh.exists()) {
|
||||||
|
System.out.println("Schematic at " + path + " not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Json().fromJson(Schematic.class,fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(Json json) {
|
||||||
|
json.writeValue("offset",offset);
|
||||||
|
json.writeValue("size",size);
|
||||||
|
json.writeValue("blockStates",blockStates);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(Json json, JsonValue jsonValue) {
|
||||||
|
JsonValue v = jsonValue.get("offset");
|
||||||
|
offset=new Vector3(v.getFloat("x",0),v.getFloat("y",0),v.getFloat("z",0));
|
||||||
|
JsonValue s = jsonValue.get("size");
|
||||||
|
size=new Vector3(s.getFloat("x",0),s.getFloat("y",0),s.getFloat("z",0));
|
||||||
|
JsonValue states = jsonValue.get("blockStates");
|
||||||
|
blockStates=states.asStringArray();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,16 @@
|
||||||
package net.pietru.cookie_utils.utils;
|
package net.pietru.cookie_utils.utils;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.math.Vector3;
|
||||||
import finalforeach.cosmicreach.blocks.BlockPosition;
|
import finalforeach.cosmicreach.blocks.BlockPosition;
|
||||||
import finalforeach.cosmicreach.world.Chunk;
|
import finalforeach.cosmicreach.world.Chunk;
|
||||||
import finalforeach.cosmicreach.world.Zone;
|
import finalforeach.cosmicreach.world.Zone;
|
||||||
|
|
||||||
public class block_util {
|
public class block_util {
|
||||||
|
|
||||||
|
public static BlockPosition getBlockPositionFromGlobalXYZ(Zone zone, Vector3 pos) {
|
||||||
|
return getBlockPositionFromGlobalXYZ(zone, (int) pos.x, (int) pos.y, (int) pos.z);
|
||||||
|
}
|
||||||
|
|
||||||
public static BlockPosition getBlockPositionFromGlobalXYZ(Zone zone, int x, int y, int z) {
|
public static BlockPosition getBlockPositionFromGlobalXYZ(Zone zone, int x, int y, int z) {
|
||||||
Chunk c = zone.getChunkAtBlock(x, y, z);
|
Chunk c = zone.getChunkAtBlock(x, y, z);
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
|
|
Loading…
Reference in a new issue