public virtual void Deserialize(Player player, string currentPattern) { // x20%1:0 // x<weight>%<blockId>:<blockData>,<weight>%<blockId>:<blockData> .. <weight>%<blockId>:<blockData> if (currentPattern.StartsWith("x")) { currentPattern = currentPattern.Remove(0, 1); // remove starting x } OriginalPattern = currentPattern; var patterns = currentPattern.Split(','); foreach (var pattern in patterns) { var blockInfos = pattern.Split(':'); int id; byte metadata = 0; int weight = 100; var weightedIn = blockInfos[0].Split('%'); if (weightedIn.Length == 2) { if (!int.TryParse(weightedIn[0], out weight)) { weight = 100; } } string binfo = weightedIn[weightedIn.Length - 1]; if (!int.TryParse(binfo, out id)) { id = BlockFactory.GetBlockIdByName(binfo); } if (blockInfos.Length == 2) { byte.TryParse(blockInfos[1], out metadata); } Log.Debug($"Parsed x{weight}%{id}:{metadata}"); _blockList.Add(new BlockDataEntry() { Id = id, Metadata = metadata, Weight = weight }); } int acc = 0; foreach (var entry in _blockList.OrderBy(entry => entry.Weight)) { acc += entry.Weight; entry.Accumulated = acc; } _blockList = _blockList.OrderBy(entry => entry.Accumulated).ToList(); }
public static short GetItemIdByName(string itemName) { itemName = itemName.ToLowerInvariant(); itemName = itemName.Replace("_", ""); if (NameToId.ContainsKey(itemName)) { return(NameToId[itemName]); } return(BlockFactory.GetBlockIdByName(itemName)); }
public virtual void Deserialize(Player player, string input) { Level = player.Level; // x1:0,air,log:12 // x<blockId>:<blockData>,<blockId>:<blockData>, .. <blockId>:<blockData> // TODO: !, #existing, #region, <, >, if (input.StartsWith("x")) { input = input.Remove(0, 1); // remove starting x } var patterns = input.Split(','); foreach (var pattern in patterns) { var blockInfos = pattern.Split(':'); var dataEntry = new BlockDataEntry(); byte id; string binfo = blockInfos[0]; if (!byte.TryParse(binfo, out id)) { id = BlockFactory.GetBlockIdByName(binfo); } dataEntry.Id = id; if (blockInfos.Length == 2) { byte metadata; byte.TryParse(blockInfos[1], out metadata); dataEntry.Metadata = metadata; dataEntry.IgnoreMetadata = false; } _blockList.Add(dataEntry); } }
public void Sphere(Player player, int radiusX, int radiusY = 0, int radiusZ = 0, BlockTypeEnum tileName = null, int tileData = 0, bool filled = true) { if (tileName == null) { tileName = new BlockTypeEnum { Value = "stone" } } ; if (radiusY == 0) { radiusY = radiusX; } if (radiusZ == 0) { radiusZ = radiusX; } var id = BlockFactory.GetBlockIdByName(tileName.Value); var pattern = new Pattern(id, tileData); EditSession.MakeSphere((BlockCoordinates)player.KnownPosition, pattern, radiusX, radiusY, radiusZ, filled); }
public override void HandleMcpeStartGame(McpeStartGame message) { Client.EntityId = message.runtimeEntityId; Client.NetworkEntityId = message.entityIdSelf; Client.SpawnPoint = message.spawn; Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y); Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}"); string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt"; using (FileStream file = File.OpenWrite(fileName)) { Log.Warn($"Writing new blocks to filename:\n{fileName}"); var legacyIdMap = new Dictionary <string, int>(); var assembly = Assembly.GetAssembly(typeof(Block)); using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".legacy_id_map.json")) using (var reader = new StreamReader(stream)) { var result = JObject.Parse(reader.ReadToEnd()); foreach (var obj in result) { legacyIdMap.Add(obj.Key, (int)obj.Value); } } var writer = new IndentedTextWriter(new StreamWriter(file)); writer.WriteLine($"namespace MiNET.Blocks"); writer.WriteLine($"{{"); writer.Indent++; var blocks = new List <(int, string)>(); foreach (IGrouping <string, BlockRecord> blockstate in message.blockPallet.OrderBy(record => record.Name).ThenBy(record => record.Data).GroupBy(record => record.Name)) { var enumerator = blockstate.GetEnumerator(); enumerator.MoveNext(); var value = enumerator.Current; if (value == null) { continue; } Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}"); int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", "")); if (id == 0 && !value.Name.Contains("air")) { if (legacyIdMap.TryGetValue(value.Name, out id)) { value.Id = id; } string blockName = Client.CodeName(value.Name.Replace("minecraft:", ""), true); blocks.Add((value.Id, blockName)); writer.WriteLine($"public class {blockName}: Block"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"public {blockName}() : base({value.Id})"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"Name = \"{value.Name}\";"); do { writer.WriteLine($"// runtime id: {enumerator.Current.RuntimeId} 0x{enumerator.Current.RuntimeId:X}, data: {enumerator.Current.Data}"); } while (enumerator.MoveNext()); writer.Indent--; writer.WriteLine($"}}"); writer.Indent--; writer.WriteLine($"}}"); } } writer.Indent--; writer.WriteLine($"}}"); foreach (var block in blocks.OrderBy(tuple => tuple.Item1)) { writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();"); } writer.Flush(); } // Log.Debug($@" //StartGame: // entityId: {message.entityIdSelf} // runtimeEntityId: {message.runtimeEntityId} // spawn: {message.spawn} // unknown1: {message.unknown1} // dimension: {message.dimension} // generator: {message.generator} // gamemode: {message.gamemode} // difficulty: {message.difficulty} // hasAchievementsDisabled: {message.hasAchievementsDisabled} // dayCycleStopTime: {message.dayCycleStopTime} // eduMode: {message.eduMode} // rainLevel: {message.rainLevel} // lightnigLevel: {message.lightnigLevel} // enableCommands: {message.enableCommands} // isTexturepacksRequired: {message.isTexturepacksRequired} // secret: {message.levelId} // worldName: {message.worldName} //"); LogGamerules(message.gamerules); Client.LevelInfo.LevelName = "Default"; Client.LevelInfo.Version = 19133; Client.LevelInfo.GameType = message.gamemode; //ClientUtils.SaveLevel(_level); { var packet = McpeRequestChunkRadius.CreateObject(); Client.ChunkRadius = 5; packet.chunkRadius = Client.ChunkRadius; Client.SendPacket(packet); } }
public void GenerateClassesForBlocks() { Dictionary <int, Blockstate> blockstates = new Dictionary <int, Blockstate>(); var assembly = Assembly.GetAssembly(typeof(Block)); var legacyIdMap = new Dictionary <string, int>(); using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".legacy_id_map.json")) using (StreamReader reader = new StreamReader(stream)) { var result = JObject.Parse(reader.ReadToEnd()); foreach (var obj in result) { legacyIdMap.Add(obj.Key, (int)obj.Value); } } using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".blockstates.json")) using (StreamReader reader = new StreamReader(stream)) { dynamic jsonBlockstates = JArray.Parse(reader.ReadToEnd()); int runtimeId = 0; foreach (var obj in jsonBlockstates) { try { var name = (string)obj.name; if (legacyIdMap.TryGetValue(name, out var id)) { blockstates.Add(runtimeId, new Blockstate() { Id = id, Data = (short)obj.data, Name = (string)obj.name, RuntimeId = runtimeId }); runtimeId++; } } catch (Exception e) { Console.WriteLine($"{obj}"); throw; } } } List <(int, string)> blocks = new List <(int, string)>(); string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt"; using (FileStream file = File.OpenWrite(fileName)) { Log.Warn($"Writing new blocks to filename:\n{fileName}"); IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file)); writer.WriteLine($"namespace MiNET.Blocks"); writer.WriteLine($"{{"); writer.Indent++; foreach (IGrouping <string, KeyValuePair <int, Blockstate> > blockstate in blockstates.OrderBy(kvp => kvp.Value.Name).ThenBy(kvp => kvp.Value.Data).GroupBy(kvp => kvp.Value.Name)) { var enumerator = blockstate.GetEnumerator(); enumerator.MoveNext(); var value = enumerator.Current.Value; if (value == null) { continue; } Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}"); int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", "")); if (id == 0 && !value.Name.Contains("air")) { string blockName = CodeName(value.Name.Replace("minecraft:", ""), true); blocks.Add((value.Id, blockName)); writer.WriteLine($"public class {blockName}: Block"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"public {blockName}() : base({value.Id})"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"Name = \"{value.Name}\";"); do { writer.WriteLine($"// runtime id: {enumerator.Current.Value.RuntimeId} 0x{enumerator.Current.Value.RuntimeId:X}, data: {enumerator.Current.Value.Data}"); } while (enumerator.MoveNext()); writer.Indent--; writer.WriteLine($"}}"); writer.Indent--; writer.WriteLine($"}}"); } } writer.Indent--; writer.WriteLine($"}}"); foreach (var block in blocks.OrderBy(tuple => tuple.Item1)) { writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();"); } writer.Flush(); } }
public override void HandleMcpeStartGame(McpeStartGame message) { Client.EntityId = message.runtimeEntityId; Client.NetworkEntityId = message.entityIdSelf; Client.SpawnPoint = message.spawn; Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.unknown1.X, message.unknown1.X, message.unknown1.Y); Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}"); string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt"; using (FileStream file = File.OpenWrite(fileName)) { Log.Warn($"Writing new blocks to filename:\n{fileName}"); IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file)); writer.WriteLine($"namespace MiNET.Blocks"); writer.WriteLine($"{{"); writer.Indent++; foreach (IGrouping <string, KeyValuePair <int, Blockstate> > blockstate in message.blockstates.OrderBy(kvp => kvp.Value.Name).ThenBy(kvp => kvp.Value.Data).GroupBy(kvp => kvp.Value.Name)) { var enumerator = blockstate.GetEnumerator(); enumerator.MoveNext(); var value = enumerator.Current.Value; if (value == null) { continue; } Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}"); int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", "")); if (id == 0 && !value.Name.Contains("air")) { string blockName = Client.CodeName(value.Name.Replace("minecraft:", ""), true); writer.WriteLine($"public class {blockName}: Block"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"public {blockName}() : base({value.Id}, {value.RuntimeId})"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"Name {{get; set;}} = {value.Name}"); do { writer.WriteLine($"// runtime id: {enumerator.Current.Value.RuntimeId} 0x{enumerator.Current.Value.RuntimeId:X}, data: {enumerator.Current.Value.Data}"); } while (enumerator.MoveNext()); writer.Indent--; writer.WriteLine($"}}"); writer.Indent--; writer.WriteLine($"}}"); } } writer.Indent--; writer.WriteLine($"}}"); writer.Flush(); } // Log.Debug($@" //StartGame: // entityId: {message.entityIdSelf} // runtimeEntityId: {message.runtimeEntityId} // spawn: {message.spawn} // unknown1: {message.unknown1} // dimension: {message.dimension} // generator: {message.generator} // gamemode: {message.gamemode} // difficulty: {message.difficulty} // hasAchievementsDisabled: {message.hasAchievementsDisabled} // dayCycleStopTime: {message.dayCycleStopTime} // eduMode: {message.eduMode} // rainLevel: {message.rainLevel} // lightnigLevel: {message.lightnigLevel} // enableCommands: {message.enableCommands} // isTexturepacksRequired: {message.isTexturepacksRequired} // secret: {message.levelId} // worldName: {message.worldName} //"); Client.LevelInfo.LevelName = "Default"; Client.LevelInfo.Version = 19133; Client.LevelInfo.GameType = message.gamemode; //ClientUtils.SaveLevel(_level); { var packet = McpeRequestChunkRadius.CreateObject(); Client.ChunkRadius = 5; packet.chunkRadius = Client.ChunkRadius; Client.SendPacket(packet); } }
public virtual void Deserialize(Player player, string currentPattern) { // See documentation: https://worldedit.enginehub.org/en/latest/usage/general/patterns/ if (currentPattern.StartsWith("x")) { currentPattern = currentPattern.Remove(0, 1); // remove starting x } OriginalPattern = currentPattern.Trim(); var patternsEx = new Regex(@",(?![^\[]*])"); foreach (string pattern in patternsEx.Split(currentPattern.Trim())) { Log.Debug($"Matching {pattern}"); var blockDataEntry = new BlockDataEntry(); var regex = new Regex(@"(?<pattern>((?<weight>\d+)%)?((?<blockId>\d+)|(?<blockName>(minecraft:)?\w+)){1}(:(?<meta>\d+))?(\[(?<states>[a-zA-Z0-9_=,]*)])?)*"); var stateEx = new Regex(@"(?<name>\w+)\=(?<value>\w+)"); Match match = regex.Match(pattern.Trim()); if (match.Success) { foreach (Group matchGroup in match.Groups) { if (matchGroup.Name == "weight" && matchGroup.Success) { Log.Debug($"Matched weight group {matchGroup.Value}"); if (int.TryParse(matchGroup.Value.Trim(), out int weight)) { blockDataEntry.Weight = weight; } } else if (matchGroup.Name == "blockName" && matchGroup.Success) { Log.Debug($"Matched blockName group {matchGroup.Value}"); blockDataEntry.Id = BlockFactory.GetBlockIdByName(matchGroup.Value.Trim()); } if (matchGroup.Name == "blockId" && matchGroup.Success) { Log.Debug($"Matched blockId group {matchGroup.Value}"); if (int.TryParse(matchGroup.Value.Trim(), out int id)) { blockDataEntry.Id = id; } } else if (matchGroup.Name == "meta" && matchGroup.Success) { Log.Debug($"Matched meta group {matchGroup.Value}"); if (byte.TryParse(matchGroup.Value.Trim(), out byte metadata)) { blockDataEntry.Metadata = metadata; blockDataEntry.HasBlockStates = true; } } else if (matchGroup.Name == "states" && matchGroup.Success) { Log.Debug($"Matched states group {matchGroup.Value}"); // Parse block states var stateMatches = stateEx.Matches(matchGroup.Value.Trim()); { foreach (Match stateMatch in stateMatches) { Log.Debug($"State:{stateMatch.Value}"); blockDataEntry.BlockStates.Add(new BlockStateEntry() { Name = stateMatch.Groups.Values.First(g => g.Name == "name").Value, Value = stateMatch.Groups.Values.First(g => g.Name == "value").Value }); blockDataEntry.HasBlockStates = true; } } } } } else { throw new Exception("Deprecated code used to be here."); } BlockList.Add(blockDataEntry); } int acc = 0; foreach (var entry in BlockList.OrderBy(entry => entry.Weight)) { acc += entry.Weight; entry.Accumulated = acc; } BlockList = BlockList.OrderBy(entry => entry.Accumulated).ToList(); }
public void Line(Player player, BlockTypeEnum tileName, int tileData = 0, int thickness = 1, bool shell = false) { var id = BlockFactory.GetBlockIdByName(tileName.Value); Line(player, id, tileData, thickness, shell); }
public void SetBlock(Player player, BlockTypeEnum tileName, int tileData = 0) { var id = BlockFactory.GetBlockIdByName(tileName.Value); Set(player, id, tileData); }
public void GenerateClassesForBlocks() { BlockPallet pallet = null; var assembly = Assembly.GetAssembly(typeof(Block)); using (var stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".blockstates.json")) using (var reader = new StreamReader(stream)) { pallet = BlockPallet.FromJson(reader.ReadToEnd()); } List <(int, string)> blocks = new List <(int, string)>(); string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt"; using (FileStream file = File.OpenWrite(fileName)) { Log.Warn($"Writing new blocks to filename:\n{fileName}"); IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file)); writer.WriteLine($"namespace MiNET.Blocks"); writer.WriteLine($"{{"); writer.Indent++; foreach (IGrouping <string, BlockRecord> blockstate in pallet.OrderBy(r => r.Name).ThenBy(r => r.Data).GroupBy(r => r.Name)) { var enumerator = blockstate.GetEnumerator(); enumerator.MoveNext(); var value = enumerator.Current; if (value == null) { continue; } Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}"); int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", "")); if (id == 0 && !value.Name.Contains("air")) { string blockName = CodeName(value.Name.Replace("minecraft:", ""), true); blocks.Add((value.Id, blockName)); writer.WriteLine($"public class {blockName}: Block"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"public {blockName}() : base({value.Id})"); writer.WriteLine($"{{"); writer.Indent++; writer.WriteLine($"Name = \"{value.Name}\";"); do { writer.WriteLine($"// runtime id: {enumerator.Current.RuntimeId} 0x{enumerator.Current.RuntimeId:X}, data: {enumerator.Current.Data}"); } while (enumerator.MoveNext()); writer.Indent--; writer.WriteLine($"}}"); writer.Indent--; writer.WriteLine($"}}"); } } writer.Indent--; writer.WriteLine($"}}"); foreach (var block in blocks.OrderBy(tuple => tuple.Item1)) { writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();"); } writer.Flush(); } }
public virtual void Deserialize(Player player, string input) { Level = player.Level; // x1:0,air,log:12 // x<blockId>:<blockData>,<blockId>:<blockData>, .. <blockId>:<blockData> // TODO: !, #existing, #region, <, >, if (input.StartsWith("x")) { input = input.Remove(0, 1); // remove starting x } OriginalMask = input; string[] inputs = input.Split(' '); _masks = new MaskEntry[inputs.Length]; for (int i = 0; i < inputs.Length; i++) { MaskEntry entry = new MaskEntry(); _masks[i] = entry; string currentPattern = inputs[i]; if (currentPattern.StartsWith(">")) // Only place above certain blocks { entry.AboveOnly = true; currentPattern = currentPattern.Remove(0, 1); // remove starting x } else if (currentPattern.StartsWith("<")) // Only place below certain blocks { entry.BelowOnly = true; currentPattern = currentPattern.Remove(0, 1); // remove starting x } else if (currentPattern.StartsWith("!")) // Only place if NOT certain blocks { entry.Inverted = true; currentPattern = currentPattern.Remove(0, 1); // remove starting x } var patterns = currentPattern.Split(','); foreach (var pattern in patterns) { var blockInfos = pattern.Split(':'); var dataEntry = new BlockDataEntry(); byte id; string binfo = blockInfos[0]; if (!byte.TryParse(binfo, out id)) { id = BlockFactory.GetBlockIdByName(binfo); } dataEntry.Id = id; if (blockInfos.Length == 2) { byte metadata; byte.TryParse(blockInfos[1], out metadata); dataEntry.Metadata = metadata; dataEntry.IgnoreMetadata = false; } entry.BlockList.Add(dataEntry); } } }