Пример #1
0
        /// <summary>
        /// Uses an item from the player's inventory.
        /// </summary>
        /// <param name="player">Player using an item.</param>
        /// <param name="itemToUse">Item to use.</param>
        public void UseItem(IPlayerEntity player, Item itemToUse)
        {
            this._logger.LogTrace($"{player.Object.Name} want to use {itemToUse.Data.Name}.");

            if (player.Inventory.ItemHasCoolTime(itemToUse) && !player.Inventory.CanUseItemWithCoolTime(itemToUse))
            {
                this._logger.LogDebug($"Player '{player.Object.Name}' cannot use item {itemToUse.Data.Name}: CoolTime.");
                return;
            }

            switch (itemToUse.Data.ItemKind2)
            {
            case ItemKind2.REFRESHER:
            case ItemKind2.POTION:
            case ItemKind2.FOOD:
                this.UseFoodItem(player, itemToUse);
                break;

            case ItemKind2.BLINKWING:
                this.UseBlinkwingItem(player, itemToUse);
                break;

            default:
                this._logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                WorldPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                break;
            }
        }
Пример #2
0
        private void GetMailGold(IPlayerEntity player, QueryGetMailGoldEventArgs e)
        {
            var database = DependencyContainer.Instance.Resolve <IDatabase>();
            var mail     = database.Mails.Get(x => x.Id == e.MailId && x.ReceiverId == player.PlayerData.Id);

            if (mail is null)
            {
                return;
            }

            if (mail.HasReceivedGold)
            {
                return;
            }

            checked
            {
                try
                {
                    player.PlayerData.Gold += (int)mail.Gold;
                    mail.HasReceivedGold    = true;
                }
                catch (OverflowException)
                {
                    Logger.LogError($"{player.Object.Name} caused an OverflowException by taking {mail.Gold} out of mail {mail.Id}.");
                    return;
                }
            }
            database.Complete();
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.GOLD, player.PlayerData.Gold);
            WorldPacketFactory.SendRemoveMail(player, mail, RemovedFromMail.Gold);
        }
Пример #3
0
 /// <summary>
 /// Update monster moves.
 /// </summary>
 /// <param name="monster"></param>
 private void ProcessMonsterMovements(IMonsterEntity monster)
 {
     if (monster.Timers.NextMoveTime <= Time.TimeInSeconds() &&
         monster.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_STAND))
     {
         this.MoveToPosition(monster, monster.Region.GetRandomPosition());
     }
     else if (monster.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_STAND))
     {
         if (monster.Moves.ReturningToOriginalPosition)
         {
             monster.Health.Hp = monster.Data.AddHp;
             WorldPacketFactory.SendUpdateAttributes(monster, DefineAttributes.HP, monster.Health.Hp);
             monster.Moves.ReturningToOriginalPosition = false;
         }
         else
         {
             if (monster.Moves.SpeedFactor >= 2f)
             {
                 monster.Moves.SpeedFactor = 1f;
                 WorldPacketFactory.SendSpeedFactor(monster, monster.Moves.SpeedFactor);
             }
         }
     }
 }
Пример #4
0
        public static void CreateItem(IPlayerEntity player, string[] parameters)
        {
            Logger.Debug("{0} want to create an item", player.Object.Name);

            if (parameters.Length <= 0)
            {
                Logger.Error("Chat: /createitem command must have at least one parameter.");
                return;
            }

            if (!player.Inventory.HasAvailableSlots())
            {
                WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE);
                return;
            }

            var quantity = 1;

            if (!int.TryParse(parameters[0], out int itemId))
            {
                ItemData itemData = GameResources.Instance.Items[parameters[0]];

                itemId = itemData?.Id ?? -1;
            }

            if (parameters.Length >= 2)
            {
                int.TryParse(parameters[1], out quantity);
            }

            var createItemEvent = new InventoryCreateItemEventArgs(itemId, quantity, player.PlayerData.Id);

            player.NotifySystem <InventorySystem>(createItemEvent);
        }
Пример #5
0
        private void GetMailItem(IPlayerEntity player, QueryGetMailItemEventArgs e)
        {
            var database = DependencyContainer.Instance.Resolve <IDatabase>();
            var mail     = database.Mails.Get(x => x.Id == e.MailId && x.ReceiverId == player.PlayerData.Id);

            if (mail is null)
            {
                return;
            }

            if (mail.HasReceivedItem)
            {
                return;
            }

            if (!player.Inventory.HasAvailableSlots())
            {
                WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE);
                return;
            }

            mail.HasReceivedItem = true;
            int availableSlot = player.Inventory.GetAvailableSlot();

            player.Inventory.Items[availableSlot] = new Item(mail.Item);
            database.Complete();
            WorldPacketFactory.SendRemoveMail(player, mail, RemovedFromMail.Item);
        }
Пример #6
0
        private void EquipItem(IPlayerEntity player, Item item)
        {
            this.Logger.LogTrace($"{player.Object.Name} want to equip {item.Data.Name}.");

            if (!this._itemUsage.IsItemEquipable(player, item))
            {
                this.Logger.LogTrace($"{player.Object.Name} can not equip {item.Data.Name}.");
                return;
            }

            int  sourceSlot      = item.Slot;
            int  equipedItemSlot = item.Data.Parts + EquipOffset;
            Item equipedItem     = player.Inventory[equipedItemSlot];

            if (equipedItem != null && equipedItem.Slot != -1)
            {
                this.UnequipItem(player, equipedItem);
            }

            // Move item
            item.Slot = equipedItemSlot;
            player.Inventory.Items.Swap(sourceSlot, equipedItemSlot);

            WorldPacketFactory.SendItemEquip(player, item, item.Data.Parts, true);
        }
Пример #7
0
        public static void OnPlayerBehavior(WorldClient client, INetPacketStream packet)
        {
            var playerBehaviorPacket = new PlayerBehaviorPacket(packet);

            if (client.Player.Health.IsDead)
            {
                Logger.LogError($"Player {client.Player.Object.Name} is dead, he cannot move with keyboard.");
                return;
            }

            // TODO: check if player is flying

            client.Player.Object.Position            = playerBehaviorPacket.BeginPosition + playerBehaviorPacket.DestinationPosition;
            client.Player.Object.Angle               = playerBehaviorPacket.Angle;
            client.Player.Object.MovingFlags         = (ObjectState)playerBehaviorPacket.State;
            client.Player.Object.MotionFlags         = (StateFlags)playerBehaviorPacket.StateFlag;
            client.Player.Moves.IsMovingWithKeyboard = client.Player.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_FMOVE) ||
                                                       client.Player.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_BMOVE);
            client.Player.Moves.DestinationPosition = playerBehaviorPacket.BeginPosition + playerBehaviorPacket.DestinationPosition;

            WorldPacketFactory.SendMoverBehavior(client.Player,
                                                 playerBehaviorPacket.BeginPosition,
                                                 playerBehaviorPacket.DestinationPosition,
                                                 client.Player.Object.Angle,
                                                 (uint)client.Player.Object.MovingFlags,
                                                 (uint)client.Player.Object.MotionFlags,
                                                 playerBehaviorPacket.Motion,
                                                 playerBehaviorPacket.MotionEx,
                                                 playerBehaviorPacket.Loop,
                                                 playerBehaviorPacket.MotionOption,
                                                 playerBehaviorPacket.TickCount);
        }
Пример #8
0
        private static void TradeConfirm(IPlayerEntity player, TradeConfirmEventArgs e)
        {
            Logger.Debug("Trade confirm");

            if (IsNotTrading(player))
            {
                throw new RhisisSystemException($"No trade target {player.Object.Name}");
            }

            var target = GetEntityFromContextOf(player, player.Trade.TargetId);

            if (IsNotTrading(target))
            {
                CancelTrade(player);
                throw new RhisisSystemException($"Target is not trading {target.Object.Name}");
            }

            if (IsNotTradeState(player, TradeComponent.TradeState.Ok))
            {
                return;
            }

            if (IsTradeState(target, TradeComponent.TradeState.Ok))
            {
                player.Trade.State = TradeComponent.TradeState.Confirm;

                WorldPacketFactory.SendTradeLastConfirmOk(player, player.Id);
                WorldPacketFactory.SendTradeLastConfirmOk(target, player.Id);
            }
            else if (IsTradeState(target, TradeComponent.TradeState.Confirm))
            {
                FinalizeTrade(player, target);
            }
        }
Пример #9
0
        public void Dispatch(ISession session, IPacket packet)
        {
            BinaryReader reader  = packet.CreateReader();
            int          guildId = reader.ReadInt32();
            var          guild   = new Guild
            {
                Id   = guildId,
                Name = "guild"
            };

            IPacketBuilder responce = WorldPacketFactory.Build(
                WMSG.SMSG_GUILD_QUERY_RESPONSE,
                writer =>
            {
                writer.Write(guild.Id);
                writer.WriteCString(guild.Name);
                foreach (GuildRank rank in guild.Ranks)
                {
                    writer.WriteCString(rank.Name);
                }
                for (int i = 0; i < 10 - guild.Ranks.Count; i++)
                {
                    writer.WriteCString(string.Empty);
                }
                writer.Write(guild.Tabard.EmblemStyle);
                writer.Write(guild.Tabard.EmblemColor);
                writer.Write(guild.Tabard.BorderStyle);
                writer.Write(guild.Tabard.BorderColor);
                writer.Write(guild.Tabard.BackgroundColor);
                writer.Write(0);         // NEW 3.0.2
            });

            session.Send(responce);
        }
Пример #10
0
        /// <summary>
        /// Start a new trade / accepting the trade
        /// </summary>
        /// <param name="player"></param>
        /// <param name="e"></param>
        private static void Trade(IPlayerEntity player, TradeBeginEventArgs e)
        {
            if (e.TargetId == player.Id)
            {
                throw new RhisisSystemException($"Can't start a Trade with ourselve ({player.Object.Name})");
            }

            if (IsTrading(player))
            {
                throw new RhisisSystemException($"Can't start a Trade when one is already in progress ({player.Object.Name})");
            }

            var target = GetEntityFromContextOf(player, e.TargetId);

            if (IsTrading(target))
            {
                throw new RhisisSystemException($"Can't start a Trade when one is already in progress ({target.Object.Name})");
            }

            player.Trade.TargetId = target.Id;
            target.Trade.TargetId = player.Id;

            WorldPacketFactory.SendTrade(player, target, player.Id);
            WorldPacketFactory.SendTrade(target, player, player.Id);
        }
Пример #11
0
        /// <summary>
        /// Put gold to the current trade
        /// </summary>
        /// <param name="player"></param>
        /// <param name="e"></param>
        private static void PutGold(IPlayerEntity player, TradePutGoldEventArgs e)
        {
            Logger.Debug("PutGold");

            if (IsNotTrading(player))
            {
                throw new RhisisSystemException($"No trade target {player.Object.Name}");
            }

            var target = GetEntityFromContextOf(player, player.Trade.TargetId);

            if (IsNotTrading(target))
            {
                CancelTrade(player);
                throw new RhisisSystemException($"Target is not trading {target.Object.Name}");
            }

            if (IsNotTradeState(player, TradeComponent.TradeState.Item) ||
                IsNotTradeState(target, TradeComponent.TradeState.Item))
            {
                throw new RhisisSystemException($"Not the right trade state {player.Object.Name}");
            }

            player.PlayerData.Gold -= e.Gold;
            player.Trade.Gold      += e.Gold;

            WorldPacketFactory.SendTradePutGold(player, player.Id, player.Trade.Gold);
            WorldPacketFactory.SendTradePutGold(target, player.Id, player.Trade.Gold);
        }
Пример #12
0
        /// <summary>
        /// Applies death penality if enabled.
        /// </summary>
        /// <param name="player">Death player entity.</param>
        private void ProcessDeathPenality(IPlayerEntity player)
        {
            if (this._worldConfiguration.Death.DeathPenalityEnabled)
            {
                decimal expLossPercent = GameResources.Instance.Penalities.GetDecExpPenality(player.Object.Level);

                if (expLossPercent <= 0)
                {
                    return;
                }

                player.PlayerData.Experience -= player.PlayerData.Experience * (long)(expLossPercent / 100m);
                player.PlayerData.DeathLevel  = player.Object.Level;

                if (player.PlayerData.Experience < 0)
                {
                    if (GameResources.Instance.Penalities.GetLevelDownPenality(player.Object.Level))
                    {
                        CharacterExpTableData previousLevelExp = GameResources.Instance.ExpTables.GetCharacterExp(player.Object.Level - 1);

                        player.Object.Level--;
                        player.PlayerData.Experience = previousLevelExp.Exp + player.PlayerData.Experience;
                    }
                    else
                    {
                        player.PlayerData.Experience = 0;
                    }
                }

                WorldPacketFactory.SendPlayerExperience(player);
            }
        }
Пример #13
0
        public static void OnMeleeAttack(WorldClient client, INetPacketStream packet)
        {
            var meleePacket = new MeleeAttackPacket(packet);
            var target      = client.Player.Object.CurrentLayer.FindEntity <IMonsterEntity>(meleePacket.ObjectId);

            if (target == null)
            {
                Logger.LogError($"Cannot find target with object id {meleePacket.ObjectId}");
                return;
            }

            Item weaponItem = client.Player.Inventory.GetItem(x => x.Slot == InventorySystem.RightWeaponSlot) ?? InventorySystem.Hand;

            if (weaponItem != null && weaponItem.Data?.AttackSpeed != meleePacket.WeaponAttackSpeed)
            {
                Logger.LogCritical($"Player {client.Player.Object.Name} has changed his weapon speed.");
                return;
            }

            if (!target.Follow.IsFollowing && target.Type == WorldEntityType.Monster)
            {
                if (target.Moves.SpeedFactor != 2f)
                {
                    target.Moves.SpeedFactor = 2f;
                    WorldPacketFactory.SendSpeedFactor(target, target.Moves.SpeedFactor);
                }

                target.NotifySystem <FollowSystem>(new FollowEventArgs(client.Player.Id, 1f));
            }

            client.Player.NotifySystem <BattleSystem>(new MeleeAttackEventArgs(meleePacket.AttackMessage, target, meleePacket.WeaponAttackSpeed));
        }
Пример #14
0
        /// <summary>
        /// Sells an item to a NPC shop.
        /// </summary>
        /// <param name="player">Player entity</param>
        /// <param name="e"></param>
        private void SellItem(IPlayerEntity player, NpcShopSellEventArgs e)
        {
            Item itemToSell = player.Inventory.GetItem(e.ItemUniqueId);

            if (itemToSell?.Data == null)
            {
                throw new InvalidOperationException($"ShopSystem: Cannot find item with unique id: {e.ItemUniqueId}");
            }

            if (e.Quantity > itemToSell.Data.PackMax)
            {
                throw new InvalidOperationException($"ShopSystem: Cannot sell more items than the pack max value. {e.Quantity} > {itemToSell.Data.PackMax}");
            }

            // TODO: make more checks:
            // is a quest item
            // is sealed to character
            // ect...

            int sellPrice = itemToSell.Data.Cost / 4;

            Logger.Debug("Selling item: '{0}' for {1}", itemToSell.Data.Name, sellPrice);

            player.PlayerData.Gold += sellPrice * e.Quantity;
            itemToSell.Quantity    -= e.Quantity;

            WorldPacketFactory.SendItemUpdate(player, UpdateItemType.UI_NUM, itemToSell.UniqueId, itemToSell.Quantity);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.GOLD, player.PlayerData.Gold);

            if (itemToSell.Quantity <= 0)
            {
                itemToSell.Reset();
            }
        }
Пример #15
0
        private void OnChangeFace(IPlayerEntity player, ChangeFaceEventArgs e)
        {
            var worldConfiguration = DependencyContainer.Instance.Resolve <WorldConfiguration>();

            if (!e.UseCoupon)
            {
                if (player.PlayerData.Gold < worldConfiguration.Customization.ChangeFaceCost)
                {
                    WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKMONEY);
                }
                else
                {
                    player.PlayerData.Gold        -= (int)worldConfiguration.Customization.ChangeFaceCost;
                    player.VisualAppearance.FaceId = (int)e.FaceId;

                    WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.GOLD, player.PlayerData.Gold);
                    WorldPacketFactory.SendChangeFace(player, e.FaceId);
                }
            }
            else
            {
                var couponItem = player.Inventory.GetItemById(DefineItem.II_SYS_SYS_SCR_FACEOFFFREE);
                if (couponItem == null)
                {
                    WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_WARNNING_COUPON);
                    return;
                }

                player.Inventory.RemoveItems(couponItem.Data.Id);
                WorldPacketFactory.SendItemUpdate(player, UpdateItemType.UI_NUM, couponItem.UniqueId, couponItem.Quantity);
                WorldPacketFactory.SendChangeFace(player, e.FaceId);
            }
        }
Пример #16
0
        /// <summary>
        /// Create a new item.
        /// </summary>
        /// <param name="player">Player entity</param>
        /// <param name="e"></param>
        private void CreateItem(IPlayerEntity player, InventoryCreateItemEventArgs e)
        {
            ItemData itemData = e.ItemData;

            if (itemData.IsStackable)
            {
                // TODO: stackable items
            }
            else
            {
                for (var i = 0; i < e.Quantity; i++)
                {
                    int availableSlot = player.Inventory.GetAvailableSlot();

                    if (availableSlot < 0)
                    {
                        WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE);
                        break;
                    }

                    Logger.Debug("Available slot: {0}", availableSlot);

                    var newItem = new Item(e.ItemId, 1, e.CreatorId)
                    {
                        Slot     = availableSlot,
                        UniqueId = availableSlot,
                    };

                    player.Inventory.Items[availableSlot] = newItem;
                    WorldPacketFactory.SendItemCreation(player, newItem);
                }
            }
        }
Пример #17
0
        private void OnPartyMemberRequest(IPlayerEntity player, PartyMemberRequestEventArgs e)
        {
            var worldServer = DependencyContainer.Instance.Resolve <IWorldServer>();

            if (player.PlayerData.Id != e.PlayerId)
            {
                return;
            }

            var member = worldServer.GetPlayerEntityByCharacterId(e.MemberId);

            if (member == null)
            {
                WorldPacketFactory.SendAddPartyRequestCancel(player, e.MemberId, PartyRequestCancelMode.OtherServer);
                return;
            }

            // TODO: Check if in GW, Duel or other stuff that might disturb the player.

            if (member.Party.IsInParty)
            {
                WorldPacketFactory.SendAddPartyRequestCancel(player, e.MemberId, PartyRequestCancelMode.OtherParty);
                return;
            }

            // Send Request to other player
            WorldPacketFactory.SendAddPartyRequest(player, member, e.Troup);
        }
Пример #18
0
        public void Dispatch(ISession session, IPacket packet)
        {
            BinaryReader reader    = packet.CreateReader();
            byte         castCount = reader.ReadByte();
            uint         spellId   = reader.ReadUInt32();
            byte         unklags   = reader.ReadByte();


            IPacket      pkt    = WorldPacketFactory.Create(WMSG.SMSG_SPELL_START);
            BinaryWriter writer = pkt.CreateWriter();

            writer.WritePackGuid(session.Player.Guid);
            writer.WritePackGuid(session.Player.Guid);
            writer.Write(castCount);
            writer.Write(spellId);
            writer.Write(0);             //cast flags
            writer.Write(0);             //ticks count
            writer.Write(0);             //targetflags
            session.Send(pkt);

            Thread.Sleep(5000);
            pkt    = WorldPacketFactory.Create(WMSG.SMSG_SPELL_GO);
            writer = pkt.CreateWriter();
            writer.WritePackGuid(session.Player.Guid);
            writer.WritePackGuid(session.Player.Guid);
            writer.Write(castCount);
            writer.Write(spellId);
            writer.Write(0);             //cast flags
            writer.Write(0);             //ticks count
            writer.Write((byte)1);       //hit count
            writer.Write(session.Player.Guid);
            writer.Write((byte)0);       //miss count
            writer.Write(0);             // targetflags
            session.Send(pkt);
        }
Пример #19
0
        /// <summary>
        /// Equips an item.
        /// </summary>
        /// <param name="player"></param>
        /// <param name="e"></param>
        private void EquipItem(IPlayerEntity player, InventoryEquipEventArgs e)
        {
            var uniqueId = e.UniqueId;
            var part     = e.Part;

            Logger.Debug("UniqueId: {0} | Part: {1}", uniqueId, part);

            Item item = player.Inventory.GetItem(uniqueId);

            if (item == null)
            {
                return;
            }

            bool equip = part == -1;

            Logger.Debug("Equip item: {0}", equip.ToString());

            if (equip)
            {
                Logger.Debug("Item: {0}", item.ToString());

                // TODO: check if the player fits the item requirements
                if (item.Data.ItemKind1 == ItemKind1.ARMOR && item.Data.ItemSex != player.VisualAppearance.Gender)
                {
                    Logger.Debug("Wrong sex for armor");
                    // TODO: Send invalid sex error
                    return;
                }

                if (player.Object.Level < item.Data.LimitLevel)
                {
                    Logger.Debug("Player level to low");
                    // TODO: Send low level error
                    return;
                }

                // TODO: SPECIAL: double weapon for blades...

                int  sourceSlot      = item.Slot;
                int  equipedItemSlot = item.Data.Parts + EquipOffset;
                Item equipedItem     = player.Inventory[equipedItemSlot];

                if (equipedItem != null && equipedItem.Slot != -1)
                {
                    this.UnequipItem(player, equipedItem);
                }

                // Move item
                item.Slot = equipedItemSlot;
                player.Inventory.Items.Swap(sourceSlot, equipedItemSlot);

                WorldPacketFactory.SendItemEquip(player, item, item.Data.Parts, true);
            }
            else
            {
                this.UnequipItem(player, item);
            }
        }
Пример #20
0
        /// <summary>
        /// Moves the monster to a position.
        /// </summary>
        /// <param name="monster"></param>
        /// <param name="destPosition"></param>
        private void MoveToPosition(IMonsterEntity monster, Vector3 destPosition)
        {
            monster.Timers.NextMoveTime = Time.TimeInSeconds() + RandomHelper.LongRandom(8, 20);
            monster.MovableComponent.DestinationPosition = destPosition.Clone();
            monster.Object.Angle = Vector3.AngleBetween(monster.Object.Position, destPosition);

            WorldPacketFactory.SendDestinationPosition(monster);
        }
Пример #21
0
        /// <summary>
        /// Moves the monster to a position.
        /// </summary>
        /// <param name="monster"></param>
        /// <param name="destPosition"></param>
        private void MoveToPosition(IMonsterEntity monster, Vector3 destPosition)
        {
            monster.Object.Angle              = Vector3.AngleBetween(monster.Object.Position, destPosition);
            monster.Object.MovingFlags        = ObjectState.OBJSTA_FMOVE;
            monster.Moves.DestinationPosition = destPosition.Clone();

            WorldPacketFactory.SendDestinationPosition(monster);
            WorldPacketFactory.SendDestinationAngle(monster, false);
        }
Пример #22
0
        public static void OnSelectCharacter(WorldClient client, IPacketStream packet)
        {
            var selectCharacterPacket = new SelectCharacterPacket(packet);

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            var character = database.Charaters.Include(c => c.Items).Where(c => c.Id == selectCharacterPacket.CharacterId).FirstOrDefault();

            WorldPacketFactory.SendSelectedCharacter(client, character);
        }
Пример #23
0
        public static void OnCheckAvailableName(WorldClient client, IPacketStream packet)
        {
            var checkNamePacket = new CheckCharacterAvailableNamePacket(packet);

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            DbCharacter character = database.Charaters.Get(c => c.Name == checkNamePacket.CharacterName);

            WorldPacketFactory.SendCharacterAvailability(client, character is null);
        }
Пример #24
0
        private static IPacket GetUpdateAccountDataCompletePkt(AccountDataType type)
        {
            IPacket      packet = WorldPacketFactory.Create(WMSG.SMSG_UPDATE_ACCOUNT_DATA_COMPLETE);
            BinaryWriter writer = packet.CreateWriter();

            writer.Write((uint)type);
            writer.Write(0);
            return(packet);
        }
Пример #25
0
        private IPacket GetPowerUpdatePkt(uint value)
        {
            IPacket      packet = WorldPacketFactory.Create(WMSG.SMSG_POWER_UPDATE);
            BinaryWriter writer = packet.CreateWriter();

            writer.WritePackGuid(Guid);
            writer.Write((byte)PowerType);
            writer.Write(value);
            return(packet);
        }
Пример #26
0
        private void GetMails(IPlayerEntity player, QueryMailboxEventArgs e)
        {
            var database = DependencyContainer.Instance.Resolve <IDatabase>();
            var receiver = database.Characters.Get(x => x.Id == player.PlayerData.Id);

            if (receiver != null)
            {
                WorldPacketFactory.SendMailbox(player, receiver.ReceivedMails.Where(x => !x.IsDeleted).ToList());
            }
        }
Пример #27
0
        public static void OnSnapshotSetDestPosition(WorldClient client, INetPacketStream packet)
        {
            var setDestPositionPacket = new SetDestPositionPacket(packet);

            client.Player.MovableComponent.DestinationPosition = new Vector3(setDestPositionPacket.X, setDestPositionPacket.Y, setDestPositionPacket.Z);
            client.Player.Object.Angle  = Vector3.AngleBetween(client.Player.Object.Position, client.Player.MovableComponent.DestinationPosition);
            client.Player.Follow.Target = null;

            WorldPacketFactory.SendDestinationPosition(client.Player);
        }
Пример #28
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!(entity is IPlayerEntity player))
            {
                this._logger.LogError($"Cannot execute DeathSystem. {entity.Object.Name} is not a player.");
                return;
            }

            IMapRevivalRegion revivalRegion = player.Object.CurrentMap.GetNearRevivalRegion(player.Object.Position);

            if (revivalRegion == null)
            {
                this._logger.LogError($"Cannot find any revival region for map '{player.Object.CurrentMap.Name}'.");
                return;
            }

            decimal recoveryRate = GameResources.Instance.Penalities.GetRevivalPenality(player.Object.Level) / 100;
            var     jobData      = player.PlayerData.JobData;

            int strength     = player.Attributes[DefineAttributes.STR];
            int stamina      = player.Attributes[DefineAttributes.STA];
            int dexterity    = player.Attributes[DefineAttributes.DEX];
            int intelligence = player.Attributes[DefineAttributes.INT];

            player.Health.Hp = (int)(HealthFormulas.GetMaxOriginHp(player.Object.Level, stamina, jobData.MaxHpFactor) * recoveryRate);
            player.Health.Mp = (int)(HealthFormulas.GetMaxOriginMp(player.Object.Level, intelligence, jobData.MaxMpFactor, true) * recoveryRate);
            player.Health.Fp = (int)(HealthFormulas.GetMaxOriginFp(player.Object.Level, stamina, dexterity, strength, jobData.MaxFpFactor, true) * recoveryRate);

            if (player.Object.MapId != revivalRegion.MapId)
            {
                IMapInstance revivalMap = this._mapLoader.GetMapById(revivalRegion.MapId);

                if (revivalMap == null)
                {
                    this._logger.LogError($"Cannot find revival map with id '{revivalRegion.MapId}'.");
                    player.Connection.Server.DisconnectClient(player.Connection.Id);
                    return;
                }

                revivalRegion = revivalMap.GetRevivalRegion(revivalRegion.Key);
            }

            var teleportEvent = new TeleportEventArgs(revivalRegion.MapId, revivalRegion.RevivalPosition.X, revivalRegion.RevivalPosition.Z);

            player.NotifySystem <TeleportSystem>(teleportEvent);

            WorldPacketFactory.SendMotion(player, ObjectMessageType.OBJMSG_ACC_STOP | ObjectMessageType.OBJMSG_STOP_TURN | ObjectMessageType.OBJMSG_STAND);
            WorldPacketFactory.SendPlayerRevival(player);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Health.Hp);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Health.Mp);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Health.Fp);

            this.ProcessDeathPenality(player);
        }
Пример #29
0
        /// <summary>
        /// Despawns the other entity for the current entity.
        /// </summary>
        /// <param name="entity">Current entity</param>
        /// <param name="otherEntity">other entity</param>
        private static void DespawnOtherEntity(IEntity entity, IEntity otherEntity)
        {
            var player = entity as IPlayerEntity;

            WorldPacketFactory.SendDespawnObjectTo(player, otherEntity);
            entity.Object.Entities.Remove(otherEntity);

            if (otherEntity.Type != WorldEntityType.Player && otherEntity.Object.Entities.Contains(entity))
            {
                otherEntity.Object.Entities.Remove(entity);
            }
        }
Пример #30
0
        public IPacket GetCharEnumPkt()
        {
            IPacket      p = WorldPacketFactory.Create(WMSG.SMSG_CHAR_ENUM);
            BinaryWriter w = p.CreateWriter();

            w.Write((byte)players.Count);
            foreach (Player player in players)
            {
                w.Write(player.Guid);
                w.WriteCString(player.Name);
                w.Write((byte)player.Race);
                w.Write((byte)player.Classe);
                w.Write((byte)player.Gender);
                w.Write(player.Skin);
                w.Write(player.Face);
                w.Write(player.HairStyle);
                w.Write(player.HairColor);
                w.Write(player.FacialHair);
                w.Write((byte)player.Level);

                w.Write(player.ZoneId);
                w.Write(player.MapId);
                w.Write(player.PosX);
                w.Write(player.PosY);
                w.Write(player.PosZ);
                w.Write(player.GuildMember.With(x => x.Guild.Id));

                uint flag = 0x00000000;
                w.Write(flag);
                w.Write((byte)0);
                w.Write(player.PetDisplayId);
                w.Write(player.PetLevel);
                w.Write(player.PetCreatureFamily);
                w.Write(0);
                for (int i = 0; i < 23; i++)
                {
                    Item item = player.Inventory[i];
                    if (item != null)
                    {
                        w.Write(item.Template.DisplayId);
                        w.Write((byte)item.Template.InventoryType);
                        w.Write(0);
                    }
                    else
                    {
                        w.Write(0);
                        w.Write((byte)0);
                        w.Write(0);
                    }
                }
            }
            return(p);
        }