Esempio n. 1
0
        static bool DoRemove(Player p, Level lvl, BlockID block,
                             bool global, string cmd)
        {
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : lvl.CustomBlockDefs;
            BlockDefinition   def  = defs[block];

            if (!ExistsInScope(def, block, global))
            {
                MessageNoBlock(p, block, global, cmd); return(false);
            }

            BlockDefinition.Remove(def, defs, lvl);
            ResetProps(global, lvl, block, p);

            string scope = global ? "global" : "level";

            p.Message("Removed " + scope + " custom block " + def.Name + "(" + def.RawID + ")");

            BlockDefinition globalDef = BlockDefinition.GlobalDefs[block];

            if (!global && globalDef != null)
            {
                BlockDefinition.Add(globalDef, defs, lvl);
            }
            return(true);
        }
Esempio n. 2
0
        void RemoveHandler(Player p, string[] parts, bool global)
        {
            if (parts.Length <= 1)
            {
                Help(p); return;
            }
            int blockId;

            if (!CheckBlockId(p, parts[1], global, out blockId))
            {
                return;
            }

            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   def  = defs[blockId];

            if (!ExistsInScope(def, blockId, global))
            {
                MessageNoBlock(p, blockId, global); return;
            }

            BlockDefinition.Remove(def, defs, p == null ? null : p.level);
            BlockDefinition globalDef = BlockDefinition.GlobalDefs[blockId];

            if (!global && globalDef != null)
            {
                BlockDefinition.Add(globalDef, defs, p == null ? null : p.level);
            }
        }
Esempio n. 3
0
        static void RemoveHandler(Player p, string[] parts, bool global, string cmd)
        {
            if (parts.Length <= 1)
            {
                Help(p, cmd); return;
            }
            BlockID block;

            if (!CheckBlock(p, parts[1], out block))
            {
                return;
            }

            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   def  = defs[block];

            if (!ExistsInScope(def, block, global))
            {
                MessageNoBlock(p, block, global, cmd); return;
            }

            BlockDefinition.Remove(def, defs, p.IsSuper ? null : p.level);
            ResetProps(global, block, p);

            string scope = global ? "global" : "level";

            p.Message("Removed " + scope + " custom block " + def.Name + "(" + def.RawID + ")");

            BlockDefinition globalDef = BlockDefinition.GlobalDefs[block];

            if (!global && globalDef != null)
            {
                BlockDefinition.Add(globalDef, defs, p.level);
            }
        }
Esempio n. 4
0
        void CopyHandler(Player p, string[] parts, bool global)
        {
            int srcId, dstId;

            if (!CheckBlockId(p, parts[1], global, out srcId))
            {
                return;
            }
            if (!CheckBlockId(p, parts[2], global, out dstId))
            {
                return;
            }
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            string            cmd  = global ? "/gb" : "/lb";

            BlockDefinition src = defs[srcId], dst = defs[dstId];

            if (!ExistsInScope(src, srcId, global))
            {
                MessageNoBlock(p, srcId, global); return;
            }
            if (ExistsInScope(dst, dstId, global))
            {
                MessageAlreadyBlock(p, dstId, global); return;
            }

            dst         = src.Copy();
            dst.BlockID = (byte)dstId;
            BlockDefinition.Add(dst, defs, p == null ? null : p.level);
            string scope = global ? "global" : "level";

            Player.SendMessage(p, "Duplicated the " + scope + " custom block " +
                               "with id \"" + srcId + "\" to \"" + dstId + "\".");
        }
Esempio n. 5
0
        static bool AddCustomBlock(Player p, BlockDefinition bd, bool global, string cmd)
        {
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   def  = defs[bd.BlockID];

            if (!global && def == BlockDefinition.GlobalDefs[bd.BlockID])
            {
                def = null;
            }

            // in case the list is modified before we finish the command.
            if (def != null)
            {
                bd.BlockID = GetFreeId(global, p == null ? null : p.level);
                if (bd.BlockID == Block.Invalid)
                {
                    Player.Message(p, "There are no custom block ids left, " +
                                   "you must " + cmd + " remove a custom block first.");
                    if (!global)
                    {
                        Player.Message(p, "You may also manually specify the same existing id of a global custom block.");
                    }
                    return(false);
                }
            }

            string scope = global ? "global" : "level";

            Player.Message(p, "Created a new " + scope + " custom block " + bd.Name + "(" + bd.BlockID + ")");
            AddBlockProperties(global, bd.BlockID, p);
            BlockDefinition.Add(bd, defs, p == null ? null : p.level);
            return(true);
        }
Esempio n. 6
0
        static void RemoveHandler(Player p, string[] parts, bool global, string cmd)
        {
            if (parts.Length <= 1)
            {
                Help(p, cmd); return;
            }
            int id;

            if (!CheckBlockId(p, parts[1], global, out id))
            {
                return;
            }

            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   def  = defs[id];

            if (!ExistsInScope(def, id, global))
            {
                MessageNoBlock(p, id, global, cmd); return;
            }

            RemoveBlockProperties(global, (byte)id, p);
            BlockDefinition.Remove(def, defs, p == null ? null : p.level);

            BlockDefinition globalDef = BlockDefinition.GlobalDefs[id];

            if (!global && globalDef != null)
            {
                BlockDefinition.Add(globalDef, defs, p.level);
            }
        }
Esempio n. 7
0
        static void UpdateBlock(Player p, Level lvl, BlockDefinition def, bool global)
        {
            BlockDefinition[] defs  = global ? BlockDefinition.GlobalDefs : lvl.CustomBlockDefs;
            BlockID           block = def.GetBlock();

            string scope = global ? "global" : "level";

            p.Message("Created a new " + scope + " custom block " + def.Name + "(" + def.RawID + ")");

            block = def.GetBlock();
            BlockDefinition.Add(def, defs, lvl);
            ResetProps(global, lvl, block, p);
        }
Esempio n. 8
0
        static void CopyHandler(Player p, string[] parts, bool global, string cmd)
        {
            if (parts.Length <= 2)
            {
                Help(p, cmd); return;
            }
            int srcId, dstId;

            if (!CheckBlockId(p, parts[1], global, out srcId))
            {
                return;
            }
            if (!CheckBlockId(p, parts[2], global, out dstId))
            {
                return;
            }
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;

            BlockDefinition src = defs[srcId], dst = defs[dstId];

            if (defs[srcId] == null)
            {
                MessageNoBlock(p, srcId, global, cmd); return;
            }
            if (ExistsInScope(dst, dstId, global))
            {
                MessageAlreadyBlock(p, dstId, global, cmd); return;
            }

            dst         = src.Copy();
            dst.BlockID = (byte)dstId;
            AddBlockProperties(global, (byte)dstId, p);
            BlockDefinition.Add(dst, defs, p == null ? null : p.level);

            bool   globalBlock = defs[srcId] == BlockDefinition.GlobalDefs[srcId];
            string scope       = globalBlock ? "global" : "level";

            Player.Message(p, "Duplicated the {0} custom block with id \"{1}\" to \"{2}\".", scope, srcId, dstId);
        }
Esempio n. 9
0
        static bool AddBlock(Player p, Level lvl, BlockDefinition def,
                             bool global, string cmd, BlockProps props)
        {
            BlockDefinition[] defs  = global ? BlockDefinition.GlobalDefs : lvl.CustomBlockDefs;
            BlockID           block = def.GetBlock();
            BlockDefinition   old   = defs[block];

            if (!global && old == BlockDefinition.GlobalDefs[block])
            {
                old = null;
            }

            // in case the list is modified before we finish the command.
            if (old != null)
            {
                block = GetFreeBlock(global, lvl);
                if (block == Block.Invalid)
                {
                    p.Message("There are no custom block ids left, " +
                              "you must " + cmd + " remove a custom block first.");
                    if (!global)
                    {
                        p.Message("You may also manually specify the same existing id of a global custom block.");
                    }
                    return(false);
                }
                def.SetBlock(block);
            }

            string scope = global ? "global" : "level";

            p.Message("Created a new " + scope + " custom block " + def.Name + "(" + def.RawID + ")");

            block = def.GetBlock();
            BlockDefinition.Add(def, defs, lvl);
            ResetProps(global, lvl, block, p);
            return(true);
        }
Esempio n. 10
0
        static bool AddBlock(Player p, BlockDefinition def, bool global, string cmd, BlockProps props)
        {
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   old  = defs[def.BlockID];

            if (!global && old == BlockDefinition.GlobalDefs[def.BlockID])
            {
                old = null;
            }
            ExtBlock block;

            // in case the list is modified before we finish the command.
            if (old != null)
            {
                block = GetFreeBlock(global, p == null ? null : p.level);
                if (block.IsInvalid)
                {
                    Player.Message(p, "There are no custom block ids left, " +
                                   "you must " + cmd + " remove a custom block first.");
                    if (!global)
                    {
                        Player.Message(p, "You may also manually specify the same existing id of a global custom block.");
                    }
                    return(false);
                }
                def.BlockID = block.RawID;
            }

            string scope = global ? "global" : "level";

            Player.Message(p, "Created a new " + scope + " custom block " + def.Name + "(" + def.BlockID + ")");

            block = ExtBlock.FromRaw(def.BlockID);
            BlockDefinition.Add(def, defs, p == null ? null : p.level);
            UpdateBlockProps(global, p, block, props);
            return(true);
        }
Esempio n. 11
0
        static bool DoEdit(Player p, Level lvl, BlockID block, string[] parts,
                           bool global, string cmd)
        {
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : lvl.CustomBlockDefs;
            BlockDefinition   def = defs[block], globalDef = BlockDefinition.GlobalDefs[block];

            if (def == null && block < Block.CpeCount)
            {
                def = DefaultSet.MakeCustomBlock(block);
                UpdateBlock(p, lvl, def, global);
            }
            if (def != null && !global && def == globalDef)
            {
                def = globalDef.Copy();
                UpdateBlock(p, lvl, def, global);
            }
            if (!ExistsInScope(def, block, global))
            {
                MessageNoBlock(p, block, global, cmd); return(false);
            }

            string value = parts[3], blockName = def.Name;
            bool   temp = false, changedFallback = false;

            string arg = MapPropertyName(parts[2].ToLower());

            switch (arg)
            {
            case "name":
                def.Name = value; break;

            case "collide":
                if (!EditByte(p, value, "Collide type", ref def.CollideType, arg))
                {
                    return(false);
                }
                break;

            case "speed":
                if (!CommandParser.GetReal(p, value, "Movement speed", ref def.Speed, 0.25f, 3.96f))
                {
                    SendEditHelp(p, arg); return(false);
                }
                break;

            case "toptex":
                if (!EditUShort(p, value, "Top texture", ref def.TopTex, arg))
                {
                    return(false);
                }
                break;

            case "alltex":
                if (!EditUShort(p, value, "All textures", ref def.RightTex, arg))
                {
                    return(false);
                }
                def.SetAllTex(def.RightTex);
                break;

            case "sidetex":
                if (!EditUShort(p, value, "Side texture", ref def.RightTex, arg))
                {
                    return(false);
                }
                def.SetSideTex(def.RightTex);
                break;

            case "lefttex":
                if (!EditUShort(p, value, "Left texture", ref def.LeftTex, arg))
                {
                    return(false);
                }
                break;

            case "righttex":
                if (!EditUShort(p, value, "Right texture", ref def.RightTex, arg))
                {
                    return(false);
                }
                break;

            case "fronttex":
                if (!EditUShort(p, value, "Front texture", ref def.FrontTex, arg))
                {
                    return(false);
                }
                break;

            case "backtex":
                if (!EditUShort(p, value, "Back texture", ref def.BackTex, arg))
                {
                    return(false);
                }
                break;

            case "bottomtex":
                if (!EditUShort(p, value, "Bottom texture", ref def.BottomTex, arg))
                {
                    return(false);
                }
                break;

            case "blockslight":
                if (!CommandParser.GetBool(p, value, ref temp))
                {
                    SendEditHelp(p, arg); return(false);
                }
                def.BlocksLight = temp;
                break;

            case "sound":
                if (!EditByte(p, value, "Walk sound", ref def.WalkSound, arg))
                {
                    return(false);
                }
                break;

            case "fullbright":
                if (!CommandParser.GetBool(p, value, ref temp))
                {
                    SendEditHelp(p, arg); return(false);
                }
                def.FullBright = temp;
                break;

            case "shape":
                if (!CommandParser.GetBool(p, value, ref temp))
                {
                    SendEditHelp(p, arg); return(false);
                }
                def.Shape = temp ? (byte)0 : def.MaxZ;
                break;

            case "blockdraw":
                if (!EditByte(p, value, "Block draw", ref def.BlockDraw, arg))
                {
                    return(false);
                }
                break;

            case "min":
                if (!ParseCoords(p, value, ref def.MinX, ref def.MinY, ref def.MinZ))
                {
                    SendEditHelp(p, arg); return(false);
                }
                break;

            case "max":
                if (!ParseCoords(p, value, ref def.MaxX, ref def.MaxY, ref def.MaxZ))
                {
                    SendEditHelp(p, arg); return(false);
                }
                break;

            case "fogdensity":
                if (!EditByte(p, value, "Fog density", ref def.FogDensity, arg))
                {
                    return(false);
                }
                break;

            case "fogcolor":
                ColorDesc rgb = default(ColorDesc);
                if (!CommandParser.GetHex(p, value, ref rgb))
                {
                    return(false);
                }
                def.FogR = rgb.R; def.FogG = rgb.G; def.FogB = rgb.B;
                break;

            case "fallback":
                byte fallback = GetFallback(p, value);
                if (fallback == Block.Invalid)
                {
                    return(false);
                }
                changedFallback = true;

                value        = Block.GetName(p, fallback);
                def.FallBack = fallback; break;

            case "order":
                int order = 0;
                if (!CommandParser.GetInt(p, value, "Inventory order", ref order, 0, Block.MaxRaw))
                {
                    SendEditHelp(p, arg); return(false);
                }

                // Don't let multiple blocks be assigned to same order
                if (order != def.RawID && order != 0)
                {
                    for (int i = 0; i < defs.Length; i++)
                    {
                        if (defs[i] == null || defs[i].InventoryOrder != order)
                        {
                            continue;
                        }
                        p.Message("Block {0} already had order {1}", defs[i].Name, order);
                        return(false);
                    }
                }

                def.InventoryOrder = order == def.RawID ? -1 : order;
                BlockDefinition.UpdateOrder(def, global, lvl);
                p.Message("Set inventory order for {0} to {1}", blockName,
                          order == def.RawID ? "default" : order.ToString());
                return(true);

            default:
                p.Message("Unrecognised property: " + arg); return(false);
            }

            p.Message("Set {0} for {1} to {2}", arg, blockName, value);
            BlockDefinition.Add(def, defs, lvl);
            if (changedFallback)
            {
                BlockDefinition.UpdateFallback(global, def.GetBlock(), lvl);
            }
            return(true);
        }
Esempio n. 12
0
        static void EditHandler(Player p, string[] parts, bool global, string cmd)
        {
            if (parts.Length <= 3)
            {
                if (parts.Length == 1)
                {
                    Player.Message(p, "Valid properties: " + helpSections.Keys.Join());
                }
                else if (parts.Length == 3)
                {
                    Help(p, cmd, "edit " + parts[2]);
                }
                else
                {
                    Help(p, cmd);
                }
                return;
            }

            ExtBlock block;

            if (!CheckBlock(p, parts[1], out block))
            {
                return;
            }
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   def = defs[block.RawID], globalDef = BlockDefinition.GlobalDefs[block.RawID];

            if (def == null && block.BlockID < Block.CpeCount)
            {
                def = DefaultSet.MakeCustomBlock(block.BlockID);
                AddBlock(p, def, global, cmd, BlockDefinition.DefaultProps(block));
            }
            if (def != null && !global && def == globalDef)
            {
                def = globalDef.Copy();
                AddBlock(p, def, global, cmd, BlockDefinition.DefaultProps(block));
            }
            if (!ExistsInScope(def, block, global))
            {
                MessageNoBlock(p, block, global, cmd); return;
            }

            string value = parts[3], blockName = def.Name;
            float  fTemp;
            bool   temp = false, changedFallback = false;
            Level  level = p == null ? null : p.level;

            string arg = MapPropertyName(parts[2].ToLower());

            switch (arg)
            {
            case "name":
                def.Name = value; break;

            case "collide":
                if (!EditByte(p, value, "Collide type", ref def.CollideType, arg))
                {
                    return;
                }
                break;

            case "speed":
                if (!Utils.TryParseDecimal(value, out fTemp) || fTemp < 0.25f || fTemp > 3.96f)
                {
                    SendEditHelp(p, arg); return;
                }
                def.Speed = fTemp; break;

            case "toptex":
                if (!EditByte(p, value, "Top texture", ref def.TopTex, arg))
                {
                    return;
                }
                break;

            case "alltex":
                if (!EditByte(p, value, "All textures", ref def.SideTex, arg))
                {
                    return;
                }
                def.SetAllTex(def.SideTex);
                break;

            case "sidetex":
                if (!EditByte(p, value, "Side texture", ref def.SideTex, arg))
                {
                    return;
                }
                def.SetSideTex(def.SideTex);
                break;

            case "lefttex":
                if (!EditByte(p, value, "Left texture", ref def.LeftTex, arg))
                {
                    return;
                }
                break;

            case "righttex":
                if (!EditByte(p, value, "Right texture", ref def.RightTex, arg))
                {
                    return;
                }
                break;

            case "fronttex":
                if (!EditByte(p, value, "Front texture", ref def.FrontTex, arg))
                {
                    return;
                }
                break;

            case "backtex":
                if (!EditByte(p, value, "Back texture", ref def.BackTex, arg))
                {
                    return;
                }
                break;

            case "bottomtex":
                if (!EditByte(p, value, "Bottom texture", ref def.BottomTex, arg))
                {
                    return;
                }
                break;

            case "blockslight":
                if (!CommandParser.GetBool(p, value, ref temp))
                {
                    SendEditHelp(p, arg); return;
                }
                def.BlocksLight = temp;
                break;

            case "sound":
                if (!EditByte(p, value, "Walk sound", ref def.WalkSound, arg))
                {
                    return;
                }
                break;

            case "fullbright":
                if (!CommandParser.GetBool(p, value, ref temp))
                {
                    SendEditHelp(p, arg); return;
                }
                def.FullBright = temp;
                break;

            case "shape":
                if (!CommandParser.GetBool(p, value, ref temp))
                {
                    SendEditHelp(p, arg); return;
                }
                def.Shape = temp ? (byte)0 : def.MaxZ;
                break;

            case "blockdraw":
                if (!EditByte(p, value, "Block draw", ref def.BlockDraw, arg))
                {
                    return;
                }
                break;

            case "min":
                if (!ParseCoords(p, value, ref def.MinX, ref def.MinY, ref def.MinZ))
                {
                    SendEditHelp(p, arg); return;
                }
                break;

            case "max":
                if (!ParseCoords(p, value, ref def.MaxX, ref def.MaxY, ref def.MaxZ))
                {
                    SendEditHelp(p, arg); return;
                }
                break;

            case "fogdensity":
                if (!EditByte(p, value, "Fog density", ref def.FogDensity, arg))
                {
                    return;
                }
                break;

            case "fogcolor":
                ColorDesc rgb = default(ColorDesc);
                if (!CommandParser.GetHex(p, value, ref rgb))
                {
                    return;
                }
                def.FogR = rgb.R; def.FogG = rgb.G; def.FogB = rgb.B;
                break;

            case "fallback":
                byte fallback = GetFallback(p, value);
                if (fallback == Block.Invalid)
                {
                    return;
                }
                changedFallback = true;

                value        = Block.Name(fallback);
                def.FallBack = fallback; break;

            case "order":
                int order = 0;
                if (!CommandParser.GetInt(p, value, "Inventory order", ref order, 1, 255))
                {
                    SendEditHelp(p, arg); return;
                }

                def.InventoryOrder = order == def.BlockID ? -1 : order;
                BlockDefinition.UpdateOrder(def, global, level);
                BlockDefinition.Save(global, level);
                Player.Message(p, "Set inventory order for {0} to {1}", blockName,
                               order == def.BlockID ? "default" : order.ToString());
                return;

            default:
                Player.Message(p, "Unrecognised property: " + arg); return;
            }

            Player.Message(p, "Set {0} for {1} to {2}", arg, blockName, value);
            BlockDefinition.Add(def, defs, level);
            if (changedFallback)
            {
                BlockDefinition.UpdateFallback(global, def.BlockID, level);
            }
        }
Esempio n. 13
0
        void EditHandler(Player p, string[] parts, bool global)
        {
            if (parts.Length <= 3)
            {
                if (parts.Length == 1)
                {
                    Player.SendMessage(p, "Valid properties: name, collide, speed, toptex, sidetex, " +
                                       "bottomtex, blockslight, sound, fullbright, shape, blockdraw, min, max, " +
                                       "fogdensity, fogred, foggreen, fogblue, fallback, lefttex, righttex, fronttex, backtex");
                }
                else
                {
                    Help(p);
                }
                return;
            }
            int blockId;

            if (!CheckBlockId(p, parts[1], global, out blockId))
            {
                return;
            }
            BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
            BlockDefinition   def  = defs[blockId];

            if (!ExistsInScope(def, blockId, global))
            {
                MessageNoBlock(p, blockId, global); return;
            }

            string value = parts[3];
            float  fTemp;
            byte   tempX, tempY, tempZ;

            switch (parts[2].ToLower())
            {
            case "name":
                def.Name = value; break;

            case "collide":
                if (!(value == "0" || value == "1" || value == "2"))
                {
                    SendEditHelp(p, 3, 0); return;
                }
                def.CollideType = byte.Parse(value); break;

            case "speed":
                if (!float.TryParse(value, out fTemp) || fTemp < 0.25f || fTemp > 3.96f)
                {
                    SendEditHelp(p, 4, 0); return;
                }
                def.Speed = fTemp; break;

            case "top":
            case "toptex":
                if (!EditByte(p, value, "Top texture", ref def.TopTex))
                {
                    return;
                }
                break;

            case "side":
            case "sidetex":
                if (!EditByte(p, value, "Side texture", ref def.SideTex))
                {
                    return;
                }
                def.LeftTex  = def.SideTex; def.RightTex = def.SideTex;
                def.FrontTex = def.SideTex; def.BackTex = def.SideTex;
                break;

            case "left":
            case "lefttex":
                if (!EditByte(p, value, "Left texture", ref def.LeftTex))
                {
                    return;
                }
                break;

            case "right":
            case "righttex":
                if (!EditByte(p, value, "Right texture", ref def.RightTex))
                {
                    return;
                }
                break;

            case "front":
            case "fronttex":
                if (!EditByte(p, value, "Front texture", ref def.FrontTex))
                {
                    return;
                }
                break;

            case "back":
            case "backtex":
                if (!EditByte(p, value, "Back texture", ref def.BackTex))
                {
                    return;
                }
                break;

            case "bottom":
            case "bottomtex":
                if (!EditByte(p, value, "Bottom texture", ref def.BottomTex))
                {
                    return;
                }
                break;

            case "light":
            case "blockslight":
                if (!(value == "0" || value == "1"))
                {
                    SendEditHelp(p, 8, 0); return;
                }
                def.BlocksLight = value == "0"; break;

            case "sound":
            case "walksound":
                if (!EditByte(p, value, "Walk sound", ref def.WalkSound, 9, 1, 0, 11))
                {
                    return;
                }
                break;

            case "bright":
            case "fullbright":
                if (!(value == "0" || value == "1"))
                {
                    SendEditHelp(p, 10, 0); return;
                }
                def.FullBright = value != "0"; break;

            case "shape":
                if (!(value == "0" || value == "1"))
                {
                    SendEditHelp(p, 12, 0); return;
                }
                def.Shape = value == "1" ? (byte)0 : def.MaxY; break;

            case "draw":
            case "blockdraw":
                if (!EditByte(p, value, "Block draw", ref def.BlockDraw, 11, 1, 0, 4))
                {
                    return;
                }
                break;

            case "min":
            case "mincoords":
                if (!ParseCoords(value, out tempX, out tempY, out tempZ))
                {
                    SendEditHelp(p, 13, 0); return;
                }
                def.MinX = tempX; def.MinY = tempY; def.MinZ = tempZ;
                break;

            case "max":
            case "maxcoords":
                if (!ParseCoords(value, out tempX, out tempY, out tempZ))
                {
                    SendEditHelp(p, 14, 0); return;
                }
                def.MaxX = tempX; def.MaxY = tempY; def.MaxZ = tempZ; def.Shape = def.MaxY;
                break;

            case "density":
            case "fogdensity":
                if (!EditByte(p, value, "Fog density", ref def.FogDensity))
                {
                    return;
                }
                break;

            case "red":
            case "fogred":
                if (!EditByte(p, value, "Fog red", ref def.FogR))
                {
                    return;
                }
                break;

            case "green":
            case "foggreen":
                if (!EditByte(p, value, "Fog green", ref def.FogG))
                {
                    return;
                }
                break;

            case "blue":
            case "fogblue":
                if (!EditByte(p, value, "Fog blue", ref def.FogB))
                {
                    return;
                }
                break;

            case "fallback":
            case "fallbackid":
            case "fallbackblock":
                tempX = Block.Byte(value);
                if (tempX == Block.Zero)
                {
                    Player.SendMessage(p, "'" + value + "' is not a valid standard tile."); return;
                }
                def.FallBack = tempX; break;

            default:
                Player.SendMessage(p, "Unrecognised property: " + parts[2]); return;
            }
            BlockDefinition.Add(def, defs, p == null ? null : p.level);
            ReloadMap(p, global);
        }
Esempio n. 14
0
        void DefineBlockStep(Player p, string value, bool global)
        {
            string opt  = value.ToLower();
            int    step = GetStep(p, global);

            if (opt == "revert" && step > 2)
            {
                step--;
                SendStepHelp(p, step);
                SetStep(p, global, step); return;
            }
            BlockDefinition bd = GetBD(p, global);

            if (step == 2)
            {
                bd.Name = value;
                step++;
            }
            else if (step == 3)
            {
                if (value == "0" || value == "1" || value == "2")
                {
                    bd.CollideType = byte.Parse(value);
                    step++;
                }
            }
            else if (step == 4)
            {
                if (float.TryParse(value, out bd.Speed) && bd.Speed >= 0.25f && bd.Speed <= 3.96f)
                {
                    step++;
                }
            }
            else if (step == 5)
            {
                if (byte.TryParse(value, out bd.TopTex))
                {
                    step++;
                }
            }
            else if (step == 6)
            {
                if (byte.TryParse(value, out bd.SideTex))
                {
                    bd.LeftTex  = bd.SideTex; bd.RightTex = bd.SideTex;
                    bd.FrontTex = bd.SideTex; bd.BackTex = bd.SideTex;
                    step++;
                }
            }
            else if (step == 7)
            {
                if (byte.TryParse(value, out bd.BottomTex))
                {
                    step++;
                }
            }
            else if (step == 8)
            {
                if (value == "0" || value == "1")
                {
                    bd.BlocksLight = value == "0";
                    step++;
                }
            }
            else if (step == 9)
            {
                bool result = byte.TryParse(value, out bd.WalkSound);
                if (result && bd.WalkSound <= 11)
                {
                    step++;
                }
            }
            else if (step == 10)
            {
                if (value == "0" || value == "1")
                {
                    bd.FullBright = value != "0";
                    step++;
                }
            }
            else if (step == 11)
            {
                bool result = byte.TryParse(value, out bd.BlockDraw);
                if (result && bd.BlockDraw >= 0 && bd.BlockDraw <= 4)
                {
                    step++;
                }
            }
            else if (step == 12)
            {
                if (value == "0" || value == "1")
                {
                    bd.Shape = value == "1" ? (byte)0 : (byte)16;
                    step     = bd.Shape == 0 ? 15 : 13;
                }
            }
            else if (step == 13)
            {
                if (ParseCoords(value, out bd.MinX, out bd.MinY, out bd.MinZ))
                {
                    step++;
                }
            }
            else if (step == 14)
            {
                if (ParseCoords(value, out bd.MaxX, out bd.MaxY, out bd.MaxZ))
                {
                    step++;
                }
                bd.Shape = bd.MaxY;
            }
            else if (step == 15)
            {
                if (byte.TryParse(value, out bd.FogDensity))
                {
                    step = bd.FogDensity == 0 ? 19 : 16;
                }
            }
            else if (step == 16)
            {
                if (byte.TryParse(value, out bd.FogR))
                {
                    step++;
                }
            }
            else if (step == 17)
            {
                if (byte.TryParse(value, out bd.FogG))
                {
                    step++;
                }
            }
            else if (step == 18)
            {
                if (byte.TryParse(value, out bd.FogB))
                {
                    step++;
                }
            }
            else if (step == 19)
            {
                if (Block.Byte(value) == Block.Zero)
                {
                    SendStepHelp(p, step); return;
                }
                bd.FallBack = Block.Byte(value);
                BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs;
                BlockDefinition   def  = defs[bd.BlockID];
                if (!global && def == BlockDefinition.GlobalDefs[bd.BlockID])
                {
                    def = null;
                }

                // in case the list is modified before we finish the command.
                if (def != null)
                {
                    bd.BlockID = GetFreeId(global, p == null ? null : p.level);
                    if (bd.BlockID == Block.Zero)
                    {
                        string cmd = global ? "/gb" : "/lb";
                        Player.SendMessage(p, "There are no custom block ids left, " +
                                           "you must " + cmd + " remove a custom block first.");
                        if (!global)
                        {
                            Player.SendMessage(p, "You may also manually specify the same existing id of a global custom block.");
                        }
                        return;
                    }
                }

                string scope = global ? "global" : "level";
                Player.SendMessage(p, "Created a new " + scope + " custom block " + bd.Name + "(" + bd.BlockID + ")");
                BlockDefinition.Add(bd, defs, p == null ? null : p.level);
                SetBD(p, global, null);
                SetStep(p, global, 0);
                return;
            }
            SendStepHelp(p, step);
            SetStep(p, global, step);
        }