Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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" : "");
        }
Пример #7
0
 private void OpenDB()
 {
     BedrockDB = new LevelDB(Path.Combine(Folder, "db"));
     LevelDat  = LoadNbtFromFile(Path.Combine(Folder, "level.dat"));
     Version   = DetermineVersionFromLevelDat(LevelDat.RootTag);
 }
Пример #8
0
 private void OpenDB()
 {
     BedrockDB = new LevelDB(Path.Combine(Folder, "db"));
 }