/// <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); }
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); }
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))); }
// 计算基本威力 public unsafe static int MPow(TUserMagic *UserMagic) { return(UserMagic->MagicInfo.wPower + HUtil32.Random(UserMagic->MagicInfo.wMaxPower - UserMagic->MagicInfo.wPower)); }
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); } }
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))); }
public static int MagMakeFireball_MPow(TUserMagic *UserMagic) { return(UserMagic->MagicInfo.wPower + HUtil32.Random(UserMagic->MagicInfo.wMaxPower - UserMagic->MagicInfo.wPower)); }
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; } }