mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-26 06:43:25 -04:00
Fix /rs to work with custom blocks, modify more commands to use UpdateBlock now.
This commit is contained in:
parent
ff46ad26c2
commit
9b63b0bd69
@ -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 <number> - restores a previous backup of the current selection");
|
||||
}
|
||||
}
|
||||
|
@ -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 + ").");
|
||||
}
|
||||
|
||||
|
@ -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.");
|
||||
|
@ -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<Pos> list, ushort x, ushort y, ushort z)
|
||||
{
|
||||
Pos pos; pos.x = x; pos.y = y; pos.z = z; list.Add(pos);
|
||||
}
|
||||
|
||||
struct Pos
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<Pos> 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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 <me@matvei.org>
|
||||
/*
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user