/// <summary>
        /// psl packet
        /// </summary>
        /// <param name="pslPacket"></param>
        public void Psl(PslPacket pslPacket)
        {
            Mate mate = Session.Character.Mates.FirstOrDefault(x => x.IsTeamMember && x.MateType == MateType.Partner);

            if (mate == null)
            {
                return;
            }
            if (pslPacket.Type == 0)
            {
                if (mate.IsUsingSp)
                {
                    mate.IsUsingSp = false;
                    mate.SpSkills  = null;
                    Session.Character.MapInstance.Broadcast(mate.GenerateCMode(-1));
                    Session.SendPacket(mate.GenerateCond());
                    Session.SendPacket(mate.GeneratePski());
                    Session.SendPacket(mate.GenerateScPacket());
                    Session.Character.MapInstance.Broadcast(mate.GenerateOut());
                    Session.Character.MapInstance.Broadcast(mate.GenerateIn());
                    Session.SendPacket(Session.Character.GeneratePinit());
                    //psd 30
                }
                else
                {
                    Session.SendPacket("delay 5000 3 #psl^1 ");
                    Session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY);
                }
            }
            else
            {
                if (mate.SpInstance == null)
                {
                    return;
                }
                mate.IsUsingSp = true;
                //TODO: update pet skills
                mate.SpSkills = new NpcMonsterSkill[3];
                Session.SendPacket(mate.GenerateCond());
                Session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph));
                Session.SendPacket(mate.GeneratePski());
                Session.SendPacket(mate.GenerateScPacket());
                Session.Character.MapInstance.Broadcast(mate.GenerateOut());
                Session.Character.MapInstance.Broadcast(mate.GenerateIn());
                Session.SendPacket(Session.Character.GeneratePinit());
                Session.Character.MapInstance.Broadcast(mate.GenerateEff(196));
            }
        }
        private void ExecuteHandler(ClientSession session)
        {
            Mate mate = session.Character.Mates.Find(x => x.IsTeamMember && x.MateType == MateType.Partner);

            if (mate == null)
            {
                return;
            }

            if (Type == 0)
            {
                if (mate.SpInstance == null)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0));
                    return;
                }

                var currentRunningSeconds  = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds;
                var timeSpanSinceLastUsage = currentRunningSeconds - mate.LastSp;

                if (timeSpanSinceLastUsage < mate.SpCooldown)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PARTNER_SP_IN_COOLDOWN"), mate.SpCooldown - (int)Math.Round(timeSpanSinceLastUsage, 0)), 0));
                    return;
                }

                if (mate.IsUsingSp)
                {
                    mate.RemoveSp();
                }
                else
                {
                    session.SendPacket("pdelay 5000 3 #psl^1 ");
                    session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY);
                }
            }
            else
            {
                if (mate.SpInstance == null)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0));
                    return;
                }

                mate.IsUsingSp = true;
                session.SendPacket(mate.GenerateCond());
                session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph));
                session.SendPacket(mate.GenerateScPacket());
                session.Character.MapInstance.Broadcast(mate.GenerateOut());
                session.Character.MapInstance.Broadcast(mate.GenerateIn());
                session.SendPacket(session.Character.GeneratePinit());
                session.Character.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 196));
                session.SendPacket(mate.GeneratePski());
                MateHelper.Instance.AddPartnerBuffs(session, mate);
            }
        }
예제 #3
0
        private void ExecuteHandler(ClientSession session)
        {
            Mate partnerInTeam = session.Character.Mates.FirstOrDefault(s => s.IsTeamMember && s.MateType == MateType.Partner);

            if (partnerInTeam == null || PetId != partnerInTeam.PartnerSlot)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_NOT_IN_TEAM"), 1));
                return;
            }

            if (partnerInTeam.SpInstance == null)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_DOESNT_WEAR_SP"), 1));
                return;
            }

            if (partnerInTeam.SpInstance.FirstPartnerSkill > 0 && SkillSlot == 0 ||
                partnerInTeam.SpInstance.SecondPartnerSkill > 0 && SkillSlot == 1 ||
                partnerInTeam.SpInstance.ThirdPartnerSkill > 0 && SkillSlot == 2)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_ALREADY_HAS_SKILL"), 1));
                return;
            }

            if (partnerInTeam.IsUsingSp)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("MUST_REMOVE_PARTNER_SP"), 1));
                return;
            }

            if (partnerInTeam.SpInstance.Agility < 100 && session.Account.Authority < AuthorityType.GameMaster)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("NOT_ENOUGH_AGILITY"), 1));
                return;
            }

            var skillList = ServerManager.Instance.PartnerSkills.FirstOrDefault(s => s.PartnerVnum == partnerInTeam.SpInstance.ItemVNum);

            if (skillList == null)
            {
                return;
            }

            switch (Option)
            {
            case 0:
                session.SendPacket($"pdelay 3000 12 #ps_op^{PetId}^{SkillSlot}^1");
                session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, partnerInTeam.MateTransportId), partnerInTeam.PositionX, partnerInTeam.PositionY);
                break;

            default:

                switch (SkillSlot)
                {
                case 0:
                    partnerInTeam.SpInstance.FirstPartnerSkill     = skillList.FirstSkill;
                    partnerInTeam.SpInstance.FirstPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8);
                    break;

                case 1:
                    partnerInTeam.SpInstance.SecondPartnerSkill     = skillList.SecondSkill;
                    partnerInTeam.SpInstance.SecondPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8);
                    break;

                case 2:
                    partnerInTeam.SpInstance.ThirdPartnerSkill     = skillList.ThirdSkill;
                    partnerInTeam.SpInstance.ThirdPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8);
                    break;
                }

                partnerInTeam.SpInstance.Agility = 0;
                session.SendPacket(partnerInTeam.GenerateScPacket());
                session.SendPacket(partnerInTeam.GeneratePski());
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_LEARNT_SKILL"), 1));
                break;
            }
        }