Example #1
0
        /// <summary>
        /// Unserializes the BigDB database world object.
        /// </summary>
        /// <param name="worlddata">The world data.</param>
        /// <param name="width">The width of the world.</param>
        /// <param name="height">The height of the world.</param>
        public static void UnserializeFromComplexObject(DatabaseArray worlddata, int width, int height)
        {
            Minimap minimap = new Minimap();
            minimap.width = width;
            minimap.height = height;
            minimap.initialize();

            Console.WriteLine("Unserializing complex object...");

            foreach (DatabaseObject ct in worlddata) {
                if (ct.Count == 0) continue;
                uint blockId = ct.GetUInt("type");
                int layer = ct.GetInt("layer");
                byte[] xs = ct.GetBytes("x"),
                    ys = ct.GetBytes("y");

                for (var b = 0; b < xs.Length; b += 2) {
                    int nx = (xs[b] << 8) | xs[b + 1],
                        ny = (ys[b] << 8) | ys[b + 1];

                    minimap.drawBlock(layer, nx, ny, blockId);
                }
            }

            // Write them "on top" of backgrounds
            minimap.rewriteForegroundBlocks();

            minimap.Save(worldID + "_bigdb.png");
            generating_minimap = false;
        }
        public void loadPoints(DatabaseObject roomData, String username)
        {
            DatabaseObject points = roomData.GetObject("points");

            if (!points.Contains(username))
            {
                return;
            }
            DatabaseObject user = points.GetObject(username);

            if (user.GetDateTime("day") < DateTime.Today)
            {
                Console.WriteLine("Purged old slime point data in map: " + RoomId);
                points.Remove(username);
                roomData.Save(true, true);
                return;
            }
            DatabaseArray userpoints = user.GetArray("list");
            ArrayList     listPoints = new ArrayList();

            for (int i = 0; i < userpoints.Count; i++)
            {
                listPoints.Add(userpoints.GetInt(i));
            }
            Points.Add((String)username.Clone(), listPoints);
        }
Example #3
0
        public SerializedDBA(DatabaseArray dba)
        {
            this.Data = new Dictionary <int, object>();

            if (dba == null)
            {
                return;
            }

            foreach (var j in dba.Indexes)
            {
                if (dba.TryGetValue(j.ToString(), out var i))
                {
                    if (i == null)
                    {
                        Console.WriteLine("null val");
                    }

                    if (i is DatabaseObject)
                    {
                        this.Data[j] = new SerializedDBO((DatabaseObject)i).Data;
                    }
                    else if (i is DatabaseArray)
                    {
                        this.Data[j] = new SerializedDBA((DatabaseArray)i).Data;
                    }
                    else
                    {
                        this.Data[j] = i;
                    }
                }
            }
        }
Example #4
0
        public void unserializeFromComplexObject(DatabaseArray worlddata)
        {
            for (var a = 0; a < worlddata.Count; a++)
            {
                var ct       = worlddata.GetObject(a);
                var type     = (uint)ct.GetValue("type");
                var layerNum = ct.GetInt("layer", 0);
                var xs       = ct.GetBytes("x", new byte[0]);
                var ys       = ct.GetBytes("y", new byte[0]);
                var b        = 0;
                while (b < xs.Length)
                {
                    var nx  = (uint)(((int)xs[b] << 8) + (int)xs[b + 1]);
                    var ny  = (uint)(((int)ys[b] << 8) + (int)ys[b + 1]);
                    var num = type;
                    if (num <= 77U)
                    {
                        if (num != 43U)
                        {
                            if (num != 77U)
                            {
                                goto IL_168;
                            }
                            this.setBrickSound(ItemTypes.Piano, nx, ny, ct.GetUInt("id", 0U));
                        }
                        else
                        {
                            this.setBrickCoindoor(nx, ny, (uint)ct.GetValue("goal"), false);
                        }
                    }
                    else if (num != 83U)
                    {
                        if (num != 242U)
                        {
                            if (num != 1000U)
                            {
                                goto IL_168;
                            }
                            this.setBrickLabel(nx, ny, ct.GetString("text", "no text found"));
                        }
                        else
                        {
                            this.setBrickPortal(nx, ny, ct.GetUInt("rotation", 0U), ct.GetUInt("id", 0U), ct.GetUInt("target", 0U), false);
                        }
                    }
                    else
                    {
                        this.setBrickSound(ItemTypes.Drums, nx, ny, ct.GetUInt("id", 0U));
                    }
IL_179:
                    b += 2;
                    continue;
IL_168:
                    this.setBrick(layerNum, nx, ny, type, true);
                    goto IL_179;
                }
            }
        }
        public static object[] ToArray(this DatabaseArray databaseArray)
        {
            var array = new object[databaseArray.Count];

            for (var i = 0; i < databaseArray.Count; i++)
            {
                array[i] = Convert(databaseArray.GetValue(i));
            }

            return(array);
        }
Example #6
0
        public void Clear()
        {
            if (_entrys.Count == 0)
            {
                return;
            }

            _entrys = new DatabaseArray <DatabaseEntry>();
            _databaseNames.Clear();

            Interlocked.Exchange(ref _isDirty, 1);
        }
Example #7
0
        public void AddElementWithFullArrayThrowsException()
        {
            // Act
            this.db = new DatabaseArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

            // Assert
            var ex = Assert.Throws <InvalidOperationException>(() => this.db.Add(17));

            Assert.AreEqual(
                "Database is full!",
                ex.Message,
                "Database should throw exception when trying to add more than 16 elements!");
        }
Example #8
0
        public string list()
        {
            String result = "";

            if (isGuest)
            {
                result = "Listing data for " + username + ":\n";
            }
            else
            {
                result = "Listing data for " + username + " (key " + PlayerObject.Key + "):\n";

                DatabaseArray bans = PlayerObject.GetArray("BanHistory");
                if (bans.Count > 0)
                {
                    result += "Bans (" + bans.Count + "):\n";
                    foreach (DatabaseObject ban in bans)
                    {
                        result += String.Format("{0:d.M.yyyy HH:mm:ss}", ban.GetDateTime("D"));
                        result += " - (" + ban.GetInt("Dur") + "days) " + ban.GetString("R");
                        result += " (" + ban.GetString("M") + ")\n";
                    }
                }
                else
                {
                    result += "No bans found\n";
                }

                DatabaseArray warns = PlayerObject.GetArray("WarnHistory");
                if (warns.Count > 0)
                {
                    result += "Warns (" + warns.Count + "):\n";
                    foreach (DatabaseObject warn in warns)
                    {
                        result += String.Format("{0:d.M.yyyy HH:mm:ss}", warn.GetDateTime("D"));
                        result += " - " + warn.GetString("R");
                        result += " (" + warn.GetString("M") + ")\n";
                    }
                }
                else
                {
                    result += "No warns found\n";
                }
            }

            result += "current IP: " + IPAddress.ToString() + "\n";

            return(result);
        }
Example #9
0
    public static List <World.Block> FromWorldData(this DatabaseArray input)
    {
        var blocks = new List <World.Block>();

        if (input == null || input.Count == 0)
        {
            return(blocks);
        }

        for (int i = 0; i < input.Count; i++)
        {
            if (input.Contains(i) && input.GetObject(i).Count != 0)
            {
                var     obj  = input.GetObject(i);
                dynamic temp = new World.Block();

                foreach (var kvp in obj)
                {
                    temp[kvp.Key] = kvp.Value;
                }

                byte[] x  = obj.TryGetBytes("x", new byte[0]), y = obj.TryGetBytes("y", new byte[0]);
                byte[] x1 = obj.TryGetBytes("x1", new byte[0]), y1 = obj.TryGetBytes("y1", new byte[0]);

                for (int j = 0; j < x1.Length; j++)
                {
                    temp.Locations.Add(new World.Block.Location()
                    {
                        X = x1[j], Y = y1[j]
                    });
                }
                for (int k = 0; k < x.Length; k += 2)
                {
                    temp.Locations.Add(new World.Block.Location()
                    {
                        X = (x[k] << 8) + x[k + 1], Y = (y[k] << 8) + y[k + 1]
                    });
                }

                blocks.Add(temp);
            }
        }

        return(blocks);
    }
Example #10
0
        private void UnserializeFromComplexObject(DatabaseArray worlddata)
        {
            foreach (DatabaseObject ct in worlddata)
            {
                if (ct.Count == 0)
                {
                    continue;
                }

                try
                {
                    var type     = Convert.ToUInt32(ct.GetValue("type"));
                    var layerNum = ct.GetInt("layer", 0);
                    var xArr     = ct.GetBytes("x", new byte[0]);
                    var yArr     = ct.GetBytes("y", new byte[0]);
                    var x1Arr    = ct.GetBytes("x1", new byte[0]);
                    var y1Arr    = ct.GetBytes("y1", new byte[0]);
                    var points   = WorldUtils.GetShortPos(x1Arr, y1Arr)
                                   .Concat(WorldUtils.GetPos(xArr, yArr));

                    if (layerNum == 0)
                    {
                        var foreground = (Foreground.Id)type;
                        var block      = WorldUtils.GetForegroundFromDatabase(ct, foreground);
                        foreach (var loc in points)
                        {
                            this.Foreground[loc.X, loc.Y] = block;
                        }
                    }
                    else
                    {
                        var background = (Background.Id)type;
                        var block      = new BackgroundBlock(background);
                        foreach (var loc in points)
                        {
                            this.Background[loc.X, loc.Y] = block;
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
        }
Example #11
0
        private void setRandom(AuthPlayer player)
        {
            switch (this.rnd.Next(5))
            {
            default:
            {
                player.PlayerObject.Set("crap" + this.rnd.Next(5), this.rnd.Next(100000));
                return;
            }

            case 1:
            {
                player.PlayerObject.Set("crap" + this.rnd.Next(5), "String " + this.rnd.Next(100000));
                return;
            }

            case 2:
            {
                player.PlayerObject.Set("crap" + this.rnd.Next(5), this.rnd.Next(1) == 0);
                return;
            }

            case 3:
            {
                player.PlayerObject.Set("crap" + this.rnd.Next(5), this.rnd.NextDouble());
                return;
            }

            case 4:
            {
                var tst = new DatabaseArray();
                for (var i = 0; i < this.rnd.Next(50); i++)
                {
                    tst.Add(this.rnd.Next());
                }
                player.PlayerObject.Set("crap" + this.rnd.Next(5), tst);
                return;
            }
            }
        }
Example #12
0
    public static List <World.Block> FromJsonArray(this JObject world)
    {
        var array = world["worlddata"].Values().AsJEnumerable();
        var temp  = new DatabaseArray();

        foreach (var block in array)
        {
            var dbo = new DatabaseObject();

            foreach (var token in block)
            {
                var property = (JProperty)token;
                var value    = property.Value;

                switch (value.Type)
                {
                case JTokenType.Integer:
                    dbo.Set(property.Name, (uint)value);
                    break;

                case JTokenType.Boolean:
                    dbo.Set(property.Name, (bool)value);
                    break;

                case JTokenType.Float:
                    dbo.Set(property.Name, (double)value);
                    break;

                default:
                    dbo.Set(property.Name, (string)value);
                    break;
                }
            }

            temp.Add(dbo);
        }

        return(FromWorldData(temp));
    }
Example #13
0
        private void UnserializeFromComplexObject(DatabaseArray worlddata)
        {
            foreach (DatabaseObject ct in worlddata)
            {
                if (ct.Count == 0)
                {
                    continue;
                }
                var type     = (uint)ct.GetValue("type");
                var layerNum = ct.GetInt("layer", 0);
                var xs       = ct.GetBytes("x", new byte[0]);
                var ys       = ct.GetBytes("y", new byte[0]);

                if (layerNum == 0)
                {
                    var foreground = (Foreground.Id)type;
                    var block      = WorldUtils.GetDatabaseBlock(ct, foreground);
                    for (var b = 0; b < xs.Length; b += 2)
                    {
                        var nx = (xs[b] << 8) + xs[b + 1];
                        var ny = (ys[b] << 8) + ys[b + 1];
                        this.Foreground[nx, ny] = block;
                    }
                }
                else
                {
                    var background = (Background.Id)type;
                    var block      = new BackgroundBlock(background);
                    for (var b = 0; b < xs.Length; b += 2)
                    {
                        var nx = (xs[b] << 8) + xs[b + 1];
                        var ny = (ys[b] << 8) + ys[b + 1];
                        this.Background[nx, ny] = block;
                    }
                }
            }
        }
Example #14
0
        private void createPreviewObjects()
        {
            Console.WriteLine("Objects of same type were deleted.");
            int currentObjectSize = 0;
            int currentPartID = 1;
            var currentObject = new DatabaseObject();
            var currentFramesSet = new DatabaseArray();

            foreach (byte[] arr in outGoingSnapshots)
            {
                Console.WriteLine("Obj size: " + arr.Length);
                currentObjectSize += arr.Length;
                currentFramesSet.Add(arr);

                if (currentObjectSize > 400000)
                    //start new preview part if currentObject size is > 400kb (Playerio obj limmit size is 500kb)
                {
                    fillObject(currentObject, currentFramesSet);
                    gamelink.PlayerIO.BigDB.CreateObject("Previews", spellName + "_part_" + currentPartID, currentObject,
                        onObjCreated);
                    currentObject = new DatabaseObject();
                    currentFramesSet = new DatabaseArray();
                    currentPartID++;
                    currentObjectSize = 0;
                }
            }

            if (currentFramesSet.Count > 0) //create last object
            {
                fillObject(currentObject, currentFramesSet);
                gamelink.PlayerIO.BigDB.CreateObject("Previews", spellName + "_part_" + currentPartID, currentObject,
                    onObjCreated);
            }

            Console.WriteLine("Will write obhects with total size: " + outGoingSnapshots);
        }
Example #15
0
 public void TestInit()
 {
     // Arrange
     this.type = typeof(DatabaseArray);
     this.db   = new DatabaseArray(1);
 }
Example #16
0
        /// <summary>
        /// Deserialize's the world data
        /// </summary>
        /// <param name="worldObject">The world data as a database array</param>
        private void Deserialize(DatabaseObject worldObject)
        {
            Owner           = GetValue <string>(worldObject, "owner");
            Width           = GetValue <int>(worldObject, "width", 200);
            Height          = GetValue <int>(worldObject, "height", 200);
            Title           = GetValue <string>(worldObject, "name");
            Plays           = GetValue <int>(worldObject, "plays");
            WorldType       = (WorldType)GetValue <int>(worldObject, "type", 3);
            AllowPotions    = GetValue <bool>(worldObject, "allowpotions", true);
            Woots           = GetValue <int>(worldObject, "woots", 0);
            TotalWoots      = GetValue <int>(worldObject, "totalwoots", 0);
            Visible         = GetValue <bool>(worldObject, "visible", true);
            BackgroundColor = new FluidColor(GetValue <uint>(worldObject, "backgroundColor", 0));

            //Check is worlddata is present
            if (!worldObject.Contains("worlddata"))
            {
                return;
            }

            CreateEmptyWorld();

            DatabaseArray        databaseArray = (DatabaseArray)worldObject["worlddata"];
            IEnumerable <object> databaseEnum  = (IEnumerable <object>)databaseArray;

            using (IEnumerator <object> enumerator = databaseEnum.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    DatabaseObject blockData = (DatabaseObject)enumerator.Current;

                    byte[]  xBytes  = blockData.GetBytes("x");
                    byte[]  yBytes  = blockData.GetBytes("y");
                    BlockID blockId = (BlockID)blockData.GetUInt("type");

                    for (int i = 0; i < xBytes.Length; i += 2)
                    {
                        int x = xBytes[i] << 8 | xBytes[i + 1];
                        int y = yBytes[i] << 8 | yBytes[i + 1];
                        if (blockData.Contains("layer"))
                        {
                            Layer layer = (Layer)blockData.GetInt("layer");

                            switch (blockId)
                            {
                            case BlockID.HazardSpike:
                            case BlockID.DecorSciFi2013BlueSlope:
                            case BlockID.DecorSciFi2013BlueStraight:
                            case BlockID.DecorSciFi2013YellowSlope:
                            case BlockID.DecorSciFi2013YellowStraight:
                            case BlockID.DecorSciFi2013GreenSlope:
                            case BlockID.DecorSciFi2013GreenStraight:
                            case BlockID.OneWayCyan:
                            case BlockID.OneWayPink:
                            case BlockID.OneWayRed:
                            case BlockID.OneWayYellow:
                            {
                                Rotation rotation = (Rotation)blockData.GetUInt("rotation");

                                RotatableBlock rotatableBlock = new RotatableBlock(blockId, x, y, rotation);
                                SetBlock(rotatableBlock);
                            }
                            break;

                            case BlockID.CoinDoor:
                            case BlockID.BlueCoinDoor:
                            case BlockID.CoinGate:
                            case BlockID.BlueCoinGate:
                            {
                                uint goal = blockData.GetUInt("goal");

                                CoinBlock door = new CoinBlock(blockId, x, y, goal);
                                SetBlock(door);
                            }
                            break;

                            case BlockID.MusicDrum:
                            case BlockID.MusicPiano:
                            {
                                uint musicId = blockData.GetUInt("id");

                                MusicBlock musicBlock = new MusicBlock(blockId, x, y, musicId);
                                SetBlock(musicBlock);
                            }
                            break;

                            case BlockID.Portal:
                            case BlockID.InvisiblePortal:
                            {
                                Rotation rotation     = (Rotation)blockData.GetUInt("rotation");
                                uint     portalid     = blockData.GetUInt("id");
                                uint     portaltarget = blockData.GetUInt("target");

                                Portal portal = new Portal(blockId, x, y, rotation, portalid, portaltarget);
                                SetBlock(portal);
                            }
                            break;

                            case BlockID.SwitchPurple:
                            case BlockID.PurpleSwitchDoor:
                            case BlockID.PurpleSwitchGate:
                            {
                                uint goal = 0;
                                if (blockData.Contains("goal"))
                                {
                                    goal = blockData.GetUInt("goal");
                                }

                                PurpleBlock purpleBlock = new PurpleBlock(blockId, x, y, goal);
                                SetBlock(purpleBlock);
                            }
                            break;

                            case BlockID.DeathDoor:
                            case BlockID.DeathGate:
                            {
                                uint goal = blockData.GetUInt("goal");

                                DeathBlock deathBlock = new DeathBlock(blockId, x, y, goal);
                                SetBlock(deathBlock);
                            }
                            break;

                            case BlockID.WorldPortal:
                            {
                                string targetId = blockData.GetString("target");

                                WorldPortal worldPortal = new WorldPortal(blockId, x, y, targetId);
                                SetBlock(worldPortal);
                            }
                            break;

                            case BlockID.DecorSign:
                            {
                                string text = blockData.GetString("text");

                                TextBlock textBlock = new TextBlock(blockId, x, y, text);
                                SetBlock(textBlock);
                            }
                            break;

                            case BlockID.DecorLabel:
                            {
                                string text = blockData.GetString("text");
                                if (blockData.Contains("text_color"))
                                {
                                    string hexColor = blockData.GetString("text_color");

                                    LabelBlock labelBlock = new LabelBlock(blockId, x, y, text, hexColor);
                                    SetBlock(labelBlock);
                                }
                                else
                                {
                                    LabelBlock labelBlock = new LabelBlock(blockId, x, y, text);
                                    SetBlock(labelBlock);
                                }
                            }
                            break;

                            default:
                                Block block = new Block(blockId, layer, x, y);
                                SetBlock(block);
                                break;
                            }
                        }
                    }
                }
            }

            IsLoaded = true;
        }
Example #17
0
        public override void resolve(Player player, string[] commandInput)
        {
            var lastreport = player.lastreport;

            if (lastreport.AddSeconds(90) > DateTime.Now)
            {
                Console.WriteLine("Spamming. Not saved. " + lastreport + " vs " + DateTime.Now);
                player.Send("info", "Report submitted", "Thank you for your report, we'll look into it shortly.");
                return;
            }


            if (commandInput.Length < 3)
            {
                player.Send("info", "Report", "Please specify a playername and a reason for this report");
                return;
            }


            var reportedUserName = commandInput[1].Trim().ToLower();

            var existingReport = this._game.GetLocalCopyOfReport(reportedUserName);

            if (existingReport != null)
            {
                if (existingReport.GetDateTime("Date").AddSeconds(90) > DateTime.Now)
                {
                    Console.WriteLine("Existing report found. Not saved");
                    //if (existingReport.GetString("ReportedByUsername", "") == player.name)
                    //{
                    player.Send("info", "Report submitted", "Thank you for your report, we'll look into it shortly.");
                    return;
                    //}
                }
            }

            this._game.PlayerIO.BigDB.Load("usernames", reportedUserName, delegate(DatabaseObject o)
            {
                if (o == null || o.GetString("owner", null) == null)
                {
                    player.Send("write", this._game.SystemName, "User " + reportedUserName.ToUpper() + " not found");
                    return;
                }

                var reportedUserConnectId = o.GetString("owner");

                // if theres a reason
                var reason = "";
                for (var a = 2; a < commandInput.Length; a++)
                {
                    reason += commandInput[a] + " ";
                }

                // get current chat texts
                var chatMessages = this._game.GetLastChatMessages();
                var messages     = new StringBuilder();
                foreach (var message in chatMessages)
                {
                    if (message != null)
                    {
                        messages.Append("name: " + message.name + ": " + message.text + " | ");
                    }
                }

                var signsList     = this._game.BaseWorld.GetBrickTextSignList();
                var signtextArray = new DatabaseArray();
                foreach (var sign in signsList)
                {
                    signtextArray.Add(sign.text);
                }
                var chattextArray = new DatabaseArray();
                foreach (var message in chatMessages)
                {
                    chattextArray.Add(message.name + ": " + message.text);
                }

                var report = new DatabaseObject();
                report.Set("ReportedByUsername", player.name);
                report.Set("ReportedByConnectId", player.ConnectUserId);
                report.Set("State", "Open");
                report.Set("Date", DateTime.Now);
                report.Set("WorldId", this._game.BaseWorld.key);
                report.Set("WorldName", this._game.BaseWorld.name);
                report.Set("Reason", reason);
                report.Set("Signs", signtextArray);
                report.Set("ChatLog", chattextArray);
                report.Set("ReportedUsername", reportedUserName);
                report.Set("ReportedUserConnectId", reportedUserConnectId);

                this._game.SaveLocalCopyOfReport(report);

                player.lastreport = DateTime.Now;
                this._game.PlayerIO.BigDB.CreateObject("AbuseReports", null, report,
                                                       delegate
                {
                    player.Send("info", "Report submitted", "Thank you for your report, we'll look into it shortly.");
                }, delegate
                {
                    player.lastreport = DateTime.Now.AddHours(-1);
                    player.Send("info", "Error occured", "An error occured in while submitting. Please try again.");
                });
            });
        }
Example #18
0
        public override void GotMessage(FBPlayer player, Message m)
        {
            switch (m.Type)
            {
            case MessageID.FB_INVITED_USERS:
                player.RefreshPlayerObject(delegate() {
                    DatabaseArray invited = player.PlayerObject.GetArray("FBInvites");
                    if (invited == null)
                    {
                        player.PlayerObject.Set("FBInvites", new DatabaseArray());
                        invited = player.PlayerObject.GetArray("FBInvites");
                    }

                    int count     = m.GetInt(0);
                    string[] keys = new string[count];
                    int keyCount  = 0;
                    for (uint i = 0; i < count; i++)
                    {
                        string id  = m.GetString(i + 1);
                        bool found = false;
                        for (int j = 0; j < invited.Count; j++)
                        {
                            if (id == invited.GetString(j))
                            {
                                found = true;
                                break;
                            }
                        }
                        if (!found)
                        {
                            //invited.Add(id);
                            keys[keyCount++] = id;
                        }
                    }

                    /*for (int j = 0; j < invited.Count; j++) {
                     *      keys[j] = invited.GetString(j);
                     * }*/
                    // remove already playing players
                    PlayerIO.BigDB.LoadKeys("PlayerObjects", keys, delegate(DatabaseObject[] arr) {
                        foreach (DatabaseObject dbo in arr)
                        {
                            if (dbo != null)
                            {
                                for (int j = count - 1; j >= 0; j--)
                                {
                                    if ("fb" + keys[j] == dbo.Key)
                                    {
                                        //invited.RemoveAt(j);
                                        keys[j] = null;
                                    }
                                }
                            }
                        }
                        for (int i = 0; i < count; i++)
                        {
                            if (keys[i] != null)
                            {
                                invited.Add(keys[i]);
                            }
                        }
                        player.PlayerObject.Save();
                    });
                });

                break;
            }
        }
Example #19
0
        public void addLastPlayedMap(String mapKey)
        {
            if (isGuest)
            {
                return;
            }

            DatabaseArray  maps        = PlayerObject.GetArray("LastPlayedMaps");
            DatabaseObject mapEntry    = null;
            DatabaseObject oldestEntry = null;
            int            oldestIndex = 0;

            for (int i = 0; i < maps.Count; ++i)
            {
                DatabaseObject entry = maps.GetObject(i.ToString());
                if (entry.Contains("Map"))
                {
                    if (entry.GetString("Map") == mapKey)
                    {
                        mapEntry = entry;
                    }
                    else
                    {
                        if (oldestEntry == null || DateTime.Compare(entry.GetDateTime("Date"), oldestEntry.GetDateTime("Date")) < 0)
                        {
                            oldestEntry = entry;
                            oldestIndex = i;
                        }
                    }
                }
            }

            // remove oldest entry if list is full
            //if (maps.Count > 8) {
            //	maps.Remove(oldestIndex.ToString());
            //}
            // if current map is already in last played list, just update date
            if (mapEntry != null)
            {
                mapEntry.Set("Date", DateTime.Now);
            }
            else
            {
                DatabaseObject entry = new DatabaseObject();
                entry.Set("Map", mapKey);
                entry.Set("Date", DateTime.Now);
                maps.Add(entry);
            }

            PlayerObject.Remove("LastPlayedMaps");
            //sort the array from the latest to oldest
            DatabaseArray newMaps     = new DatabaseArray();
            int           newestIndex = 0;
            bool          found       = false;

            do
            {
                found       = false;
                newestIndex = 0;
                DatabaseObject newestEntry = null;
                //foreach(DatabaseObject entry in maps) {
                for (int i = 0; i < maps.Count; ++i)
                {
                    if (!maps.Contains(i.ToString()))
                    {
                        continue;
                    }
                    DatabaseObject entry = maps.GetObject(i.ToString());
                    if (!entry.Contains("Date"))
                    {
                        continue;
                    }

                    if (newestEntry == null || DateTime.Compare(entry.GetDateTime("Date"), newestEntry.GetDateTime("Date")) > 0)
                    {
                        newestEntry = entry;
                        newestIndex = i;
                        found       = true;
                    }
                }
                if (found)
                {
                    DatabaseObject tmp = maps.GetObject(newestIndex.ToString());
                    maps.Remove(newestIndex.ToString());
                    bool duplicate = false;
                    foreach (DatabaseObject dbo in newMaps)
                    {
                        if (dbo.GetString("Map") == tmp.GetString("Map"))
                        {
                            duplicate = true;
                            break;
                        }
                    }
                    if (duplicate)
                    {
                        continue;
                    }

                    DatabaseObject tmp2 = new DatabaseObject();
                    tmp2.Set("Map", tmp.GetString("Map"));
                    tmp2.Set("Date", tmp.GetDateTime("Date"));
                    //newMaps.Add(tmp2);
                    newMaps.Insert(0, tmp2);
                }
            } while (found && newMaps.Count < 8);

            //newMaps = (DatabaseArray)newMaps.Reverse();

            PlayerObject.Set("LastPlayedMaps", newMaps);

            /*maps = PlayerObject.GetArray("LastPlayedMaps");
             * for (int i = 0; i < maps.Count; i++) {
             *      Console.WriteLine(maps.GetObject(i).GetString("Map"));
             * }*/

            savePlayerData();
        }
Example #20
0
        private void UnserializeFromComplexObject(DatabaseArray worlddata)
        {
            foreach (DatabaseObject ct in worlddata)
            {
                if (ct.Count == 0) continue;
                var type = (uint)ct.GetValue("type");
                var layerNum = ct.GetInt("layer", 0);
                var xs = ct.GetBytes("x", new byte[0]);
                var ys = ct.GetBytes("y", new byte[0]);

                if (layerNum == 0)
                {
                    var foreground = (Foreground.Id)type;
                    var block = WorldUtils.GetDatabaseBlock(ct, foreground);
                    for (var b = 0; b < xs.Length; b += 2)
                    {
                        var nx = (xs[b] << 8) + xs[b + 1];
                        var ny = (ys[b] << 8) + ys[b + 1];
                        this.Foreground[nx, ny] = block;
                    }
                }
                else
                {
                    var background = (Background.Id)type;
                    var block = new BackgroundBlock(background);
                    for (var b = 0; b < xs.Length; b += 2)
                    {
                        var nx = (xs[b] << 8) + xs[b + 1];
                        var ny = (ys[b] << 8) + ys[b + 1];
                        this.Background[nx, ny] = block;
                    }
                }
            }
        }
Example #21
0
        // This method is called when a player sends a message into the server code
        public override void GotMessage(Player player, Message message)
        {
            switch (message.Type)
            {
            // player has moved up, down, left, or right
            case "move":
            {
                //Console.WriteLine("Player position before move: " + player.positionX + ", " + player.positionY); //debug
                int messageX = message.GetInt(0);
                int messageY = message.GetInt(1);
                player.positionX = player.positionX + messageX;
                player.positionY = player.positionY + messageY;
                //Console.WriteLine("Player " + player.Id + " is moving to (" + player.positionX + ", " + player.positionY + ")"); //debug
                Broadcast("PlayerMove", player.Id, messageX, messageY);
                break;
            }

            case "LoadPlayers":
            {
                // this is how you broadcast a messa"LoadPlayers":
                //Update them on who is already in the game
                foreach (Player x in players)
                {
                    if (x != null && x != player)
                    {
                        //Console.WriteLine("Sending Player " + player.Id + " Player " + x.Id + " Position (" + x.positionX + ", " + x.positionY + ")"); //debug
                        player.Send("UserJoined", x.Id, x.positionX, x.positionY, x.ConnectUserId);
                    }
                }
                break;
            }

            //Load the coins, randomize them if they dont exist
            case "LoadCoins":
            {
                Random random = new Random();
                if (Coins == null)
                {
                    DatabaseArray coins = new DatabaseArray();
                    for (int i = 0; i < 5; i++)
                    {
                        DatabaseObject coin    = new DatabaseObject();
                        int            randomX = random.Next(0, 9);
                        int            randomY = random.Next(0, 9);
                        coin.Set("xTile", randomX);
                        coin.Set("yTile", randomY);
                        coin.Set("Uses", 0);
                        player.Send("coinSetup", randomX, randomY, 0);
                        coins.Set(i, coin);
                    }
                    Coins = coins;
                    quest.Set("Coins", Coins);
                    quest.Save();
                }
                else
                {
                    for (int i = 0; i < 5; i++)
                    {
                        DatabaseObject coin = Coins.GetObject(i);
                        player.Send("coinSetup", coin.GetInt("xTile"), coin.GetInt("yTile"), coin.GetInt("Uses"));
                    }
                }
                break;
            }

            // client is asking for data about player to draw on the screen
            case "playerInfo":
            {
                if (players[player.Id - 1] == null)
                {
                    player.Send("noSuchPlayer");
                }
                else
                {
                    player.Send("playerInfo", players[player.Id - 1].positionX, players[player.Id - 1].positionY, playerConnectUserId, player.characterClass);
                }
                break;
            }

            case "MapTileChanged":
            {
                int xTile       = message.GetInt(0);
                int yTile       = message.GetInt(1);
                int newTileType = message.GetInt(2);
                //Console.WriteLine("Map Tile Change From Player " + player.Id + " (" + xTile + "," + yTile + ") to type: " + newTileType);
                Broadcast("MapTileChanged", player.Id, xTile, yTile, newTileType);
                break;
            }

            // update server's variables for this player stat
            case "updateStat":
            {
                String statType = message.GetString(0);
                switch (statType)
                {
                case "AP":
                    player.AP = message.GetInt(1);
                    //Console.WriteLine("server: player's AP changed! " + player.AP);
                    break;

                case "lumber":
                    amountLumber = message.GetInt(1);
                    //Console.WriteLine("server: player's lumber changed! " + amountLumber);
                    break;

                case "cherry":
                    amountCherry = message.GetInt(1);
                    //Console.WriteLine("server: player's cherry changed! " + amountCherry);
                    break;
                }
                break;
            }

            case "win":
            {
                PlayerIO.BigDB.Load(mapType, levelKey,
                                    delegate(DatabaseObject result)
                    {
                        // todo: change these based on what you got in the level
                        int gainedxp   = 0;      // = result.GetInt("XP");
                        int gainedcoin = 0;      // = result.GetInt("Coin");

                        if (result != null)
                        {
                            gainedxp   = result.GetInt("XP", 0);       //How much XP the Level was worth
                            gainedcoin = result.GetInt("Coin", 0);     //How mucg coin the level was worth
                        }
                        String nextLevel = "";
                        //Check to see if player completed Tutorial level, in which case update their tutorial value
                        if (player.PlayerObject.GetInt("tutorial") == 1)
                        {
                            DatabaseArray abilities = new DatabaseArray();
                            abilities.Add("Crafter_Bridge");
                            player.PlayerObject.Set("abilities", abilities);
                            player.PlayerObject.Set("tutorial", 2);
                            nextLevel = "Tutorial_2";
                        }
                        else if (player.PlayerObject.GetInt("tutorial") == 2)
                        {
                            DatabaseArray abilities = player.PlayerObject.GetArray("abilities");
                            abilities.Add("Planter_RedFlower");
                            player.PlayerObject.Set("tutorial", 3);
                            nextLevel = "Tutorial_3";
                        }
                        else if (player.PlayerObject.GetInt("tutorial") == 3)
                        {
                            player.PlayerObject.Set("tutorial", 4);
                            nextLevel = "Tutorial_4";
                        }
                        else if (player.PlayerObject.GetInt("tutorial") == 4)
                        {
                            DatabaseArray abilities = player.PlayerObject.GetArray("abilities");
                            abilities.Add("Cook_MonsterBacon");
                            player.PlayerObject.Set("tutorial", 5);
                            nextLevel = "Tutorial_5";
                        }
                        else if (player.PlayerObject.GetInt("tutorial") == 5)
                        {
                            nextLevel = "Class_Choose";
                            player.PlayerObject.Set("tutorial", 6);
                        }
                        int experience = player.PlayerObject.GetInt("xp");

                        /*int level = player.PlayerObject.GetInt("level");
                         *
                         *
                         * //Check to see if the player has enough XP to level up
                         * if (experience + gainedxp >= levelXP(level + 1))
                         * {
                         *  player.PlayerObject.Set("level", level + 1);
                         * }*/
                        player.PlayerObject.Set("xp", experience + gainedxp);
                        player.PlayerObject.Set("coin", player.PlayerObject.GetInt("coin", 0) + gainedcoin);
                        player.PlayerObject.Save(delegate()
                        {
                            // quest is finished; remove this quest from the table
                            // todo: what happens if another player is playing this quest?
                            PlayerIO.BigDB.DeleteKeys("NewQuests", questID);
                            //Console.WriteLine("deleted newquest key");
                            PlayerIO.BigDB.Load("PlayerObjects", player.ConnectUserId,
                                                delegate(DatabaseObject thisPlayer)
                            {
                                thisPlayer.Set("questID", "noQuest");
                                thisPlayer.Save(delegate() { Broadcast("win", gainedxp, gainedcoin, nextLevel); });
                            }
                                                );
                        });
                    },
                                    delegate(PlayerIOError error)
                    {
                        //Console.WriteLine(error.ToString());
                    });

                break;
            }

            // recieves one string that is the newly updated map; save to associated quest object
            case "QuestMapUpdate":
            {
                questMap = message.GetString(0);
                player.GetPlayerObject(
                    delegate(DatabaseObject updatedPlayerObject){
                        PlayerIO.BigDB.Load("NewQuests", questID,
                                            delegate(DatabaseObject dbo)
                        {
                            dbo.Set("tileValues", message.GetString(0));
                            dbo.Save();
                        });
                    });
                break;
            }

            case "MonsterAPChange":
            {
                int newAp        = message.GetInt(0);
                int monsterIndex = message.GetInt(1);
                PlayerIO.BigDB.Load("newQuests", questID,
                                    delegate(DatabaseObject dbo)
                    {
                        DatabaseArray monsters = dbo.GetArray("Monsters");
                        monsters.GetObject(monsterIndex).Set("AP", newAp);
                        dbo.Save();
                    });

                Broadcast("MonsterAPChange", player.Id, newAp, monsterIndex);
                break;
            }

            case "SpriteMove":
            {
                String type         = message.GetString(0);
                int    newXTile     = message.GetInt(1);
                int    newYTile     = message.GetInt(2);
                int    monsterIndex = message.GetInt(3);

                PlayerIO.BigDB.Load("newQuests", questID,
                                    delegate(DatabaseObject dbo)
                    {
                        DatabaseArray sprites = dbo.GetArray(type);
                        DatabaseObject sprite = sprites.GetObject(monsterIndex);
                        sprite.Set("xTile", newXTile);
                        sprite.Set("yTile", newYTile);
                        dbo.Save();
                    });
                break;
            }

            case "AddSprite":
            {
                String type  = message.GetString(0);
                int    xTile = message.GetInt(1);
                int    yTile = message.GetInt(2);
                String name  = message.GetString(3);
                int    range = message.GetInt(4);

                DatabaseObject newSprite = new DatabaseObject();
                newSprite.Set("xTile", xTile);
                newSprite.Set("yTile", yTile);
                newSprite.Set("Type", name);
                newSprite.Set("Uses", 0);
                newSprite.Set("Range", range);

                Broadcast("AddSprite", xTile, yTile, name, range);
                PlayerIO.BigDB.Load("newQuests", questID,
                                    delegate(DatabaseObject dbo)
                    {
                        if (dbo.Contains(type))
                        {
                            DatabaseArray sprites = dbo.GetArray(type);
                            sprites.Add(newSprite);
                        }
                        else
                        {
                            DatabaseArray sprites = new DatabaseArray();
                            sprites.Add(newSprite);
                            dbo.Set(type, sprites);
                        }
                        dbo.Save();
                    });
                break;
            }

            case "SpriteUse":
            {
                int index = message.GetInt(0);
                int uses  = message.GetInt(1);
                //Console.WriteLine("Sprite " + index + " Is being used for the " + uses + " time");
                Broadcast("SpriteUse", player.Id, index);
                PlayerIO.BigDB.Load("newQuests", questID,
                                    delegate(DatabaseObject dbo)
                    {
                        DatabaseArray sprites = dbo.GetArray("Effects");
                        DatabaseObject sprite = sprites.GetObject(index);
                        sprite.Set("Uses", uses);
                        dbo.Save();
                    });
                break;
            }

            case "CoinUse":
            {
                int index = message.GetInt(0);
                int uses  = message.GetInt(1);
                Broadcast("CoinUse", player.Id, index);
                PlayerIO.BigDB.Load("newQuests", questID,
                                    delegate(DatabaseObject dbo)
                    {
                        DatabaseArray sprites = dbo.GetArray("Coins");
                        DatabaseObject sprite = sprites.GetObject(index);
                        Coins.GetObject(index).Set("Uses", uses);
                        sprite.Set("Uses", uses);
                        dbo.Save();
                    });
                break;
            }
            }
        }
Example #22
0
        // This method is called whenever a player joins the game
        public override void UserJoined(Player player)
        {
            // this is how you send a player a message
            //Send the player their player Number.
            playerConnectUserId = player.ConnectUserId;
            if (numPlayers < players.Length)
            {
                players[numPlayers] = player;
                //Console.WriteLine("New Player " + player.Id);
                numPlayers++;

                // if player is not attached to a quest, give them a new quest ID
                PlayerIO.BigDB.Load("PlayerObjects", player.ConnectUserId,
                                    delegate(DatabaseObject result)
                {
                    player.characterClass = result.GetString("role", "Novice");
                    player.costume        = result.GetString("costume", "novice");
                    player.tutorialLevel  = result.GetInt("tutorial", 1);
                    //Console.WriteLine("player class: " + player.characterClass);
                    if (questID != null && (!result.Contains("questID") || result.GetString("questID") == "noQuest"))
                    {
                        result.Set("questID", questID);
                        result.Save();

                        PlayerIO.BigDB.Load("NewQuests", questID,
                                            delegate(DatabaseObject quest)
                        {
                            this.quest = quest;

                            DatabaseObject questPlayerData = new DatabaseObject();
                            player.positionX = startX;
                            player.positionY = startY;
                            questPlayerData.Set("positionX", startX);
                            questPlayerData.Set("positionY", startY);
                            questPlayerData.Set("AP", 20);
                            quest.GetObject("players").Set(player.ConnectUserId, questPlayerData);
                            quest.GetObject("players").Set("numPlayers", quest.GetObject("players").Count - 1);
                            quest.Save(delegate()
                            {
                                player.Send("init", player.Id, player.ConnectUserId, startX, startY, questID, 20, levelKey, "", player.characterClass);
                            });

                            Broadcast("UserJoined", player.Id, player.positionX, player.positionY);
                        });
                    }
                    // if player does not have a questID associated with it
                    // create new object in Quests db
                    else if (!result.Contains("questID") || result.GetString("questID") == "noQuest")
                    {
                        // create new quest object
                        DatabaseObject newQuest = new DatabaseObject();

                        // create array for players playing this new quest object
                        DatabaseObject questPlayers = new DatabaseObject();

                        // create new object for this player and their quest data
                        DatabaseObject questPlayerData = new DatabaseObject();

                        //Console.WriteLine("questPlayers contents: " + questPlayers.ToString());
                        //Console.WriteLine("Level key: " + levelKey);
                        //Add Static Map to Quest, to be updated later
                        PlayerIO.BigDB.Load(mapType, levelKey,
                                            delegate(DatabaseObject staticMap)
                        {
                            player.positionX = startX = staticMap.GetInt("startX", 0);
                            player.positionY = startY = staticMap.GetInt("startY", 0);
                            questPlayerData.Set("positionX", startX);
                            questPlayerData.Set("positionY", startY);
                            questPlayerData.Set("AP", 20);

                            // add this player to players playing this quest
                            questPlayers.Set("numPlayers", 1);
                            questPlayers.Set(player.ConnectUserId, questPlayerData);

                            newQuest.Set("players", questPlayers);
                            newQuest.Set("StaticMapKey", staticMap.Key);
                            newQuest.Set("tileValues", staticMap.GetString("tileValues"));
                            newQuest.Set("MonsterCount", staticMap.GetInt("MonsterCount"));
                            if (staticMap.Contains("Monsters"))
                            {
                                DatabaseArray monsters    = staticMap.GetArray("Monsters");
                                DatabaseArray newMonsters = new DatabaseArray();
                                for (int i = 1; i <= monsters.Count; i++)
                                {
                                    DatabaseObject monster = new DatabaseObject();
                                    monster.Set("Type", monsters.GetObject(i - 1).GetString("Type"));
                                    monster.Set("xTile", monsters.GetObject(i - 1).GetInt("xTile"));
                                    monster.Set("yTile", monsters.GetObject(i - 1).GetInt("yTile"));
                                    monster.Set("AP", monsters.GetObject(i - 1).GetInt("AP"));
                                    newMonsters.Add(monster);
                                }
                                newQuest.Set("Monsters", newMonsters);
                            }
                            if (staticMap.Contains("Buttons"))
                            {
                                DatabaseArray buttons    = staticMap.GetArray("Buttons");
                                DatabaseArray newButtons = new DatabaseArray();
                                for (int i = 1; i <= buttons.Count; i++)
                                {
                                    DatabaseObject button = new DatabaseObject();
                                    button.Set("xTile", buttons.GetObject(i - 1).GetInt("xTile"));
                                    button.Set("yTile", buttons.GetObject(i - 1).GetInt("yTile"));
                                    button.Set("xOpen", buttons.GetObject(i - 1).GetInt("xOpen"));
                                    button.Set("yOpen", buttons.GetObject(i - 1).GetInt("yOpen"));
                                    newButtons.Add(button);
                                }
                                newQuest.Set("Buttons", newButtons);
                            }
                            Console.WriteLine("Setting up new quest " + newQuest.ToString());
                            // add this quest object to Quests db
                            PlayerIO.BigDB.CreateObject("NewQuests", null, newQuest,
                                                        delegate(DatabaseObject addedQuest)
                            {
                                questID = addedQuest.Key;
                                addedQuest.Set("RoomID", this.RoomId);
                                Console.WriteLine("made new questID!  new questID is: " + questID);
                                result.Set("questID", addedQuest.Key);
                                result.Save();
                                //levelKey = addedQuest.Key;
                                // tell client to initialize (board, monsters, player object & player sprite) with max AP amount
                                addedQuest.Save(delegate() { quest = addedQuest; player.Send("init", player.Id, player.ConnectUserId, startX, startY, questID, 20, levelKey, "", player.costume); });
                                Broadcast("UserJoined", player.Id, player.positionX, player.positionY);
                            });
                        });

                        // save positions in the serverside

                        player.AP = 20;
                    }

                    // else, this player has a questID saved
                    else
                    {
                        questID = result.GetString("questID");
                        //levelKey = questID;
                        // obtain player's last position and save to serverside
                        PlayerIO.BigDB.Load("NewQuests", questID,
                                            delegate(DatabaseObject questObject)
                        {
                            quest = questObject;
                            questObject.Set("RoomID", this.RoomId);
                            questObject.Save();
                            Coins            = questObject.GetArray("Coins");
                            String resources = "";         // player's resources, to pass to client
                            if (questObject != null)
                            {
                                levelKey = questObject.GetString("StaticMapKey");
                                // extract players playing this quest
                                DatabaseObject playersInQuest = questObject.GetObject("players");
                                DatabaseObject thisPlayer     = playersInQuest.GetObject(player.ConnectUserId);
                                player.positionX = thisPlayer.GetInt("positionX");
                                player.positionY = thisPlayer.GetInt("positionY");
                                int startAP      = thisPlayer.GetInt("AP");
                                if (thisPlayer.Contains("lastSessionEndTime"))
                                {
                                    // figure out how much AP player should have based on how long they've been away
                                    lastSessionEndTime = thisPlayer.GetDateTime("lastSessionEndTime");
                                    //Console.WriteLine("last session end time : " + lastSessionEndTime.ToString(DateTimeFormat));
                                    int minutesPassedSinceLastPlay = (startSessionTime - lastSessionEndTime).Minutes;
                                    startAP += minutesPassedSinceLastPlay / 3;
                                    //Console.WriteLine("minutes passed: " + minutesPassedSinceLastPlay + ", amount of AP to add: " + (minutesPassedSinceLastPlay / 3) + ", starting AP: " + startAP);
                                    if (startAP > 20)
                                    {
                                        startAP = 20;
                                    }
                                    player.AP = startAP;
                                }
                                else
                                {
                                    player.AP = 20;
                                }

                                // get information about player resources from db
                                if (thisPlayer.Contains("resources"))
                                {
                                    DatabaseObject resourcesObject = thisPlayer.GetObject("resources");
                                    Console.WriteLine("resources object: " + resourcesObject.ToString());
                                    if (resourcesObject.Contains("lumber"))
                                    {
                                        amountLumber = resourcesObject.GetInt("lumber");
                                        resources   += "Lumber:" + amountLumber;
                                    }
                                    if (resourcesObject.Contains("cherry"))
                                    {
                                        amountCherry = resourcesObject.GetInt("cherry");
                                        resources   += "/Cherry:" + amountCherry;
                                    }

                                    Console.WriteLine("resources string: " + resources);
                                }
                            }

                            // tell client to initialize (board, monsters, player object & player sprite)
                            player.Send("init", player.Id, player.ConnectUserId, player.positionX, player.positionY, questID, player.AP, levelKey, resources, player.costume);
                            Broadcast("UserJoined", player.Id, player.positionX, player.positionY);
                        }
                                            );
                    }
                }
                                    );
            }
            else
            {
                player.Send("full");
            }

            Console.WriteLine("userJoined is done");
        }
Example #23
0
 private void fillObject(DatabaseObject currentObject, DatabaseArray currentFramesSet)
 {
     currentObject.Set("spellName", spellName);
     currentObject.Set("frames", currentFramesSet);
     currentObject.Set("areaWidth", areaWidth);
     currentObject.Set("areaHeight", areaHeight);
 }
Example #24
0
        public void Save(string roomId, World world)
        {
            var dbo = this.campaignPlayer;

            var effects = new DatabaseArray();

            foreach (var effect in this.player.GetEffects())
            {
                // If it's timed effect we can assume it expired and simply reset player's position to checkpoint
                if (effect.CanExpire)
                {
                    this.player.Checkpoint =
                        world.GetBrickType(0, this.player.Checkpoint.X, this.player.Checkpoint.Y) ==
                        (uint)ItemTypes.Checkpoint
                            ? this.player.Checkpoint
                            : world.GetSpawn();

                    this.player.X       = this.player.Checkpoint.X * 16;
                    this.player.Y       = this.player.Checkpoint.Y * 16;
                    this.player.SpeedX  = 0;
                    this.player.SpeedY  = 0;
                    this.player.Deaths += 1;
                }
                else
                {
                    var effectObject = new DatabaseObject().Set("Id", (int)effect.Id);
                    if (effect.Id == EffectId.Multijump)
                    {
                        effectObject.Set("Arg", effect.Duration);
                    }
                    else if (effect.Id == EffectId.Gravity)
                    {
                        effectObject.Set("Arg", effect.Duration);
                    }
                    effects.Add(effectObject);
                }
            }

            var goldCoins = this.GetPositionsArray(this.player.Coinmap.Where(it => it.Block.Type == 100).ToList());
            var blueCoins = this.GetPositionsArray(this.player.Coinmap.Where(it => it.Block.Type == 101).ToList());

            var coinsObject = new DatabaseObject()
                              .Set("Gold", new DatabaseObject()
                                   .Set("Count", this.player.Coins)
                                   .Set("PosX", goldCoins.Item1)
                                   .Set("PosY", goldCoins.Item2))
                              .Set("Blue", new DatabaseObject()
                                   .Set("Count", this.player.BlueCoins)
                                   .Set("PosX", blueCoins.Item1)
                                   .Set("PosY", blueCoins.Item2));

            var backupObject = new DatabaseObject()
                               .Set("RoomId", roomId)
                               .Set("SaveTime", DateTime.UtcNow)
                               .Set("PosX", this.player.X)
                               .Set("PosY", this.player.Y)
                               .Set("Coins", coinsObject)
                               .Set("Deaths", this.player.Deaths)
                               .Set("CheckpointX", this.player.Checkpoint.X)
                               .Set("CheckpointY", this.player.Checkpoint.Y)
                               .Set("TotalMovements", this.player.TotalMovements)
                               .Set("IsCheater", this.player.IsCheater)
                               .Set("AntiFlightHeat", this.player.AntiFlightHeat)
                               .Set("AntiJumpHeat", this.player.AntiJumpHeat)
                               .Set("Switches", VarintConverter.GetVarintBytes(this.player.Switches))
                               .Set("Team", this.player.Team)
                               .Set("Effects", effects)
                               .Set("SpeedX", this.player.SpeedX)
                               .Set("SpeedY", this.player.SpeedY)
                               .Set("PlayTime", (DateTime.UtcNow - this.player.CampaignJoinTime).TotalMinutes);

            dbo.Set(ObjectName, backupObject);
            dbo.Save();
        }
        public static BigDBObjectValue Create(object value)
        {
            switch (value)
            {
            case string temp:   return(new BigDBObjectValue(ObjectType.String, value));

            case int temp:   return(new BigDBObjectValue(ObjectType.Int, value));

            case uint temp:   return(new BigDBObjectValue(ObjectType.UInt, value));

            case long temp:   return(new BigDBObjectValue(ObjectType.Long, value));

            case float temp:   return(new BigDBObjectValue(ObjectType.Float, value));

            case double temp:   return(new BigDBObjectValue(ObjectType.Double, value));

            case bool temp:   return(new BigDBObjectValue(ObjectType.Bool, value));

            case byte[] temp:   return(new BigDBObjectValue(ObjectType.ByteArray, value));

            case DateTime DateTime:              return(new BigDBObjectValue(ObjectType.DateTime, DateTime.ToUnixTime()));

            case DatabaseObject DatabaseObject:  return(new BigDBObjectValue(ObjectType.DatabaseObject, DatabaseObject.Properties.ToArray()));

            case DatabaseObject[] DatabaseArray: return(new BigDBObjectValue(ObjectType.DatabaseArray, DatabaseArray.SelectMany(p => p.Properties).ToArray()));

            default: throw new ArgumentException($"The type { value.GetType().FullName } is not supported.", nameof(value));
            }
        }
Example #26
0
 public void save(Callback callback)
 {
     if (this.dbo != null)
     {
         var bricks = this.getBrickList(0);
         bricks.AddRange(this.getBrickList(1));
         var worlddata = new DatabaseArray();
         foreach (var b in bricks)
         {
             var cb = new DatabaseObject();
             var i  = b.xs.Count;
             var xs = new byte[i * 2];
             var ys = new byte[i * 2];
             for (var a = 0; a < i; a++)
             {
                 xs[a * 2]     = (byte)((b.xs[a] & 65280U) >> 8);
                 xs[a * 2 + 1] = (byte)(b.xs[a] & 255U);
                 ys[a * 2]     = (byte)((b.ys[a] & 65280U) >> 8);
                 ys[a * 2 + 1] = (byte)(b.ys[a] & 255U);
             }
             cb.Set("type", b.type);
             cb.Set("layer", b.layer);
             cb.Set("x", xs);
             cb.Set("y", ys);
             var type = b.type;
             if (type <= 77U)
             {
                 if (type != 43U)
                 {
                     if (type == 77U)
                     {
                         cb.Set("id", b.id);
                     }
                 }
                 else
                 {
                     cb.Set("goal", b.goal);
                 }
             }
             else if (type != 83U)
             {
                 if (type != 242U)
                 {
                     if (type == 1000U)
                     {
                         cb.Set("text", b.text);
                     }
                 }
                 else
                 {
                     cb.Set("rotation", b.rotation);
                     cb.Set("id", b.id);
                     cb.Set("target", b.target);
                 }
             }
             else
             {
                 cb.Set("id", b.id);
             }
             worlddata.Add(cb);
         }
         this.dbo.Set("worlddata", worlddata);
         if (this.dbo.Contains("world"))
         {
             this.dbo.Remove("world");
         }
         this.dbo.Save(callback);
     }
 }