diff --git a/Commands/Moderation/CmdRestoreSelection.cs b/Commands/Moderation/CmdRestoreSelection.cs index 62f7bf586..94024e54b 100644 --- a/Commands/Moderation/CmdRestoreSelection.cs +++ b/Commands/Moderation/CmdRestoreSelection.cs @@ -1,112 +1,92 @@ /* - Copyright 2010 MCSharp team (Modified for use with MCZall/MCLawl/MCGalaxy) - - Dual-licensed under the Educational Community License, Version 2.0 and - the GNU General Public License, Version 3 (the "Licenses"); you may - not use this file except in compliance with the Licenses. You may - obtain a copy of the Licenses at - - http://www.opensource.org/licenses/ecl2.php - http://www.gnu.org/licenses/gpl-3.0.html - - Unless required by applicable law or agreed to in writing, - software distributed under the Licenses are distributed on an "AS IS" - BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the Licenses for the specific language governing - permissions and limitations under the Licenses. -*/ + Copyright 2010 MCSharp team (Modified for use with MCZall/MCLawl/MCGalaxy) + + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.opensource.org/licenses/ecl2.php + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. + */ using System; -using System.IO; -using System.IO.Compression; using MCGalaxy.Levels.IO; -namespace MCGalaxy.Commands -{ - public sealed class CmdRestoreSelection : Command - { +namespace MCGalaxy.Commands { + + public sealed class CmdRestoreSelection : Command { + public override string name { get { return "rs"; } } public override string shortcut { get { return ""; } } - public override string type { get { return CommandTypes.Moderation; } } + public override string type { get { return CommandTypes.Moderation; } } public override bool museumUsable { get { return false; } } public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - public override void Use(Player p, string message) - { - if (message != "") - if (File.Exists(@Server.backupLocation + "/" + p.level.name + "/" + message + "/" + p.level.name + ".lvl")) - { - try - { - p.blockchangeObject = new CatchPos() { backup = int.Parse(message) }; - p.ClearBlockchange(); - p.Blockchange += Blockchange1; - p.SendMessage("Select two corners for restore."); - } - catch { Server.s.Log("Restore fail"); } - } - else Player.SendMessage(p, "Backup " + message + " does not exist."); - else Help(p); + public override void Use(Player p, string message) { + if (message == "") { Help(p); return; } + + if (LevelInfo.ExistsBackup(p.level.name, message)) { + p.blockchangeObject = new CatchPos() { backup = message }; + p.ClearBlockchange(); + p.Blockchange += Blockchange1; + p.SendMessage("Select two corners for restore."); + } else { + Player.SendMessage(p, "Backup " + message + " does not exist."); + } } - public void Blockchange1(Player p, ushort x, ushort y, ushort z, byte type, byte extType) - { + void Blockchange1(Player p, ushort x, ushort y, ushort z, byte type, byte extType) { RevertAndClearState(p, x, y, z); CatchPos bp = (CatchPos)p.blockchangeObject; bp.x = x; bp.y = y; bp.z = z; p.blockchangeObject = bp; p.Blockchange += Blockchange2; } - public void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type, byte extType) - { + void Blockchange2(Player p, ushort x, ushort y, ushort z, byte type, byte extType) { RevertAndClearState(p, x, y, z); CatchPos cpos = (CatchPos)p.blockchangeObject; - string path = @Server.backupLocation + "/" + p.level.name + "/" + cpos.backup + "/" + p.level.name + ".lvl"; + string path = LevelInfo.BackupPath(p.level.name, cpos.backup); try { - using(Level other = LvlFile.Load("tempLevel", path, false)) { - if (!CopyBlocks(p, other, x, y, z, cpos)) return; - } - if (p.staticCommands) - p.Blockchange += Blockchange1; - } catch { - Server.s.Log("Restore selection failed"); + using(Level other = LvlFile.Load("tempLevel", path)) { + if (!CopyBlocks(p, other, x, y, z, cpos)) return; + } + if (p.staticCommands) + p.Blockchange += Blockchange1; + } catch (Exception ex) { + Server.ErrorLog(ex); + Server.s.Log("Restore selection failed"); } } static bool CopyBlocks(Player p, Level other, ushort x, ushort y, ushort z, CatchPos cpos) { byte[] blocks = other.blocks; - if (blocks.Length != p.level.blocks.Length) { + if (blocks.Length != p.level.blocks.Length) { p.SendMessage("Cant restore selection of different size maps."); return false; } - int width = other.Width, height = other.Length; - - if (p.level.bufferblocks && !p.level.Instant) { - for (ushort yy = Math.Min(cpos.y, y); yy <= Math.Max(cpos.y, y); ++yy) - for (ushort zz = Math.Min(cpos.z, z); zz <= Math.Max(cpos.z, z); ++zz) - for (ushort xx = Math.Min(cpos.x, x); xx <= Math.Max(cpos.x, x); ++xx) - { - BlockQueue.Addblock(p, xx, yy, zz, blocks[xx + (zz * width) + (yy * width * height)]); - } - } else { - for (ushort yy = Math.Min(cpos.y, y); yy <= Math.Max(cpos.y, y); ++yy) - for (ushort zz = Math.Min(cpos.z, z); zz <= Math.Max(cpos.z, z); ++zz) - for (ushort xx = Math.Min(cpos.x, x); xx <= Math.Max(cpos.x, x); ++xx) - { - p.level.Blockchange(p, xx, yy, zz, blocks[xx + (zz * width) + (yy * width * height)]); - } + + int width = other.Width, length = other.Length; + for (ushort yy = Math.Min(cpos.y, y); yy <= Math.Max(cpos.y, y); ++yy) + for (ushort zz = Math.Min(cpos.z, z); zz <= Math.Max(cpos.z, z); ++zz) + for (ushort xx = Math.Min(cpos.x, x); xx <= Math.Max(cpos.x, x); ++xx) + { + byte tile = blocks[xx + width * (zz + yy * length)], extTile = 0; + if (tile == Block.custom_block) extTile = other.GetExtTile(xx, yy, zz); + p.level.UpdateBlock(p, xx, yy, zz, tile, extTile); } return true; } - struct CatchPos - { - public int backup; - public ushort x, y, z; - } + struct CatchPos { public string backup; public ushort x, y, z; } - public override void Help(Player p) - { + public override void Help(Player p) { Player.SendMessage(p, "/restoreselection - restores a previous backup of the current selection"); } } diff --git a/Commands/building/CmdCenter.cs b/Commands/building/CmdCenter.cs index 3edcfb870..db5bdba64 100644 --- a/Commands/building/CmdCenter.cs +++ b/Commands/building/CmdCenter.cs @@ -35,7 +35,7 @@ namespace MCGalaxy.Commands { int xCen = (int)((p.centerstart[0] + p.centerend[0]) / 2); int yCen = (int)((p.centerstart[1] + p.centerend[1]) / 2); int zCen = (int)((p.centerstart[2] + p.centerend[2]) / 2); - p.level.Blockchange(p, (ushort)xCen, (ushort)yCen, (ushort)zCen, (byte)Block.goldsolid); + p.level.UpdateBlock(p, (ushort)xCen, (ushort)yCen, (ushort)zCen, (byte)Block.goldsolid, 0); Player.SendMessage(p, "A gold block was placed at (" + xCen + ", " + yCen + ", " + zCen + ")."); } diff --git a/Commands/building/CmdCopy.cs b/Commands/building/CmdCopy.cs index adb20d333..25aa9eb05 100644 --- a/Commands/building/CmdCopy.cs +++ b/Commands/building/CmdCopy.cs @@ -167,7 +167,7 @@ namespace MCGalaxy.Commands { byte b = p.level.GetTile(xx, yy, zz); if (b != Block.air && Block.canPlace(p, b)) - p.level.Blockchange(p, xx, yy, zz, Block.air); + p.level.UpdateBlock(p, xx, yy, zz, Block.air, 0); } Player.SendMessage(p, (state.Volume - totalAir) + " blocks copied."); diff --git a/Commands/building/CmdHollow.cs b/Commands/building/CmdHollow.cs index 80cd06e75..057334fdd 100644 --- a/Commands/building/CmdHollow.cs +++ b/Commands/building/CmdHollow.cs @@ -97,19 +97,12 @@ namespace MCGalaxy.Commands return; } - buffer.ForEach(delegate(Pos pos1) - { - p.level.Blockchange(p, pos1.x, pos1.y, pos1.z, Block.air); - }); + buffer.ForEach(P => p.level.UpdateBlock(p, P.x, P.y, P.z, Block.air, 0)); Player.SendMessage(p, "You hollowed " + buffer.Count + " blocks."); if (p.staticCommands) p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); } - void BufferAdd(List list, ushort x, ushort y, ushort z) - { - Pos pos; pos.x = x; pos.y = y; pos.z = z; list.Add(pos); - } struct Pos { diff --git a/Commands/building/CmdMaze.cs b/Commands/building/CmdMaze.cs index 4d1a097a3..386bbd5b7 100644 --- a/Commands/building/CmdMaze.cs +++ b/Commands/building/CmdMaze.cs @@ -125,9 +125,9 @@ namespace MCGalaxy.Commands { if (wall[xx, zz]) { - p.level.Blockchange(p, (ushort)(xx + minX+1), y, (ushort)(zz + minZ+1), Block.staircasefull); - p.level.Blockchange(p, (ushort)(xx + minX+1), (ushort)(y + 1), (ushort)(zz + minZ+1), Block.leaf); - p.level.Blockchange(p, (ushort)(xx + minX+1), (ushort)(y + 2), (ushort)(zz + minZ+1), Block.leaf); + p.level.UpdateBlock(p, (ushort)(xx + minX+1), y, (ushort)(zz + minZ+1), Block.staircasefull, 0); + p.level.UpdateBlock(p, (ushort)(xx + minX+1), (ushort)(y + 1), (ushort)(zz + minZ+1), Block.leaf, 0); + p.level.UpdateBlock(p, (ushort)(xx + minX+1), (ushort)(y + 2), (ushort)(zz + minZ+1), Block.leaf, 0); } } } diff --git a/Commands/building/CmdOutline.cs b/Commands/building/CmdOutline.cs index 21d206dcf..5c224430e 100644 --- a/Commands/building/CmdOutline.cs +++ b/Commands/building/CmdOutline.cs @@ -42,7 +42,7 @@ namespace MCGalaxy.Commands if (type2 == 255) { Player.SendMessage(p, "There is no block \"" + t2 + "\"."); return; } if (!Block.canPlace(p, type2)) { Player.SendMessage(p, "Cannot place that block type."); return; } - CatchPos cpos; cpos.type2 = type2; cpos.type = type; + CatchPos cpos; cpos.newType = type2; cpos.type = type; cpos.x = 0; cpos.y = 0; cpos.z = 0; p.blockchangeObject = cpos; Player.SendMessage(p, "Place two blocks to determine the edges."); @@ -94,19 +94,11 @@ namespace MCGalaxy.Commands return; } - buffer.ForEach(delegate(Pos pos1) - { - p.level.Blockchange(p, pos1.x, pos1.y, pos1.z, cpos.type2); - }); - + buffer.ForEach(P => p.level.UpdateBlock(p, P.x, P.y, P.z, cpos.newType, 0)); Player.SendMessage(p, "You outlined " + buffer.Count + " blocks."); if (p.staticCommands) p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); } - void BufferAdd(List list, ushort x, ushort y, ushort z) - { - Pos pos; pos.x = x; pos.y = y; pos.z = z; list.Add(pos); - } struct Pos { @@ -115,7 +107,7 @@ namespace MCGalaxy.Commands struct CatchPos { public byte type; - public byte type2; + public byte newType; public ushort x, y, z; } diff --git a/Commands/building/CmdSPlace.cs b/Commands/building/CmdSPlace.cs index 2e441fa58..f04f9d9d0 100644 --- a/Commands/building/CmdSPlace.cs +++ b/Commands/building/CmdSPlace.cs @@ -75,19 +75,19 @@ namespace MCGalaxy.Commands { dirZ = z > cpos.z ? 1 : -1; ushort endX = (ushort)(cpos.x + dirX * distance); ushort endZ = (ushort)(cpos.z + dirZ * distance); - p.level.Blockchange(p, endX, cpos.y, endZ, Block.rock); + p.level.UpdateBlock(p, endX, cpos.y, endZ, Block.rock, 0); if (interval > 0) { ushort xx = cpos.x, zz = cpos.z; int delta = 0; while (xx < p.level.Width && zz < p.level.Length && delta < distance) { - p.level.Blockchange(p, xx, cpos.y, zz, Block.rock); + p.level.UpdateBlock(p, xx, cpos.y, zz, Block.rock, 0); xx = (ushort)(xx + dirX * interval); zz = (ushort)(zz + dirZ * interval); delta = Math.Abs(xx - cpos.x) + Math.Abs(zz - cpos.z); } } else { - p.level.Blockchange(p, cpos.x, cpos.y, cpos.z, Block.rock); + p.level.UpdateBlock(p, cpos.x, cpos.y, cpos.z, Block.rock, 0); } if (interval > 0) diff --git a/Commands/other/CmdRainbow.cs b/Commands/other/CmdRainbow.cs index 154f7310f..bd15f505f 100644 --- a/Commands/other/CmdRainbow.cs +++ b/Commands/other/CmdRainbow.cs @@ -116,10 +116,7 @@ namespace MCGalaxy.Commands } Player.SendMessage(p, buffer.Count.ToString() + " blocks."); - buffer.ForEach(delegate(Pos pos) - { - p.level.Blockchange(p, pos.x, pos.y, pos.z, pos.newType); //update block for everyone - }); + buffer.ForEach(P => p.level.UpdateBlock(p, P.x, P.y, P.z, P.newType, 0)); if (p.staticCommands) p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); } diff --git a/Levels/Generator/TreeGen.cs b/Levels/Generator/TreeGen.cs index dbb9dfbcb..82cc6a85d 100644 --- a/Levels/Generator/TreeGen.cs +++ b/Levels/Generator/TreeGen.cs @@ -1,20 +1,20 @@ /* - Copyright 2010 MCSharp team (Modified for use with MCZall/MCLawl/MCGalaxy) - - Dual-licensed under the Educational Community License, Version 2.0 and - the GNU General Public License, Version 3 (the "Licenses"); you may - not use this file except in compliance with the Licenses. You may - obtain a copy of the Licenses at - - http://www.opensource.org/licenses/ecl2.php - http://www.gnu.org/licenses/gpl-3.0.html - - Unless required by applicable law or agreed to in writing, - software distributed under the Licenses are distributed on an "AS IS" - BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the Licenses for the specific language governing - permissions and limitations under the Licenses. -*/ + Copyright 2010 MCSharp team (Modified for use with MCZall/MCLawl/MCGalaxy) + + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.opensource.org/licenses/ecl2.php + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. + */ // Copyright 2009, 2010 Matvei Stefarov /* This generator was developed by Neko_baron. @@ -23,112 +23,64 @@ Ideas, concepts, and code were used from the following two sources: 1) Isaac McGarvey's 'perlin noise generator' code 2) http://www.lighthouse3d.com/opengl/terrain/index.php3?introduction -*/ + */ using System; namespace MCGalaxy { - + public static class TreeGen { public static void AddTree(Level Lvl, ushort x, ushort y, ushort z, Random Rand, bool blockChange = false, bool overwrite = true, Player p = null) { byte height = (byte)Rand.Next(5, 8); short top = (short)(height - Rand.Next(2, 4)); - ushort xxx, yyy, zzz; - for (ushort yy = 0; yy < top + height - 1; yy++) - { + for (ushort yy = 0; yy < top + height - 1; yy++) { if (overwrite || Lvl.GetTile(x, (ushort)(y + yy), z) == Block.air || (y + yy == y && Lvl.GetTile(x, (ushort)(y + yy), z) == Block.shrub)) - if (blockChange) - if (p == null) Lvl.Blockchange(x, (ushort)(y + yy), z, Block.trunk); - else Lvl.Blockchange(p, x, (ushort)(y + yy), z, Block.trunk); - else Lvl.SetTile(x, (ushort)(y + yy), z, Block.trunk); + PlaceBlock(Lvl, blockChange, p, x, (ushort)(y + yy), z, Block.trunk); } for (short xx = (short)-top; xx <= top; ++xx) - { for (short yy = (short)-top; yy <= top; ++yy) - { for (short zz = (short)-top; zz <= top; ++zz) - { - short Dist = (short)(Math.Sqrt(xx * xx + yy * yy + zz * zz)); - if (Dist < top + 1) - { - if (Rand.Next((int)(Dist)) < 2) - { - try - { - xxx = (ushort)(x + xx); - yyy = (ushort)(y + yy + height); - zzz = (ushort)(z + zz); + { + short Dist = (short)(Math.Sqrt(xx * xx + yy * yy + zz * zz)); + if ((Dist < top + 1) && Rand.Next(Dist) < 2) { + ushort xxx = (ushort)(x + xx), yyy = (ushort)(y + yy + height), zzz = (ushort)(z + zz); - if ((xxx != x || zzz != z || yy >= top - 1) && (overwrite || Lvl.GetTile(xxx, yyy, zzz) == Block.air)) - if (blockChange) - if (p == null) Lvl.Blockchange(xxx, yyy, zzz, Block.leaf); - else Lvl.Blockchange(p, xxx, yyy, zzz, Block.leaf); - else Lvl.SetTile(xxx, yyy, zzz, Block.leaf); - } - catch { } - } - } - } + if ((xxx != x || zzz != z || yy >= top - 1) && (overwrite || Lvl.GetTile(xxx, yyy, zzz) == Block.air)) + PlaceBlock(Lvl, blockChange, p, xxx, yyy, zzz, Block.leaf); } } } public static void AddNotchTree(Level Lvl, ushort x, ushort y, ushort z, Random Rand, bool blockChange = false, bool overwrite = true, Player p = null) { - byte dist, tile; byte height = (byte)Rand.Next(3, 7); byte top = (byte)(height - 2); - short xx, yy, zz; - ushort xxx, yyy, zzz; - for (yy = 0; yy <= height; yy++) - { - yyy = (ushort)(y + yy); - tile = Lvl.GetTile(x, yyy, z); + for (int yy = 0; yy <= height; yy++) { + ushort yyy = (ushort)(y + yy); + byte tile = Lvl.GetTile(x, yyy, z); if (overwrite || tile == Block.air || (yyy == y && tile == Block.shrub)) - if (blockChange) - if (p == null) Lvl.Blockchange(x, yyy, z, Block.trunk); - else Lvl.Blockchange(p, x, yyy, z, Block.trunk); - else Lvl.SetTile(x, yyy, z, Block.trunk); + PlaceBlock(Lvl, blockChange, p, x, yyy, z, Block.trunk); } - for (yy = top; yy <= height + 1; yy++) - { - dist = yy > height - 1 ? (byte)1 : (byte)2; - for (xx = (short)-dist; xx <= dist; xx++) + for (int yy = top; yy <= height + 1; yy++) { + int dist = yy > height - 1 ? 1 : 2; + for (int xx = -dist; xx <= dist; xx++) + for (int zz = -dist; zz <= dist; zz++) { - for (zz = (short)-dist; zz <= dist; zz++) - { - xxx = (ushort)(x + xx); - yyy = (ushort)(y + yy); - zzz = (ushort)(z + zz); - tile = Lvl.GetTile(xxx, yyy, zzz); - //Server.s.Log(String.Format("{0} {1} {2}", xxx, yyy, zzz)); + ushort xxx = (ushort)(x + xx), yyy = (ushort)(y + yy), zzz = (ushort)(z + zz); + byte tile = Lvl.GetTile(xxx, yyy, zzz); + if ((xxx == x && zzz == z && yy <= height) || (!overwrite && tile != Block.air)) + continue; - if ((xxx == x && zzz == z && yy <= height) || (!overwrite && tile != Block.air)) - continue; + if (Math.Abs(xx) == dist && Math.Abs(zz) == dist) { + if (yy > height) continue; - if (Math.Abs(xx) == dist && Math.Abs(zz) == dist) - { - if (yy > height) - continue; - - if (Rand.Next(2) == 0) - { - if (blockChange) - if (p == null) Lvl.Blockchange(xxx, yyy, zzz, Block.leaf); - else Lvl.Blockchange(p, xxx, yyy, zzz, Block.leaf); - else Lvl.SetTile(xxx, yyy, zzz, Block.leaf); - } - } - else - { - if (blockChange) - if (p == null) Lvl.Blockchange(xxx, yyy, zzz, Block.leaf); - else Lvl.Blockchange(p, xxx, yyy, zzz, Block.leaf); - else Lvl.SetTile(xxx, yyy, zzz, Block.leaf); - } + if (Rand.Next(2) == 0) + PlaceBlock(Lvl, blockChange, p, xxx, yyy, zzz, Block.leaf); + } else { + PlaceBlock(Lvl, blockChange, p, xxx, yyy, zzz, Block.leaf); } } } @@ -147,58 +99,33 @@ namespace MCGalaxy { public static void AddNotchSwampTree(Level Lvl, ushort x, ushort y, ushort z, Random Rand, bool blockChange = false, bool overwrite = true, Player p = null) { - byte dist, tile; byte height = (byte)Rand.Next(4, 8); byte top = (byte)(height - 2); - short xx, yy, zz; - ushort xxx, yyy, zzz; - for (yy = 0; yy <= height; yy++) - { - yyy = (ushort)(y + yy); - tile = Lvl.GetTile(x, yyy, z); + for (int yy = 0; yy <= height; yy++) { + ushort yyy = (ushort)(y + yy); + byte tile = Lvl.GetTile(x, yyy, z); if (overwrite || tile == Block.air || (yyy == y && tile == Block.shrub)) - if (blockChange) - if (p == null) Lvl.Blockchange(x, yyy, z, Block.trunk); - else Lvl.Blockchange(p, x, yyy, z, Block.trunk); - else Lvl.SetTile(x, yyy, z, Block.trunk); + PlaceBlock(Lvl, blockChange, p, x, yyy, z, Block.trunk); } - for (yy = top; yy <= height + 1; yy++) - { - dist = yy > height - 1 ? (byte)2 : (byte)3; - for (xx = (short)-dist; xx <= dist; xx++) + for (int yy = top; yy <= height + 1; yy++) { + int dist = yy > height - 1 ? 2 : 3; + for (int xx = (short)-dist; xx <= dist; xx++) + for (int zz = (short)-dist; zz <= dist; zz++) { - for (zz = (short)-dist; zz <= dist; zz++) - { - xxx = (ushort)(x + xx); - yyy = (ushort)(y + yy); - zzz = (ushort)(z + zz); - tile = Lvl.GetTile(xxx, yyy, zzz); - //Server.s.Log(String.Format("{0} {1} {2}", xxx, yyy, zzz)); + ushort xxx = (ushort)(x + xx), yyy = (ushort)(y + yy), zzz = (ushort)(z + zz); + byte tile = Lvl.GetTile(xxx, yyy, zzz); - if ((xxx == x && zzz == z && yy <= height) || (!overwrite && tile != Block.air)) - continue; + if ((xxx == x && zzz == z && yy <= height) || (!overwrite && tile != Block.air)) + continue; - if (Math.Abs(xx) == dist && Math.Abs(zz) == dist) - { - if (yy > height) - continue; + if (Math.Abs(xx) == dist && Math.Abs(zz) == dist) { + if (yy > height) continue; - if (Rand.Next(2) == 0) - { - if (blockChange) - if (p == null) Lvl.Blockchange(xxx, yyy, zzz, Block.leaf); - else Lvl.Blockchange(p, xxx, yyy, zzz, Block.leaf); - else Lvl.SetTile(xxx, yyy, zzz, Block.leaf); - } - } - else - { - if (blockChange) - if (p == null) Lvl.Blockchange(xxx, yyy, zzz, Block.leaf); - else Lvl.Blockchange(p, xxx, yyy, zzz, Block.leaf); - else Lvl.SetTile(xxx, yyy, zzz, Block.leaf); - } + if (Rand.Next(2) == 0) + PlaceBlock(Lvl, blockChange, p, xxx, yyy, zzz, Block.leaf); + } else { + PlaceBlock(Lvl, blockChange, p, xxx, yyy, zzz, Block.leaf); } } } @@ -207,62 +134,48 @@ namespace MCGalaxy { public static void AddCactus(Level Lvl, ushort x, ushort y, ushort z, Random Rand, bool blockChange = false, bool overwrite = true, Player p = null) { byte height = (byte)Rand.Next(3, 6); - ushort yy; - for (yy = 0; yy <= height; yy++) - { + for (ushort yy = 0; yy <= height; yy++) { if (overwrite || Lvl.GetTile(z, (ushort)(y + yy), z) == Block.air) - if (blockChange) - if (p == null) Lvl.Blockchange(x, (ushort)(y + yy), z, Block.green); - else Lvl.Blockchange(p, x, (ushort)(y + yy), z, Block.green); - else Lvl.SetTile(x, (ushort)(y + yy), z, Block.green); + PlaceBlock(Lvl, blockChange, p, x, (ushort)(y + yy), z, Block.green); } int inX = 0, inZ = 0; - switch (Rand.Next(1, 3)) - { - case 1: inX = -1; break; + switch (Rand.Next(1, 3)) { + case 1: inX = -1; break; case 2: - default: inZ = -1; break; + default: inZ = -1; break; } - for (yy = height; yy <= Rand.Next(height + 2, height + 5); yy++) - { + for (ushort yy = height; yy <= Rand.Next(height + 2, height + 5); yy++) { if (overwrite || Lvl.GetTile((ushort)(x + inX), (ushort)(y + yy), (ushort)(z + inZ)) == Block.air) - if (blockChange) - if (p == null) Lvl.Blockchange((ushort)(x + inX), (ushort)(y + yy), (ushort)(z + inZ), Block.green); - else Lvl.Blockchange(p, (ushort)(x + inX), (ushort)(y + yy), (ushort)(z + inZ), Block.green); - else Lvl.SetTile((ushort)(x + inX), (ushort)(y + yy), (ushort)(z + inZ), Block.green); + PlaceBlock(Lvl, blockChange, p, (ushort)(x + inX), (ushort)(y + yy), (ushort)(z + inZ), Block.green); } - for (yy = height; yy <= Rand.Next(height + 2, height + 5); yy++) - { - if (overwrite || Lvl.GetTile((ushort)(x + inX), (ushort)(y + yy), (ushort)(z + inZ)) == Block.air) - if (blockChange) - if (p == null) Lvl.Blockchange((ushort)(x - inX), (ushort)(y + yy), (ushort)(z - inZ), Block.green); - else Lvl.Blockchange(p, (ushort)(x - inX), (ushort)(y + yy), (ushort)(z - inZ), Block.green); - else Lvl.SetTile((ushort)(x - inX), (ushort)(y + yy), (ushort)(z - inZ), Block.green); + for (ushort yy = height; yy <= Rand.Next(height + 2, height + 5); yy++) { + if (overwrite || Lvl.GetTile((ushort)(x - inX), (ushort)(y + yy), (ushort)(z - inZ)) == Block.air) + PlaceBlock(Lvl, blockChange, p, (ushort)(x - inX), (ushort)(y + yy), (ushort)(z - inZ), Block.green); } } - public static bool TreeCheck(Level Lvl, ushort x, ushort z, ushort y, short dist) //return true if tree is near - { - byte foundTile; - for (short xx = (short)-dist; xx <= +dist; ++xx) + public static bool TreeCheck(Level Lvl, ushort x, ushort z, ushort y, short dist) { //return true if tree is near + for (short yy = (short)-dist; yy <= +dist; ++yy) + for (short zz = (short)-dist; zz <= +dist; ++zz) + for (short xx = (short)-dist; xx <= +dist; ++xx) { - for (short yy = (short)-dist; yy <= +dist; ++yy) - { - for (short zz = (short)-dist; zz <= +dist; ++zz) - { - foundTile = Lvl.GetTile((ushort)(x + xx), (ushort)(z + zz), (ushort)(y + yy)); - if (foundTile == Block.trunk || foundTile == Block.green) - { - return true; - } - } - } + byte foundTile = Lvl.GetTile((ushort)(x + xx), (ushort)(z + zz), (ushort)(y + yy)); + if (foundTile == Block.trunk || foundTile == Block.green) return true; } return false; } + + static void PlaceBlock(Level lvl, bool blockChange, Player p, ushort x, ushort y, ushort z, byte type) { + if (blockChange) { + if (p == null) lvl.Blockchange(x, y, z, type); + else lvl.UpdateBlock(p, x, y, z, type, 0); + } else { + lvl.SetTile(x, y, z, type); + } + } } } \ No newline at end of file diff --git a/Levels/IO/LvlFile.cs b/Levels/IO/LvlFile.cs index 0fda40bc4..75c12ef1c 100644 --- a/Levels/IO/LvlFile.cs +++ b/Levels/IO/LvlFile.cs @@ -77,7 +77,7 @@ namespace MCGalaxy.Levels.IO { } } - public static Level Load(string name, string file, bool loadTexturesConfig = true) { + public static Level Load(string name, string file) { using (Stream fs = File.OpenRead(file), gs = new GZipStream(fs, CompressionMode.Decompress, true)) { @@ -97,8 +97,7 @@ namespace MCGalaxy.Levels.IO { vars[1] = BitConverter.ToUInt16(header, offset); vars[2] = BitConverter.ToUInt16(header, offset + 2); - Level level = new Level(name, vars[0], vars[2], vars[1], - "full_empty", 0, loadTexturesConfig); + Level level = new Level(name, vars[0], vars[2], vars[1], "full_empty"); level.spawnx = BitConverter.ToUInt16(header, offset + 4); level.spawnz = BitConverter.ToUInt16(header, offset + 6); level.spawny = BitConverter.ToUInt16(header, offset + 8); diff --git a/Levels/Level.Blocks.cs b/Levels/Level.Blocks.cs index bb88ea9bb..c38fc8cb2 100644 --- a/Levels/Level.Blocks.cs +++ b/Levels/Level.Blocks.cs @@ -443,8 +443,7 @@ namespace MCGalaxy { public int PosToInt(ushort x, ushort y, ushort z) { if (x < 0 || x >= Width || y < 0 || y >= Height || z < 0 || z >= Length) return -1; - return x + (z * Width) + (y * Width * Length); - //alternate method: (h * widthY + y) * widthX + x; + return x + Width * (z + y * Length); } public void IntToPos(int pos, out ushort x, out ushort y, out ushort z) { diff --git a/Levels/LevelInfo.cs b/Levels/LevelInfo.cs index 7363e8f23..9b4323ab9 100644 --- a/Levels/LevelInfo.cs +++ b/Levels/LevelInfo.cs @@ -47,6 +47,14 @@ namespace MCGalaxy { return File.Exists("levels/" + name.ToLower() + ".lvl"); } + public static bool ExistsBackup(string name, string backup) { + return File.Exists(BackupPath(name, backup)); + } + + public static string BackupPath(string name, string backup) { + return Server.backupLocation + "/" + name + "/" + backup + "/" + name + ".lvl"; + } + public static string FindOfflineProperty(string name, string propKey) { string file = "levels/level properties/" + name + ".properties"; if (!File.Exists(file))