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); }
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); } }
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); } }
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 + "\"."); }
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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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); } }
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); }
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); }