public override void Process() { //todo: use Chunk.RecalcHeightAt(int _x, int _yMaxStart, int _z) //todo: allow /y=-1 too be used to offset the insert when using player locs to allow sub areas to be accessed without underground clipping // /y=terrain to set the bottom y co-ord to the lowest non terrain block -1 //todo: apply a custom placeholder mapping to a block value in the area //todo: refactor to use CmdArea and tasks var world = GameManager.Instance.World; if (world == null) { SendOutput("World not loaded"); return; } var p1 = new Vector3i(int.MinValue, 0, int.MinValue); var p2 = new Vector3i(int.MinValue, 0, int.MinValue); string blockname; string blockname2 = null; //get loc and player current pos EntityPlayer sender = null; string steamId = null; if (SenderInfo.RemoteClientInfo != null) { steamId = SenderInfo.RemoteClientInfo.ownerId; sender = world.Entities.dict[SenderInfo.RemoteClientInfo.entityId] as EntityPlayer; if (sender != null) { p2 = new Vector3i((int)Math.Floor(sender.serverPos.x / 32f), (int)Math.Floor(sender.serverPos.y / 32f), (int)Math.Floor(sender.serverPos.z / 32f)); } else { SendOutput("Error: unable to get player location"); return; } } if (Options.ContainsKey("undo")) { UndoInsert(sender); return; } switch (Params.Count) { case 2: case 3: if (steamId != null) { p1 = BCLocation.GetPos(steamId); if (p1.x == int.MinValue) { SendOutput("No location stored. Use bc-loc to store a location."); return; } blockname = Params[1]; if (Params.Count == 3) { blockname2 = Params[2]; } } else { SendOutput("Error: unable to get player location"); return; } break; case 8: case 9: //parse params if (!int.TryParse(Params[1], out p1.x) || !int.TryParse(Params[2], out p1.y) || !int.TryParse(Params[3], out p1.z) || !int.TryParse(Params[4], out p2.x) || !int.TryParse(Params[5], out p2.y) || !int.TryParse(Params[6], out p2.z)) { SendOutput("Error: unable to parse coordinates"); return; } blockname = Params[7]; if (Params.Count == 9) { blockname2 = Params[8]; } break; default: SendOutput("Error: Incorrect command format."); SendOutput(GetHelp()); return; } var size = new Vector3i(Math.Abs(p1.x - p2.x) + 1, Math.Abs(p1.y - p2.y) + 1, Math.Abs(p1.z - p2.z) + 1); var p3 = new Vector3i( p1.x < p2.x ? p1.x : p2.x, p1.y < p2.y ? p1.y : p2.y, p1.z < p2.z ? p1.z : p2.z ); //**************** GET BLOCKVALUE var bvNew = int.TryParse(blockname, out var blockId) ? Block.GetBlockValue(blockId) : Block.GetBlockValue(blockname); var modifiedChunks = GetAffectedChunks(p3, size); //CREATE UNDO //create backup of area blocks will insert to if (!Options.ContainsKey("noundo")) { CreateUndo(sender, p3, size); } switch (Params[0]) { case "scan": ScanBlocks(p3, size, bvNew, blockname); break; case "fill": FillBlocks(p3, size, bvNew, blockname, modifiedChunks); break; case "swap": SwapBlocks(p3, size, bvNew, blockname2, modifiedChunks); break; case "repair": RepairBlocks(p3, size, modifiedChunks); break; case "damage": DamageBlocks(p3, size, modifiedChunks); break; case "upgrade": UpgradeBlocks(p3, size, modifiedChunks); break; case "downgrade": DowngradeBlocks(p3, size, modifiedChunks); break; case "paint": SetPaint(p3, size, modifiedChunks); break; case "paintface": SetPaintFace(p3, size, modifiedChunks); break; case "paintstrip": RemovePaint(p3, size, modifiedChunks); break; case "density": SetDensity(p3, size, modifiedChunks); break; case "rotate": SetRotation(p3, size, modifiedChunks); break; default: SendOutput(GetHelp()); break; } }
protected override void Process() { if (!BCUtils.CheckWorld(out var world)) { return; } if (Options.ContainsKey("undo")) { SendOutput("Please use the bc-undo command to undo changes"); return; } var pos1 = new Vector3i(int.MinValue, 0, int.MinValue); var pos2 = new Vector3i(int.MinValue, 0, int.MinValue); string blockname; string blockname2 = null; //get loc and player current pos EntityPlayer sender = null; string steamId = null; if (SenderInfo.RemoteClientInfo != null) { steamId = SenderInfo.RemoteClientInfo.ownerId; sender = world.Entities.dict[SenderInfo.RemoteClientInfo.entityId] as EntityPlayer; if (sender != null) { pos2 = new Vector3i((int)Math.Floor(sender.serverPos.x / 32f), (int)Math.Floor(sender.serverPos.y / 32f), (int)Math.Floor(sender.serverPos.z / 32f)); } else { SendOutput("Error: unable to get player location"); return; } } switch (Params.Count) { case 2: case 3: if (steamId != null) { pos1 = BCLocation.GetPos(steamId); if (pos1.x == int.MinValue) { SendOutput("No location stored. Use bc-loc to store a location."); return; } blockname = Params[1]; if (Params.Count == 3) { blockname2 = Params[2]; } } else { SendOutput("Error: unable to get player location"); return; } break; case 8: case 9: //parse params if (!int.TryParse(Params[1], out pos1.x) || !int.TryParse(Params[2], out pos1.y) || !int.TryParse(Params[3], out pos1.z) || !int.TryParse(Params[4], out pos2.x) || !int.TryParse(Params[5], out pos2.y) || !int.TryParse(Params[6], out pos2.z)) { SendOutput("Error: unable to parse coordinates"); return; } blockname = Params[7]; if (Params.Count == 9) { blockname2 = Params[8]; } break; default: SendOutput("Error: Incorrect command format."); SendOutput(GetHelp()); return; } var size = BCUtils.GetSize(pos1, pos2); var position = new Vector3i( pos1.x < pos2.x ? pos1.x : pos2.x, pos1.y < pos2.y ? pos1.y : pos2.y, pos1.z < pos2.z ? pos1.z : pos2.z ); //**************** GET BLOCKVALUE var bvNew = int.TryParse(blockname, out var blockId) ? Block.GetBlockValue(blockId) : Block.GetBlockValue(blockname); var modifiedChunks = BCUtils.GetAffectedChunks(new BCMCmdArea("Blocks") { Position = new BCMVector3(position), Size = new BCMVector3(size), HasPos = true, HasSize = true, ChunkBounds = new BCMVector4 { x = World.toChunkXZ(position.x), y = World.toChunkXZ(position.z), z = World.toChunkXZ(position.x + size.x - 1), w = World.toChunkXZ(position.z + size.z - 1) }, HasChunkPos = true }, world); //CREATE UNDO //create backup of area blocks will insert to if (!Options.ContainsKey("noundo")) { BCUtils.CreateUndo(sender, position, size); } switch (Params[0]) { case "scan": ScanBlocks(position, size, bvNew, blockname); break; case "fill": FillBlocks(position, size, bvNew, blockname, modifiedChunks); break; case "swap": SwapBlocks(position, size, bvNew, blockname2, modifiedChunks); break; case "repair": RepairBlocks(position, size, modifiedChunks); break; case "damage": DamageBlocks(position, size, modifiedChunks); break; case "upgrade": UpgradeBlocks(position, size, modifiedChunks); break; case "downgrade": DowngradeBlocks(position, size, modifiedChunks); break; case "paint": SetPaint(position, size, modifiedChunks); break; case "paintface": SetPaintFace(position, size, modifiedChunks); break; case "paintstrip": RemovePaint(position, size, modifiedChunks); break; case "density": SetDensity(position, size, modifiedChunks); break; case "rotate": SetRotation(position, size, modifiedChunks); break; case "meta1": SetMeta(1, position, size, modifiedChunks); break; case "meta2": SetMeta(2, position, size, modifiedChunks); break; case "meta3": SetMeta(3, position, size, modifiedChunks); break; default: SendOutput(GetHelp()); break; } }
public override void Process() { //todo: multidim blocks // claim stones replaced need to be removed from persistent data. // map visitor for unloaded chunks //todo: damage //todo: use Chunk.RecalcHeightAt(int _x, int _yMaxStart, int _z) //todo: change command to load chunks and offload the setblock calls to a subthread that waits for all chunks to load // limit size to 512 x 512 // allow /y=-1 too be used to offset the insert when using player locs to allow sub areas to be accessed without underground clipping // /y=terrain to set the bottom y co-ord to the lowest non terrain block -1 //todo: apply a custom placeholder mapping to a block value in the area var world = GameManager.Instance.World; if (world == null) { SendOutput("World not loaded"); return; } var p1 = new Vector3i(int.MinValue, 0, int.MinValue); var p2 = new Vector3i(int.MinValue, 0, int.MinValue); string blockname; string blockname2 = null; int blockId; //get loc and player current pos EntityPlayer sender = null; string steamId = null; if (SenderInfo.RemoteClientInfo != null) { steamId = SenderInfo.RemoteClientInfo.ownerId; sender = world.Entities.dict[SenderInfo.RemoteClientInfo.entityId] as EntityPlayer; if (sender != null) { p2 = new Vector3i((int)Math.Floor(sender.serverPos.x / 32f), (int)Math.Floor(sender.serverPos.y / 32f), (int)Math.Floor(sender.serverPos.z / 32f)); } else { SendOutput("Error: unable to get player location"); return; } } if (Options.ContainsKey("undo")) { UndoInsert(sender); return; } switch (Params.Count) { case 1: case 2: if (steamId != null) { p1 = BCLocation.GetPos(steamId); if (p1.x == int.MinValue) { SendOutput("No location stored. Use bc-loc to store a location."); return; } blockname = Params[0]; if (Params.Count == 2) { blockname2 = Params[1]; } } else { SendOutput("Error: unable to get player location"); return; } break; case 7: case 8: //parse params if (!int.TryParse(Params[0], out p1.x) || !int.TryParse(Params[1], out p1.y) || !int.TryParse(Params[2], out p1.z) || !int.TryParse(Params[3], out p2.x) || !int.TryParse(Params[4], out p2.y) || !int.TryParse(Params[5], out p2.z)) { SendOutput("Error: unable to parse coordinates"); return; } blockname = Params[6]; if (Params.Count == 8) { blockname2 = Params[7]; } break; default: //todo: make a helper method for below output SendHelp(Enum.InvalidParamCount) SendOutput("Error: Incorrect command format."); SendOutput(GetHelp()); return; } var size = new Vector3i(Math.Abs(p1.x - p2.x) + 1, Math.Abs(p1.y - p2.y) + 1, Math.Abs(p1.z - p2.z) + 1); var p3 = new Vector3i( p1.x < p2.x ? p1.x : p2.x, p1.y < p2.y ? p1.y : p2.y, p1.z < p2.z ? p1.z : p2.z ); //**************** GET BLOCKVALUE var bvNew = int.TryParse(blockname, out blockId) ? Block.GetBlockValue(blockId) : Block.GetBlockValue(blockname); var modifiedChunks = GetAffectedChunks(p3, size); //CREATE UNDO //create backup of area prefab will insert to if (!Options.ContainsKey("noundo")) { //todo: use BlockTools.CopyIntoStorage to get prefab, then save to cache CreateUndo(sender, p3, size); } if (Options.ContainsKey("swap")) { SwapBlocks(p3, size, bvNew, blockname2, modifiedChunks); } else if (Options.ContainsKey("chown")) { } else if (Options.ContainsKey("smooth")) { //options: randomise, smooth, default } else if (Options.ContainsKey("scan")) { ScanBlocks(size, p3, bvNew, blockname); } else { FillBlocks(p3, size, bvNew, blockname, modifiedChunks); } }
public override void Process() { var world = GameManager.Instance.World; if (world == null) { return; } var p1 = new Vector3i(int.MinValue, 0, int.MinValue); var p2 = new Vector3i(int.MinValue, 0, int.MinValue); string filename = null; switch (Params.Count) { case 1: //get loc and player current pos if (SenderInfo.RemoteClientInfo != null) { if (!world.Entities.dict.ContainsKey(SenderInfo.RemoteClientInfo.entityId)) { return; } var sender = world.Entities.dict[SenderInfo.RemoteClientInfo.entityId] as EntityPlayer; Vector3i currentPos; if (sender != null) { currentPos = new Vector3i((int)Math.Floor(sender.serverPos.x / 32f), (int)Math.Floor(sender.serverPos.y / 32f), (int)Math.Floor(sender.serverPos.z / 32f)); } else { SendOutput("Error: unable to get player location"); return; } var steamId = SenderInfo.RemoteClientInfo.ownerId; if (steamId != null) { p1 = BCLocation.GetPos(steamId); if (p1.x == int.MinValue) { SendOutput("No location stored. Use bc-loc to store a location."); return; } p2 = currentPos; filename = Params[0]; } } else { SendOutput("Error: unable to get player location"); return; } break; case 7: //parse params if (!int.TryParse(Params[0], out p1.x) || !int.TryParse(Params[1], out p1.y) || !int.TryParse(Params[2], out p1.z) || !int.TryParse(Params[3], out p2.x) || !int.TryParse(Params[4], out p2.y) || !int.TryParse(Params[5], out p2.z)) { SendOutput("Error: unable to parse coordinates"); return; } filename = Params[6]; break; default: SendOutput("Error: Incorrect command format."); SendOutput(GetHelp()); return; } if (filename == null) { SendOutput("Error: Prefab filename was null."); } else { var prefab = new Prefab(); var p0 = prefab.CopyFromWorld(world, p1, p2); //_prefab.CopyFromWorldWithEntities(); prefab.filename = filename; prefab.bCopyAirBlocks = true; prefab.addAllChildBlocks(); //credit: DJKRose //todo: lock doors etc? //todo: parse additional config from options var dir = "Data/Prefabs"; if (Options.ContainsKey("backup")) { dir = "Data/Prefabs/Backup"; } SendOutput(prefab.Save(dir, prefab.filename) ? $"Prefab {prefab.filename} exported @ {p0.x} {p0.y} {p0.z}, size={prefab.size.x} {prefab.size.y} {prefab.size.z}" : $"Error: Prefab {prefab.filename} failed to save."); } }