Esempio n. 1
0
        public void TargetKilled(Player player, Player target, Room room)
        {
            player.Target = String.Empty;
            player.Status = CharacterStatus.Status.Standing;
            target.Status = CharacterStatus.Status.Ghost;
            target.Target = string.Empty;

            DeathCry(room, target);

            _gain.GainExperiencePoints(player, target);

            _quest.IsQuestMob(player, target.Name);

            if (target.ConnectionId != "mob")
            {
                Helpers.PostToDiscord($"{target.Name} got killed by {player.Name}!", "event", _cache.GetConfig());

                if (player.ConnectionId != "mob")
                {
                    target.PlayerDeaths += 1;
                    player.PlayerKills  += 1;
                }
                else
                {
                    target.MobDeaths += 1;
                }
            }

            _writer.WriteLine("<p class='dead'>You are dead. R.I.P.</p>", target.ConnectionId);


            var targetName = target.Name.ToLower(CultureInfo.CurrentCulture);
            var corpse     = new Item.Item()
            {
                Name        = $"The corpse of {targetName}",
                Description = new Description()
                {
                    Room = $"The corpse of {targetName} is laying here.",
                    Exam = target.Description,
                    Look = target.Description,
                },
                Slot      = Equipment.EqSlot.Held,
                Level     = 1,
                Stuck     = true,
                Container = new Container()
                {
                    Items   = new ItemList(),
                    CanLock = false,
                    IsOpen  = true,
                    CanOpen = false,
                },
                ItemType   = Item.Item.ItemTypes.Container,
                Decay      = target.ConnectionId.Equals("mob", StringComparison.OrdinalIgnoreCase) ? 10 : 20,
                DecayTimer = 300 // 5 minutes,
            };

            foreach (var item in target.Inventory)
            {
                item.Equipped = false;
                corpse.Container.Items.Add(item);
            }

            if (target.ConnectionId.Equals("mob", StringComparison.CurrentCultureIgnoreCase))
            {
                player.MobKills += 1;

                var randomItem = _randomItem.WeaponDrop(player);

                if (randomItem != null)
                {
                    corpse.Container.Items.Add(randomItem);
                }
            }

            // clear list
            target.Inventory = new ItemList();
            // clear equipped
            target.Equipped = new Equipment();

            var mount = target.Pets.FirstOrDefault(x => x.Name.Equals(target.Mounted.Name));

            if (mount != null)
            {
                target.Pets.Remove(mount);
                target.Mounted.Name = string.Empty;
            }

            // add corpse to room
            room.Items.Add(corpse);
            _clientUi.UpdateInventory(target);
            _clientUi.UpdateEquipment(target);
            _clientUi.UpdateScore(target);
            _clientUi.UpdateScore(player);

            room.Clean = false;

            _cache.RemoveCharFromCombat(target.Id.ToString());
            _cache.RemoveCharFromCombat(player.Id.ToString());

            if (target.ConnectionId.Equals("mob", StringComparison.CurrentCultureIgnoreCase))
            {
                room.Mobs.Remove(target);
                var getTodayMobStats = _pdb.GetList <MobStats>(PlayerDataBase.Collections.MobStats).FirstOrDefault(x => x.Date.Date.Equals(DateTime.Today));

                if (getTodayMobStats != null)
                {
                    getTodayMobStats.MobKills += 1;
                }
                else
                {
                    getTodayMobStats = new MobStats()
                    {
                        MobKills     = 1,
                        PlayerDeaths = 0,
                        Date         = DateTime.Now,
                    };
                }
                _pdb.Save <MobStats>(getTodayMobStats, PlayerDataBase.Collections.MobStats);
            }
            else
            {
                room.Players.Remove(target);
                var getTodayMobStats = _pdb.GetList <MobStats>(PlayerDataBase.Collections.MobStats).FirstOrDefault(x => x.Date.Date.Equals(DateTime.Today));

                if (getTodayMobStats != null)
                {
                    getTodayMobStats.PlayerDeaths += 1;
                }
                else
                {
                    getTodayMobStats = new MobStats()
                    {
                        MobKills     = 0,
                        PlayerDeaths = 1,
                        Date         = DateTime.Now,
                    };
                }
                _pdb.Save <MobStats>(getTodayMobStats, PlayerDataBase.Collections.MobStats);
            }
            // take player to Temple / recall area

            if (target.ConnectionId != "mob")
            {
                target.Status = CharacterStatus.Status.Resting;
                var newRoom = _cache.GetRoom(target.RecallId);

                target.Buffer = new Queue <string>();

                target.RoomId = Helpers.ReturnRoomId(newRoom);

                newRoom.Players.Add(target);
                target.Buffer.Enqueue("look");
            }
        }