mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-10-03 10:33:29 -04:00
Move some of generation stuff out of CmdNewLvl and into MapGen
This commit is contained in:
parent
948a4ba231
commit
5e36cd4446
@ -20,6 +20,7 @@
|
||||
using System;
|
||||
using MCGalaxy.Commands.World;
|
||||
using MCGalaxy.Games;
|
||||
using MCGalaxy.Generator;
|
||||
|
||||
namespace MCGalaxy.Commands.Fun {
|
||||
|
||||
@ -61,7 +62,7 @@ namespace MCGalaxy.Commands.Fun {
|
||||
}
|
||||
|
||||
ushort x = 0, y = 0, z = 0;
|
||||
if (!CmdNewLvl.GetDimensions(p, args, 1, ref x, ref y, ref z)) return;
|
||||
if (!MapGen.GetDimensions(p, args, 1, ref x, ref y, ref z)) return;
|
||||
|
||||
CountdownGame game = (CountdownGame)game_;
|
||||
game.GenerateMap(p, x, y, z);
|
||||
|
@ -51,61 +51,11 @@ namespace MCGalaxy.Commands.World {
|
||||
if (gen == null) { MapGen.PrintThemes(p); return null; }
|
||||
|
||||
ushort x = 0, y = 0, z = 0;
|
||||
string name = args[0].ToLower();
|
||||
if (!GetDimensions(p, args, 1, ref x, ref y, ref z)) return null;
|
||||
if (!MapGen.GetDimensions(p, args, 1, ref x, ref y, ref z)) return null;
|
||||
string seed = args.Length == 6 ? args[5] : "";
|
||||
|
||||
if (!Formatter.ValidMapName(p, name)) return null;
|
||||
if (LevelInfo.MapExists(name)) {
|
||||
p.Message("%WLevel \"{0}\" already exists", name); return null;
|
||||
}
|
||||
if (gen.Type == GenType.Advanced && !CheckExtraPerm(p, data, 1)) return null;
|
||||
|
||||
if (Interlocked.CompareExchange(ref p.GeneratingMap, 1, 0) == 1) {
|
||||
p.Message("You are already generating a map, please wait until that map has finished generating first.");
|
||||
return null;
|
||||
}
|
||||
|
||||
Level lvl;
|
||||
try {
|
||||
p.Message("Generating map \"{0}\"..", name);
|
||||
lvl = new Level(name, x, y, z);
|
||||
if (!gen.Generate(p, lvl, seed)) { lvl.Dispose(); return null; }
|
||||
|
||||
string format = seed.Length > 0 ? "{0}%S created level {1}%S with seed \"{2}\"" : "{0}%S created level {1}";
|
||||
string msg = string.Format(format, p.ColoredName, lvl.ColoredName, seed);
|
||||
Chat.MessageGlobal(msg);
|
||||
} finally {
|
||||
Interlocked.Exchange(ref p.GeneratingMap, 0);
|
||||
Server.DoGC();
|
||||
}
|
||||
return lvl;
|
||||
}
|
||||
|
||||
|
||||
internal static bool GetDimensions(Player p, string[] args, int i, ref ushort x, ref ushort y, ref ushort z) {
|
||||
return
|
||||
CheckMapAxis(p, args[i ], "Width", ref x) &&
|
||||
CheckMapAxis(p, args[i + 1], "Height", ref y) &&
|
||||
CheckMapAxis(p, args[i + 2], "Length", ref z) &&
|
||||
CheckMapVolume(p, x, y, z);
|
||||
}
|
||||
|
||||
static bool CheckMapAxis(Player p, string input, string type, ref ushort len) {
|
||||
return CommandParser.GetUShort(p, input, type, ref len, 1, 16384);
|
||||
}
|
||||
|
||||
static bool CheckMapVolume(Player p, int x, int y, int z) {
|
||||
if (p.IsConsole) return true;
|
||||
int limit = p.group.GenVolume;
|
||||
if ((long)x * y * z <= limit) return true;
|
||||
|
||||
string text = "%WYou cannot create a map with over ";
|
||||
if (limit > 1000 * 1000) text += (limit / (1000 * 1000)) + " million blocks";
|
||||
else if (limit > 1000) text += (limit / 1000) + " thousand blocks";
|
||||
else text += limit + " blocks";
|
||||
p.Message(text);
|
||||
return false;
|
||||
return MapGen.Generate(p, gen, args[0], x, y, z, seed);
|
||||
}
|
||||
|
||||
public override void Help(Player p) {
|
||||
|
@ -50,7 +50,7 @@ namespace MCGalaxy.Commands.World {
|
||||
if (!LevelInfo.Check(p, data.Rank, lvl, "resize this level")) return false;
|
||||
|
||||
ushort x = 0, y = 0, z = 0;
|
||||
if (!CmdNewLvl.GetDimensions(p, args, 1, ref x, ref y, ref z)) return false;
|
||||
if (!MapGen.GetDimensions(p, args, 1, ref x, ref y, ref z)) return false;
|
||||
|
||||
bool confirmed = args.Length > 4 && args[4].CaselessEq("confirm");
|
||||
if (!confirmed && (x < lvl.Width || y < lvl.Height || z < lvl.Length)) {
|
||||
|
@ -70,7 +70,7 @@ namespace MCGalaxy.Eco {
|
||||
|
||||
protected void UseCommand(Player p, string cmd, string args) {
|
||||
CommandData data = default(CommandData);
|
||||
data.Rank = LevelPermission.Nobody;
|
||||
data.Rank = LevelPermission.Nobody;
|
||||
data.Context = CommandContext.Purchase;
|
||||
Command.Find(cmd).Use(p, args, data);
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ namespace MCGalaxy.Eco {
|
||||
preset.name = args[2];
|
||||
|
||||
ushort x = 0, y = 0, z = 0;
|
||||
if (!CmdNewLvl.GetDimensions(p, args, 3, ref x, ref y, ref z)) return;
|
||||
if (!MapGen.GetDimensions(p, args, 3, ref x, ref y, ref z)) return;
|
||||
preset.x = args[3]; preset.y = args[4]; preset.z = args[5];
|
||||
|
||||
if (MapGen.Find(args[6]) == null) {
|
||||
@ -166,7 +166,7 @@ namespace MCGalaxy.Eco {
|
||||
if (args[3] == "z") dims[2] = args[4];
|
||||
|
||||
ushort x = 0, y = 0, z = 0;
|
||||
if (!CmdNewLvl.GetDimensions(p, dims, 0, ref x, ref y, ref z)) return;
|
||||
if (!MapGen.GetDimensions(p, dims, 0, ref x, ref y, ref z)) return;
|
||||
preset.x = dims[0]; preset.y = dims[1]; preset.z = dims[2];
|
||||
|
||||
p.Message("&aSuccessfully changed preset {0} size to &f{1}", args[3], args[4]);
|
||||
|
@ -17,6 +17,8 @@
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using MCGalaxy.Commands;
|
||||
|
||||
namespace MCGalaxy.Generator {
|
||||
public delegate bool MapGenFunc(Player p, Level lvl, string seed);
|
||||
@ -83,6 +85,62 @@ namespace MCGalaxy.Generator {
|
||||
AdvNoiseGen.RegisterGenerators();
|
||||
Register("Heightmap", GenType.Advanced, HeightmapGen.Generate,
|
||||
"%HSeed specifies the URL of the heightmap image");
|
||||
}
|
||||
|
||||
|
||||
public static Level Generate(Player p, MapGen gen, string name,
|
||||
ushort x, ushort y, ushort z, string seed) {
|
||||
name = name.ToLower();
|
||||
if (!Formatter.ValidMapName(p, name)) return null;
|
||||
if (LevelInfo.MapExists(name)) {
|
||||
p.Message("%WLevel \"{0}\" already exists", name); return null;
|
||||
}
|
||||
|
||||
if (Interlocked.CompareExchange(ref p.GeneratingMap, 1, 0) == 1) {
|
||||
p.Message("You are already generating a map, please wait until that map has finished generating first.");
|
||||
return null;
|
||||
}
|
||||
|
||||
Level lvl;
|
||||
try {
|
||||
p.Message("Generating map \"{0}\"..", name);
|
||||
lvl = new Level(name, x, y, z);
|
||||
if (!gen.Generate(p, lvl, seed)) { lvl.Dispose(); return null; }
|
||||
|
||||
string format = seed.Length > 0 ? "{0}%S created level {1}%S with seed \"{2}\"" : "{0}%S created level {1}";
|
||||
string msg = string.Format(format, p.ColoredName, lvl.ColoredName, seed);
|
||||
Chat.MessageGlobal(msg);
|
||||
} finally {
|
||||
Interlocked.Exchange(ref p.GeneratingMap, 0);
|
||||
Server.DoGC();
|
||||
}
|
||||
return lvl;
|
||||
}
|
||||
|
||||
public static bool GetDimensions(Player p, string[] args, int i,
|
||||
ref ushort x, ref ushort y, ref ushort z) {
|
||||
return
|
||||
CheckMapAxis(p, args[i ], "Width", ref x) &&
|
||||
CheckMapAxis(p, args[i + 1], "Height", ref y) &&
|
||||
CheckMapAxis(p, args[i + 2], "Length", ref z) &&
|
||||
CheckMapVolume(p, x, y, z);
|
||||
}
|
||||
|
||||
static bool CheckMapAxis(Player p, string input, string type, ref ushort len) {
|
||||
return CommandParser.GetUShort(p, input, type, ref len, 1, 16384);
|
||||
}
|
||||
|
||||
static bool CheckMapVolume(Player p, int x, int y, int z) {
|
||||
if (p.IsConsole) return true;
|
||||
int limit = p.group.GenVolume;
|
||||
if ((long)x * y * z <= limit) return true;
|
||||
|
||||
string text = "%WYou cannot create a map with over ";
|
||||
if (limit > 1000 * 1000) text += (limit / (1000 * 1000)) + " million blocks";
|
||||
else if (limit > 1000) text += (limit / 1000) + " thousand blocks";
|
||||
else text += limit + " blocks";
|
||||
p.Message(text);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user