public BlockChainSystem(IClient client, string chainName = "main") { this.client = client; ChainName = chainName ?? throw new ArgumentNullException(nameof(chainName)); if (!wordRegex.IsMatch(chainName)) { throw new ArgumentOutOfRangeException(nameof(chainName), "非法的链名"); } if (!Directory.Exists(chainName)) { Directory.CreateDirectory(chainName); } immutableDatabase = new LevelDB(Path.Combine(chainName, "block_chain"), new LevelDBOptions { CreateIfMissing = true, Cache = new LevelDBCache(1000), }); userDatabse = new UserDictionary(Path.Combine(chainName, "block_chain.users")); blockHashes = new Hashes <Hash <Size256> >(Path.Combine(chainName, "block_chain.hash")); LastBlock = Block.GenesisBlock; // TODO: 更新创世区块状态 _ = Task.Run(LoopReadBlock); }
internal static void ZoneAll(Level lvl, string owner) { Level.Zone zn = default(Level.Zone); zn.bigX = (ushort)(lvl.Width - 1); zn.bigY = (ushort)(lvl.Height - 1); zn.bigZ = (ushort)(lvl.Length - 1); zn.Owner = owner; lvl.ZoneList.Add(zn); LevelDB.CreateZone(lvl.name, zn); }
protected internal override void OnBuyCommand(Player p, string message, string[] args) { if (args.Length < 3) { OnStoreCommand(p); return; } LevelPreset preset = FindPreset(args[1]); if (preset == null) { Player.Message(p, "%cThat isn't a level preset"); return; } if (p.money < preset.price) { Player.Message(p, "%cYou don't have enough %3" + Server.moneys + "%c to buy that map"); return; } string name = p.name + "_" + args[2]; try { Command.all.Find("newlvl").Use(null, name + " " + preset.x + " " + preset.y + " " + preset.z + " " + preset.type); Player.Message(p, "%aCreating level: '%f" + name + "%a' . . ."); CmdLoad.LoadLevel(null, name); Level level = LevelInfo.FindExact(name); if (level.permissionbuild > p.Rank) { level.permissionbuild = p.Rank; } if (level.permissionvisit > p.Rank) { level.permissionvisit = p.Rank; } PlayerActions.ChangeMap(p, name); Player.Message(p, "%aSuccessfully created your map: '%f" + name + "%a'"); try { Level.Zone zn = default(Level.Zone); zn.bigX = (ushort)(level.Width - 1); zn.bigY = (ushort)(level.Height - 1); zn.bigZ = (ushort)(level.Length - 1); zn.Owner = p.name; level.ZoneList.Add(zn); LevelDB.CreateZone(level.name, zn); Player.Message(p, "%aZoning Succesful"); } catch { Player.Message(p, "%cZoning Failed"); } } catch { Player.Message(p, "%cSomething went wrong, Money untouched"); return; } Economy.MakePurchase(p, preset.price, "%3Map: %f" + preset.name); }
bool AddZone(Player p, Vec3S32[] marks, object state, byte type, byte extType) { Level.Zone Zn; Zn.smallX = (ushort)Math.Min(marks[0].X, marks[1].X); Zn.smallY = (ushort)Math.Min(marks[0].Y, marks[1].Y); Zn.smallZ = (ushort)Math.Min(marks[0].Z, marks[1].Z); Zn.bigX = (ushort)Math.Max(marks[0].X, marks[1].X); Zn.bigY = (ushort)Math.Max(marks[0].Y, marks[1].Y); Zn.bigZ = (ushort)Math.Max(marks[0].Z, marks[1].Z); Zn.Owner = (string)state; p.level.ZoneList.Add(Zn); LevelDB.CreateZone(p.level.name, Zn); Player.Message(p, "Added zone for &b" + (string)state); return(false); }
bool DeleteZone(Player p, Vec3S32[] marks, object state, byte type, byte extType) { Level lvl = p.level; bool foundDel = false; Vec3S32 P = marks[0]; for (int i = 0; i < lvl.ZoneList.Count; i++) { Level.Zone zn = lvl.ZoneList[i]; if (P.X < zn.smallX || P.X > zn.bigX || P.Y < zn.smallY || P.Y > zn.bigY || P.Z < zn.smallZ || P.Z > zn.bigZ) { continue; } if (zn.Owner.Length >= 3 && zn.Owner.StartsWith("grp")) { string grpName = zn.Owner.Substring(3); if (p.Rank < Group.Find(grpName).Permission) { continue; } } else if (zn.Owner != "" && !zn.Owner.CaselessEq(p.name)) { Group group = Group.findPlayerGroup(zn.Owner); if (p.Rank < group.Permission) { continue; } } LevelDB.DeleteZone(lvl.name, zn); lvl.ZoneList.RemoveAt(i); i--; Player.Message(p, "Zone deleted for &b" + zn.Owner); foundDel = true; } if (!foundDel) { Player.Message(p, "No zones found to delete."); } return(false); }
internal static void DeleteWhere(Player p, Predicate <Level.Zone> filter) { int count = p.level.ZoneList.Count, removed = 0; for (int i = count - 1; i >= 0; i--) { Level.Zone zone = p.level.ZoneList[i]; if (!filter(zone)) { continue; } LevelDB.DeleteZone(p.level.name, zone); removed++; Player.Message(p, "Zone deleted for &b" + zone.Owner); p.level.ZoneList.Remove(p.level.ZoneList[i]); } Player.Message(p, "Removed {0} zone{1}.", removed, count == 1 ? "s" : ""); }
private void OpenDB() { BedrockDB = new LevelDB(Path.Combine(Folder, "db")); LevelDat = LoadNbtFromFile(Path.Combine(Folder, "level.dat")); Version = DetermineVersionFromLevelDat(LevelDat.RootTag); }
private void OpenDB() { BedrockDB = new LevelDB(Path.Combine(Folder, "db")); }