Add basic heightmap generator.

This commit is contained in:
UnknownShadow200 2016-07-20 16:28:02 +10:00
parent 466889a933
commit 1a4acd6c9b
35 changed files with 101 additions and 43 deletions

View File

@ -26,7 +26,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Other; } }
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can set bots to be killer") }; }
}

View File

@ -27,7 +27,7 @@ namespace MCGalaxy.Commands.CPE {
public override string type { get { return CommandTypes.Other; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can change the model of others") }; }
}
public override CommandAlias[] Aliases {

View File

@ -27,7 +27,7 @@ namespace MCGalaxy.Commands.CPE {
public override string type { get { return CommandTypes.Other; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can change the skin of others") }; }
}

View File

@ -25,7 +25,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Chat; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.AdvBuilder, "+ can create chatrooms"),
new CommandPerm(LevelPermission.AdvBuilder, "+ can delete an empty chatroom"),

View File

@ -25,7 +25,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Chat; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can change the color of others") }; }
}
public override CommandAlias[] Aliases {

View File

@ -26,7 +26,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Chat; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can change the nick of other players") }; }
}
public override CommandAlias[] Aliases {

View File

@ -24,7 +24,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Chat; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Admin; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can change the title color of others") }; }
}
public override CommandAlias[] Aliases {

View File

@ -25,7 +25,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Chat; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Admin; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Admin, "+ can change the title of others") }; }
}
public override CommandAlias[] Aliases {

View File

@ -32,7 +32,7 @@ namespace MCGalaxy {
public abstract void Use(Player p, string message);
public abstract void Help(Player p);
public virtual void Help(Player p, string message) { Help(p); Formatter.PrintCommandInfo(p, this); }
public virtual CommandPerm[] AdditionalPerms { get { return null; } }
public virtual CommandPerm[] ExtraPerms { get { return null; } }
public virtual CommandEnable Enabled { get { return CommandEnable.Always; } }
public virtual CommandAlias[] Aliases { get { return null; } }

View File

@ -26,7 +26,7 @@ namespace MCGalaxy
public void Add(Command cmd) {
commands.Add(cmd);
CommandPerm[] perms = cmd.AdditionalPerms;
CommandPerm[] perms = cmd.ExtraPerms;
if (!AddOtherPerms || perms == null) return;
for (int i = 0; i < perms.Length; i++)

View File

@ -29,7 +29,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Economy; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can setup the economy") }; }
}

View File

@ -33,7 +33,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Games; } }
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can send the countdown rules to everybody"),
new CommandPerm(LevelPermission.Operator, "+ can setup countdown (download/start/restart/enable/disable/cancel)"),

View File

@ -26,7 +26,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Games; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.AdvBuilder, "+ can create teams") }; }
}

View File

@ -27,7 +27,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Games; } }
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can use admin commands for tntwars") }; }
}
bool DeleteZone = false, CheckZone = false, NoTntZone = false;

View File

@ -29,7 +29,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Information; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can set rank requirements."),
}; }

View File

@ -27,7 +27,7 @@ namespace MCGalaxy.Commands
public override string type { get { return CommandTypes.Information; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Builder, "can send rules to other players") }; }
}

View File

@ -31,7 +31,7 @@ namespace MCGalaxy.Commands {
public override CommandAlias[] Aliases {
get { return new[] { new CommandAlias("host"), new CommandAlias("zall") }; }
}
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Admin, "+ can see server CPU and memory usage") }; }
}

View File

@ -27,7 +27,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Information; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.AdvBuilder, "+ can see IPs and if a player is whitelisted") }; }
}
public override CommandAlias[] Aliases {

View File

@ -25,7 +25,7 @@ namespace MCGalaxy.Commands
public override string type { get { return CommandTypes.Moderation; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Admin, "+ can hide/unhide without showing a message to ops") }; }
}
public override CommandAlias[] Aliases {

View File

@ -29,7 +29,7 @@ namespace MCGalaxy.Commands
public override string type { get { return CommandTypes.Moderation; } }
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.Builder; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Guest, " and below are patrolled") }; }
}

View File

@ -27,7 +27,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Moderation; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can see the review queue"),
new CommandPerm(LevelPermission.Operator, "+ can teleport to next in review queue"),

View File

@ -24,7 +24,7 @@ namespace MCGalaxy.Commands {
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 CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can delete zones"),
new CommandPerm(LevelPermission.Operator, "+ can delete all zones"),

View File

@ -23,7 +23,7 @@ namespace MCGalaxy.Commands.World {
public override string type { get { return CommandTypes.World; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Admin, "+ can change the main level") }; }
}
public CmdMain() { }

View File

@ -24,7 +24,7 @@ namespace MCGalaxy.Commands.World {
public override string type { get { return CommandTypes.World; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can edit map options"),
new CommandPerm(LevelPermission.Admin, "+ can set realm owners") }; }
}

View File

@ -26,6 +26,9 @@ namespace MCGalaxy.Commands.World {
public override string type { get { return CommandTypes.World; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Admin; } }
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Admin, "+ can generate maps with advanced themes") }; }
}
public CmdNewLvl() { }
public override void Use(Player p, string message) {
@ -49,6 +52,9 @@ namespace MCGalaxy.Commands.World {
if (LevelInfo.ExistsOffline(name)) {
Player.Message(p, "Level \"{0}\" already exists", name); return;
}
if (!MapGen.IsSimpleTheme(args[4]) && !CheckExtraPerm(p)) {
MessageNeedExtra(p, "can generate maps with advanced themes."); return;
}
try {
using (Level lvl = new Level(name, x, y, z)) {

View File

@ -26,7 +26,7 @@ namespace MCGalaxy.Commands {
public override CommandAlias[] Aliases {
get { return new [] { new CommandAlias("rejoin"), new CommandAlias("rd") }; }
}
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can reload for other players") }; }
}

View File

@ -71,7 +71,7 @@ namespace MCGalaxy.Commands.Building {
DrawArgs dArgs = default(DrawArgs);
dArgs.layer = layer;
dArgs.bitmapLoc = bitmapLoc;
dArgs.name = bitmapLoc;
dArgs.popType = popType;
Player.Message(p, "Place two blocks to determine direction.");
p.MakeSelection(2, dArgs, DoImage);
@ -97,15 +97,13 @@ namespace MCGalaxy.Commands.Building {
}
void DoDrawImage(Player p, Vec3S32 p0, DrawArgs dArgs, int direction) {
Bitmap bmp = null;
Bitmap bmp = HeightmapGen.ReadBitmap(dArgs.name, "extra/images/", p);
if (bmp == null) return;
try {
bmp = new Bitmap("extra/images/" + dArgs.bitmapLoc + ".bmp");
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
} catch (Exception ex) {
Server.ErrorLog(ex);
if (bmp != null) bmp.Dispose();
Player.Message(p, "&cThere was an error reading the downloaded image.");
Player.Message(p, "&cThe url may need to end with its extension (such as .jpg).");
bmp.Dispose();
return;
}
@ -171,7 +169,7 @@ namespace MCGalaxy.Commands.Building {
p.level.UpdateBlock(p, (ushort)P.X, (ushort)P.Y, (ushort)P.Z, cur.type, 0);
}
if (dArgs.bitmapLoc == "tempImage_" + p.name)
if (dArgs.name == "tempImage_" + p.name)
File.Delete("extra/images/tempImage_" + p.name + ".bmp");
Player.Message(p, "Finished printing image using " + ImagePalette.Names[popType]);
}
@ -186,7 +184,7 @@ namespace MCGalaxy.Commands.Building {
Player.Message(p, "Use switch (&flayer%S) or (&fl%S) to print horizontally.");
}
struct DrawArgs { public bool layer; public byte popType; public string bitmapLoc; }
struct DrawArgs { public bool layer; public byte popType; public string name; }
}
}

View File

@ -29,7 +29,7 @@ namespace MCGalaxy.Commands.Building {
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } }
public CmdMessageBlock() { }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Nobody, "+ can use moderation commands in MBs") }; }
}

View File

@ -26,7 +26,7 @@ namespace MCGalaxy.Commands.Building {
public override string type { get { return CommandTypes.Building; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can undo other players"),
new CommandPerm(LevelPermission.AdvBuilder, "+ can undo physics"),

View File

@ -28,7 +28,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Other; } }
public override bool museumUsable { get { return true; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] { new CommandPerm(LevelPermission.Operator, "+ can check, view and delete reports") }; }
}
public override CommandAlias[] Aliases {

View File

@ -24,7 +24,7 @@ namespace MCGalaxy.Commands
public override string type { get { return CommandTypes.Other; } }
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.Builder; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can use big TNT"),
new CommandPerm(LevelPermission.Operator, "+ can allow/disallow tnt"),

View File

@ -25,7 +25,7 @@ namespace MCGalaxy.Commands {
public override string type { get { return CommandTypes.Other; } }
public override bool museumUsable { get { return false; } }
public override LevelPermission defaultRank { get { return LevelPermission.Guest; } }
public override CommandPerm[] AdditionalPerms {
public override CommandPerm[] ExtraPerms {
get { return new[] {
new CommandPerm(LevelPermission.Operator, "+ can create warps"),
new CommandPerm(LevelPermission.Operator, "+ can delete warps"),

View File

@ -14,14 +14,18 @@
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.Drawing;
using System.IO;
using System.Net;
namespace MCGalaxy.Generator {
public static class HeightmapGen {
public static bool DownloadImage(string url, string dir, Player p) {
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
if (!url.StartsWith("http://") && !url.StartsWith("https://"))
url = "http://" + url;
@ -39,5 +43,50 @@ namespace MCGalaxy.Generator {
return false;
}
}
public static Bitmap ReadBitmap(string name, string dir, Player p) {
Bitmap bmp = null;
try {
bmp = new Bitmap(dir + name + ".bmp");
int width = bmp.Width;
// sometimes Mono will return an invalid bitmap instance that throws ArgumentNullException,
// so we make sure to check for that here rather than later.
return bmp;
} catch (Exception ex) {
Server.ErrorLog(ex);
if (bmp != null) bmp.Dispose();
Player.Message(p, "&cThere was an error reading the downloaded image.");
Player.Message(p, "&cThe url may need to end with its extension (such as .jpg).");
return null;
}
}
public static bool Generate(MapGenArgs args) {
Player p = args.Player;
Level lvl = args.Level;
if (args.Args == "") { Player.Message(p, "You need to provide a url for the image."); return false; }
if (!DownloadImage(args.Args, "extra/heightmap/", p )) return false;
Bitmap bmp = ReadBitmap("tempImage_" + p.name, "extra/heightmap/", p);
if (bmp == null) return false;
if (lvl.Width != bmp.Width || lvl.Length != bmp.Height) {
Player.Message(p, "The size of the heightmap is {0} by {1}.", bmp.Width, bmp.Height);
Player.Message(p, "The width and length of the new level must match that size.");
return false;
}
int index = 0, oneY = lvl.Width * lvl.Height;
using (bmp) {
for (int z = 0; z < bmp.Height; z++)
for (int x = 0; x < bmp.Width; x++)
{
int height = bmp.GetPixel(x, z).R * lvl.Height / 255;
for (int y = 0; y < height; y++)
lvl.blocks[index + oneY * y] = Block.stone;
index++;
}
}
return true;
}
}
}

View File

@ -23,7 +23,7 @@ namespace MCGalaxy.Generator {
public struct MapGenArgs {
public Player Player;
public Level Level;
public string Theme, RawArgs;
public string Theme, Args;
public bool UseSeed;
public int Seed;
}
@ -35,6 +35,10 @@ namespace MCGalaxy.Generator {
return simpleGens.ContainsKey(s) || advGens.ContainsKey(s);
}
public static bool IsSimpleTheme(string s) {
return simpleGens.ContainsKey(s.ToLower());
}
public static void PrintThemes(Player p) {
Player.Message(p, "Simple themes: " + simpleGens.Keys.Concatenate(", "));
Player.Message(p, "Advanced themes: " + advGens.Keys.Concatenate(", "));
@ -47,7 +51,7 @@ namespace MCGalaxy.Generator {
public static bool Generate(Level lvl, string theme, string args, Player p) {
MapGenArgs genArgs = new MapGenArgs();
genArgs.Level = lvl; genArgs.Player = p;
genArgs.Theme = theme; genArgs.RawArgs = args;
genArgs.Theme = theme; genArgs.Args = args;
genArgs.UseSeed = args != "";
if (genArgs.UseSeed && !int.TryParse(args, out genArgs.Seed))
@ -76,6 +80,7 @@ namespace MCGalaxy.Generator {
advGens = new Dictionary<string, Func<MapGenArgs, bool>>();
SimpleGen.RegisterGenerators();
AdvNoiseGen.RegisterGenerators();
RegisterAdvancedGen("heightmap", HeightmapGen.Generate);
}
}
}

View File

@ -51,7 +51,7 @@ namespace MCGalaxy {
Player.Message(p, builder.ToString());
PrintAliases(p, cmd);
CommandPerm[] addPerms = cmd.AdditionalPerms;
CommandPerm[] addPerms = cmd.ExtraPerms;
if (addPerms == null) return;
Player.Message(p, "%TExtra permissions:");