예제 #1
0
        /// <summary>
        /// 取内功技能掉内力值
        /// </summary>
        /// <param name="BaseObject"></param>
        /// <param name="UserMagic"></param>
        /// <param name="Power"></param>
        /// <returns></returns>
        public unsafe static int GetNGPow(TBaseObject BaseObject, TUserMagic *UserMagic, int Power)
        {
            int result = 0;
            int nNHPoint;

            if ((UserMagic != null) && (BaseObject != null))
            {
                if ((BaseObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT))
                {
                    nNHPoint = ((TPlayObject)(BaseObject)).GetSpellPoint(UserMagic);
                    if (((TPlayObject)(BaseObject)).m_Skill69NH >= nNHPoint)
                    {
                        ((TPlayObject)(BaseObject)).m_Skill69NH = (uint)HUtil32._MAX(0, ((TPlayObject)(BaseObject)).m_Skill69NH - nNHPoint);
                        ((TPlayObject)(BaseObject)).SendRefMsg(Grobal2.RM_MAGIC69SKILLNH, 0, ((TPlayObject)(BaseObject)).m_Skill69NH, ((TPlayObject)(BaseObject)).m_Skill69MaxNH, 0, "");
                        result = (int)HUtil32.Round((double)Power * ((UserMagic->btLevel + 1) * (M2Share.g_Config.nNGSkillRate / 100))); // 计算攻击力
                        ((TPlayObject)(BaseObject)).NGMagic_Lvexp(UserMagic);                                                            // 内功技能升级
                    }
                }
                else if ((BaseObject.m_btRaceServer == Grobal2.RC_HEROOBJECT))
                {
                    nNHPoint = ((THeroObject)(BaseObject)).GetSpellPoint(UserMagic);
                    if (((THeroObject)(BaseObject)).m_Skill69NH >= nNHPoint)
                    {
                        ((THeroObject)(BaseObject)).m_Skill69NH = (uint)HUtil32._MAX(0, ((THeroObject)(BaseObject)).m_Skill69NH - nNHPoint);
                        ((THeroObject)(BaseObject)).SendRefMsg(Grobal2.RM_MAGIC69SKILLNH, 0, ((THeroObject)(BaseObject)).m_Skill69NH, ((THeroObject)(BaseObject)).m_Skill69MaxNH, 0, "");
                        result = (int)HUtil32.Round((double)Power * ((UserMagic->btLevel + 1) * (M2Share.g_Config.nNGSkillRate / 100))); // 计算攻击力
                        ((THeroObject)(BaseObject)).NGMAGIC_LVEXP(UserMagic);                                                            // 内功技能升级
                    }
                }
            }
            return(result);
        }
예제 #2
0
        public unsafe static int GetPower13(int nInt, TUserMagic *UserMagic)
        {
            int    result;
            double d10;
            double d18;

            d10    = nInt / 3.0;
            d18    = nInt - d10;
            result = (int)HUtil32.Round(d18 / (UserMagic->MagicInfo.btTrainLv + 1) * (UserMagic->btLevel + 1) + d10 + (UserMagic->MagicInfo.btDefPower
                                                                                                                       + HUtil32.Random(UserMagic->MagicInfo.btDefMaxPower - UserMagic->MagicInfo.btDefPower)));
            return(result);
        }
예제 #3
0
 public unsafe static int GetPower(int nPower, TUserMagic *UserMagic)
 {
     return((int)HUtil32.Round((double)nPower / (UserMagic->MagicInfo.btTrainLv + 1) * (UserMagic->btLevel + 1)) + (UserMagic->MagicInfo.btDefPower
                                                                                                                    + HUtil32.Random(UserMagic->MagicInfo.btDefMaxPower - UserMagic->MagicInfo.btDefPower)));
 }
예제 #4
0
 // 计算基本威力
 public unsafe static int MPow(TUserMagic *UserMagic)
 {
     return(UserMagic->MagicInfo.wPower + HUtil32.Random(UserMagic->MagicInfo.wMaxPower - UserMagic->MagicInfo.wPower));
 }
예제 #5
0
        public unsafe void TrainingMagic(TPlayObject PlayObject, string[] @Params)
        {
            string sHumanName = @Params.Length > 0 ? @Params[0] : "";
            string sSkillName = @Params.Length > 1 ? @Params[1] : "";
            int    nLevel     = @Params.Length > 2 ? Convert.ToInt32(@Params[2]) : 0;
            string HeroStr    = @Params.Length > 3 ? @Params[3] : "";

            TMagic *    Magic;
            TUserMagic *UserMagic = null;
            TPlayObject m_PlayObject;
            THeroObject HeroObject;

            if (((sHumanName != "") && (sHumanName[0] == '?')) || (sHumanName == "") || (sSkillName == "") || (nLevel < 0) || !(nLevel >= 0 && nLevel <= 3))
            {
                if (M2Share.g_Config.boGMShowFailMsg)
                {
                    PlayObject.SysMsg("命令格式: @" + this.Attributes.Name + " 人物名称  技能名称 修炼等级(0-3) hero", TMsgColor.c_Red, TMsgType.t_Hint);
                }
                return;
            }
            if (("HERO").ToLower().CompareTo((HeroStr).ToLower()) == 0)
            {
                HeroObject = ((THeroObject)(UserEngine.GetHeroObject(sHumanName)));
                if (HeroObject == null)
                {
                    PlayObject.SysMsg(string.Format(GameMsgDef.g_sNowNotOnLineOrOnOtherServer, new string[] { sHumanName }), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                Magic = UserEngine.FindHeroMagic(sSkillName);
                if (Magic == null)
                {
                    PlayObject.SysMsg(string.Format("{0} 技能名称不正确!!!", sSkillName), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                if (HeroObject.IsTrainingSkill(Magic->wMagicId))
                {
                    PlayObject.SysMsg(string.Format("{0} 技能已修炼过了!!!", sSkillName), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                if ((HUtil32.SBytePtrToString(Magic->sDescr, 0, Magic->DescrLen) == "内功") && (!HeroObject.m_boTrainingNG)) // 没有内功心法,则不能学内功技能
                {
                    PlayObject.SysMsg(string.Format("(英雄) %s 没学过内功心法,不能学习此 %s 技能!!!", new string[] { HeroObject.m_sCharName, sSkillName }), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                UserMagic             = (TUserMagic *)Marshal.AllocHGlobal(sizeof(TUserMagic));
                UserMagic->MagicInfo  = *Magic;
                UserMagic->wMagIdx    = Magic->wMagicId;
                UserMagic->btLevel    = (byte)nLevel;
                UserMagic->btKey      = 0;
                UserMagic->nTranPoint = 0;
                HeroObject.m_MagicList.Add((IntPtr)UserMagic);
                HeroObject.SendAddMagic(UserMagic);
                HeroObject.RecalcAbilitys();
                HeroObject.CompareSuitItem(false);// 套装
                PlayObject.SysMsg(string.Format("{0} 的 {1} 技能修炼成功!!!", HeroObject.m_sCharName, sSkillName), TMsgColor.c_Green, TMsgType.t_Hint);
            }
            else
            {
                m_PlayObject = UserEngine.GetPlayObject(sHumanName);
                if (m_PlayObject == null)
                {
                    PlayObject.SysMsg(string.Format(GameMsgDef.g_sNowNotOnLineOrOnOtherServer, sHumanName), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                Magic = UserEngine.FindMagic(sSkillName);
                if (Magic == null)
                {
                    PlayObject.SysMsg(string.Format("%s 技能名称不正确!!!", sSkillName), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                if (m_PlayObject.IsTrainingSkill(Magic->wMagicId))
                {
                    PlayObject.SysMsg(string.Format("%s 技能已修炼过了!!!", sSkillName), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                // 没有内功心法,则不能学内功技能
                if ((HUtil32.SBytePtrToString(Magic->sDescr, 0, Magic->DescrLen) == "内功") && (!PlayObject.m_boTrainingNG))
                {
                    PlayObject.SysMsg(string.Format("玩家%s 没学过内功心法,不能学习此 %s 技能!!!", sHumanName, sSkillName), TMsgColor.c_Red, TMsgType.t_Hint);
                    return;
                }
                UserMagic             = (TUserMagic *)Marshal.AllocHGlobal(sizeof(TUserMagic));
                UserMagic->MagicInfo  = *Magic;
                UserMagic->wMagIdx    = Magic->wMagicId;
                UserMagic->btLevel    = (byte)nLevel;
                UserMagic->btKey      = 0;
                UserMagic->nTranPoint = 0;
                m_PlayObject.m_MagicList.Add((IntPtr)UserMagic);
                m_PlayObject.SendAddMagic(UserMagic);
                m_PlayObject.RecalcAbilitys();
                m_PlayObject.CompareSuitItem(false);// 套装
                PlayObject.SysMsg(string.Format("{0} 的 {1} 技能修炼成功!!!", sHumanName, sSkillName), TMsgColor.c_Green, TMsgType.t_Hint);
            }
        }
예제 #6
0
 public static int MagMakeFireball_GetPower(TUserMagic *UserMagic, int nPower)
 {
     return((int)HUtil32.Round((double)nPower / (UserMagic->MagicInfo.btTrainLv + 1) * (UserMagic->btLevel + 1), 1) + (UserMagic->MagicInfo.btDefPower +
                                                                                                                       HUtil32.Random(UserMagic->MagicInfo.btDefMaxPower - UserMagic->MagicInfo.btDefPower)));
 }
예제 #7
0
 public static int MagMakeFireball_MPow(TUserMagic *UserMagic)
 {
     return(UserMagic->MagicInfo.wPower + HUtil32.Random(UserMagic->MagicInfo.wMaxPower - UserMagic->MagicInfo.wPower));
 }
예제 #8
0
        public static void MakeFireball(TBaseObject PlayObject, TMagicMessage MagicMsg, ref TBaseObject TargeTBaseObject, ref bool Result)
        {
            TUserMagic *UserMagic = MagicMsg.UserMagic;
            int         nTargetY  = MagicMsg.nTargetY;

            Result = false;
            int nPower = 0;
            int NGSecPwr;

            if (PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY, TargeTBaseObject) || M2Share.g_Config.boAutoCanHit)
            {
                if (PlayObject.IsProperTarget(TargeTBaseObject))
                {
                    if ((TargeTBaseObject.m_nAntiMagic <= HUtil32.Random(10)) && (Math.Abs(TargeTBaseObject.m_nCurrX - MagicMsg.nTargetX) <= 1) && (Math.Abs(TargeTBaseObject.m_nCurrY - nTargetY) <= 1))
                    {
                        nPower = PlayObject.GetAttackPower(MagMakeFireball_GetPower(UserMagic, MagMakeFireball_MPow(UserMagic))
                                                           + HUtil32.LoWord(PlayObject.m_WAbil.MC), ((short)HUtil32.HiWord(PlayObject.m_WAbil.MC) - HUtil32.LoWord(PlayObject.m_WAbil.MC)) + 1);
                        switch (UserMagic->MagicInfo.wMagicId)
                        {
                        case MagicConst.SKILL_FIREBALL:
                            if ((PlayObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT))
                            {
                                if (((TPlayObject)(PlayObject)).m_MagicSkill_208 != null)
                                {
                                    NGSecPwr = GetNGPow(PlayObject, ((TPlayObject)(PlayObject)).m_MagicSkill_208, nPower);    // 怒之火球
                                    if (TargeTBaseObject != null)
                                    {
                                        if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((TPlayObject)(TargeTBaseObject)).m_MagicSkill_209, nPower);    // 静之火球
                                        }
                                        else if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_HEROOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((THeroObject)(TargeTBaseObject)).m_MagicSkill_209, nPower);    // 静之火球
                                        }
                                    }
                                    nPower = HUtil32._MAX(0, nPower + NGSecPwr);
                                }
                            }
                            else if ((PlayObject.m_btRaceServer == Grobal2.RC_HEROOBJECT))
                            {
                                if (((THeroObject)(PlayObject)).m_MagicSkill_208 != null)
                                {
                                    NGSecPwr = GetNGPow(PlayObject, ((THeroObject)(PlayObject)).m_MagicSkill_208, nPower);    // 怒之火球
                                    if (TargeTBaseObject != null)
                                    {
                                        if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((TPlayObject)(TargeTBaseObject)).m_MagicSkill_209, nPower);    // 静之火球
                                        }
                                        else if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_HEROOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((THeroObject)(TargeTBaseObject)).m_MagicSkill_209, nPower);    // 静之火球
                                        }
                                    }
                                    nPower = HUtil32._MAX(0, nPower + NGSecPwr);
                                }
                            }
                            break;

                        case MagicConst.SKILL_FIREBALL2:
                            if ((PlayObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT))
                            {
                                if (((TPlayObject)(PlayObject)).m_MagicSkill_210 != null)
                                {
                                    NGSecPwr = GetNGPow(PlayObject, ((TPlayObject)(PlayObject)).m_MagicSkill_210, nPower);    // 怒之大火球
                                    if (TargeTBaseObject != null)
                                    {
                                        if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((TPlayObject)(TargeTBaseObject)).m_MagicSkill_211, nPower);    // 静之大火球
                                        }
                                        else if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_HEROOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((THeroObject)(TargeTBaseObject)).m_MagicSkill_211, nPower);    // 静之大火球
                                        }
                                    }
                                    nPower = HUtil32._MAX(0, nPower + NGSecPwr);
                                }
                            }
                            else if ((PlayObject.m_btRaceServer == Grobal2.RC_HEROOBJECT))
                            {
                                if (((THeroObject)(PlayObject)).m_MagicSkill_210 != null)
                                {
                                    NGSecPwr = GetNGPow(PlayObject, ((THeroObject)(PlayObject)).m_MagicSkill_210, nPower);    // 怒之大火球
                                    if (TargeTBaseObject != null)
                                    {
                                        if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_PLAYOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((TPlayObject)(TargeTBaseObject)).m_MagicSkill_211, nPower);    // 静之大火球
                                        }
                                        else if (TargeTBaseObject.m_btRaceServer == Grobal2.RC_HEROOBJECT)
                                        {
                                            NGSecPwr = NGSecPwr - GetNGPow(TargeTBaseObject, ((THeroObject)(TargeTBaseObject)).m_MagicSkill_211, nPower);    // 静之火球
                                        }
                                    }
                                    nPower = HUtil32._MAX(0, nPower + NGSecPwr);
                                }
                            }
                            break;
                        }
                        PlayObject.SendDelayMsg(PlayObject, Grobal2.RM_DELAYMAGIC, nPower, HUtil32.MakeLong(MagicMsg.nTargetX, nTargetY), 2, 0, "", 600);
                        if ((TargeTBaseObject.m_btRaceServer >= Grobal2.RC_ANIMAL))
                        {
                            Result = true;
                        }
                    }
                    else
                    {
                        TargeTBaseObject = null;
                    }
                }
                else
                {
                    TargeTBaseObject = null;
                }
            }
            else
            {
                TargeTBaseObject = null;
            }
        }