Ejemplo n.º 1
0
        /// <inheritdoc />
        public void Save(IPlayerEntity player)
        {
            DbCharacter character = _database.Characters.FirstOrDefault(x => x.Id == player.PlayerData.Id);

            character.TaskbarShortcuts.Clear();

            foreach (var applet in player.Taskbar.Applets.Objects)
            {
                if (applet == null)
                {
                    continue;
                }

                var dbApplet = new DbShortcut(ShortcutTaskbarTarget.Applet, applet.SlotIndex, applet.Type,
                                              applet.ObjectId, applet.ObjectType, applet.ObjectIndex, applet.UserId, applet.ObjectData, applet.Text);

                if (applet.Type == ShortcutType.Item)
                {
                    var item = player.Inventory.GetItemAtIndex((int)applet.ObjectId);
                    if (item is null)
                    {
                        continue;
                    }

                    dbApplet.ObjectId = (uint)item.Slot;
                }

                character.TaskbarShortcuts.Add(dbApplet);
            }


            for (int slotLevel = 0; slotLevel < player.Taskbar.Items.Objects.Count; slotLevel++)
            {
                for (int slot = 0; slot < player.Taskbar.Items.Objects[slotLevel].Count; slot++)
                {
                    var itemShortcut = player.Taskbar.Items.Objects[slotLevel][slot];
                    if (itemShortcut == null)
                    {
                        continue;
                    }

                    var dbItem = new DbShortcut(ShortcutTaskbarTarget.Item, slotLevel, itemShortcut.SlotIndex,
                                                itemShortcut.Type, itemShortcut.ObjectId, itemShortcut.ObjectType, itemShortcut.ObjectIndex,
                                                itemShortcut.UserId, itemShortcut.ObjectData, itemShortcut.Text);

                    if (itemShortcut.Type == ShortcutType.Item)
                    {
                        var item = player.Inventory.GetItemAtIndex((int)itemShortcut.ObjectId);
                        if (item is null)
                        {
                            continue;
                        }

                        dbItem.ObjectId = (uint)item.Slot;
                    }

                    character.TaskbarShortcuts.Add(dbItem);
                }
            }

            foreach (var queueItem in player.Taskbar.Queue.Shortcuts)
            {
                if (queueItem == null)
                {
                    continue;
                }

                character.TaskbarShortcuts.Add(new DbShortcut(ShortcutTaskbarTarget.Queue, queueItem.SlotIndex,
                                                              queueItem.Type, queueItem.ObjectId, queueItem.ObjectType, queueItem.ObjectIndex, queueItem.UserId,
                                                              queueItem.ObjectData, queueItem.Text));
            }

            _database.SaveChanges();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Save the entity to the database.
        /// </summary>
        private void Save()
        {
            if (this.Player == null)
            {
                return;
            }

            var         database  = DependencyContainer.Instance.Resolve <IDatabase>();
            DbCharacter character = database.Characters.Get(this.Player.PlayerData.Id);

            if (character != null)
            {
                character.LastConnectionTime = this.LoggedInAt;
                character.PlayTime          += (long)(DateTime.UtcNow - this.LoggedInAt).TotalSeconds;

                character.PosX       = this.Player.Object.Position.X;
                character.PosY       = this.Player.Object.Position.Y;
                character.PosZ       = this.Player.Object.Position.Z;
                character.Angle      = this.Player.Object.Angle;
                character.MapId      = this.Player.Object.MapId;
                character.MapLayerId = this.Player.Object.LayerId;
                character.Gender     = this.Player.VisualAppearance.Gender;
                character.HairColor  = this.Player.VisualAppearance.HairColor;
                character.HairId     = this.Player.VisualAppearance.HairId;
                character.FaceId     = this.Player.VisualAppearance.FaceId;
                character.SkinSetId  = this.Player.VisualAppearance.SkinSetId;
                character.Level      = this.Player.Object.Level;

                character.Gold       = this.Player.PlayerData.Gold;
                character.Experience = this.Player.PlayerData.Experience;

                character.Strength     = this.Player.Attributes[DefineAttributes.STR];
                character.Stamina      = this.Player.Attributes[DefineAttributes.STA];
                character.Dexterity    = this.Player.Attributes[DefineAttributes.DEX];
                character.Intelligence = this.Player.Attributes[DefineAttributes.INT];
                character.StatPoints   = this.Player.Statistics.StatPoints;
                character.SkillPoints  = this.Player.Statistics.SkillPoints;

                character.Hp = this.Player.Health.Hp;
                character.Mp = this.Player.Health.Mp;
                character.Fp = this.Player.Health.Fp;

                // Delete items
                var itemsToDelete = new List <DbItem>(character.Items.Count);
                itemsToDelete.AddRange(from dbItem in character.Items
                                       let inventoryItem = this.Player.Inventory.GetItem(x => x.DbId == dbItem.Id) ??
                                                           new Game.Structures.Item()
                                                           where inventoryItem.Id == -1
                                                           select dbItem);
                itemsToDelete.ForEach(x => character.Items.Remove(x));

                // Add or update items
                foreach (var item in this.Player.Inventory.Items)
                {
                    if (item.Id == -1)
                    {
                        continue;
                    }

                    DbItem dbItem = character.Items.FirstOrDefault(x => x.Id == item.DbId);

                    if (dbItem != null)
                    {
                        dbItem.CharacterId   = this.Player.PlayerData.Id;
                        dbItem.ItemId        = item.Id;
                        dbItem.ItemCount     = item.Quantity;
                        dbItem.ItemSlot      = item.Slot;
                        dbItem.Refine        = item.Refine;
                        dbItem.Element       = item.Element;
                        dbItem.ElementRefine = item.ElementRefine;
                        database.Items.Update(dbItem);
                    }
                    else
                    {
                        dbItem = new DbItem
                        {
                            CharacterId   = this.Player.PlayerData.Id,
                            CreatorId     = item.CreatorId,
                            ItemId        = item.Id,
                            ItemCount     = item.Quantity,
                            ItemSlot      = item.Slot,
                            Refine        = item.Refine,
                            Element       = item.Element,
                            ElementRefine = item.ElementRefine
                        };

                        database.Items.Create(dbItem);
                    }
                }

                // Taskbar
                character.TaskbarShortcuts.Clear();

                foreach (var applet in Player.Taskbar.Applets.Shortcuts)
                {
                    if (applet == null)
                    {
                        continue;
                    }

                    var dbApplet = new DbShortcut(ShortcutTaskbarTarget.Applet, applet.SlotIndex, applet.Type,
                                                  applet.ObjId, applet.ObjectType, applet.ObjIndex, applet.UserId, applet.ObjData, applet.Text);

                    if (applet.Type == ShortcutType.Item)
                    {
                        var item = this.Player.Inventory.GetItem((int)applet.ObjId);
                        dbApplet.ObjectId = (uint)item.Slot;
                    }

                    character.TaskbarShortcuts.Add(dbApplet);
                }


                for (int slotLevel = 0; slotLevel < Player.Taskbar.Items.Shortcuts.Count; slotLevel++)
                {
                    for (int slot = 0; slot < Player.Taskbar.Items.Shortcuts[slotLevel].Count; slot++)
                    {
                        var itemShortcut = Player.Taskbar.Items.Shortcuts[slotLevel][slot];
                        if (itemShortcut == null)
                        {
                            continue;
                        }

                        var dbItem = new DbShortcut(ShortcutTaskbarTarget.Item, slotLevel, itemShortcut.SlotIndex,
                                                    itemShortcut.Type, itemShortcut.ObjId, itemShortcut.ObjectType, itemShortcut.ObjIndex,
                                                    itemShortcut.UserId, itemShortcut.ObjData, itemShortcut.Text);

                        if (itemShortcut.Type == ShortcutType.Item)
                        {
                            var item = this.Player.Inventory.GetItem((int)itemShortcut.ObjId);
                            dbItem.ObjectId = (uint)item.Slot;
                        }

                        character.TaskbarShortcuts.Add(dbItem);
                    }
                }

                foreach (var queueItem in Player.Taskbar.Queue.Shortcuts)
                {
                    if (queueItem == null)
                    {
                        continue;
                    }

                    character.TaskbarShortcuts.Add(new DbShortcut(ShortcutTaskbarTarget.Queue, queueItem.SlotIndex,
                                                                  queueItem.Type, queueItem.ObjId, queueItem.ObjectType, queueItem.ObjIndex, queueItem.UserId,
                                                                  queueItem.ObjData, queueItem.Text));
                }
            }

            database.Complete();
        }