public void MagicAttack(NetMsg.MsgAttackInfo info) { if (!play.GetMagicSystem().isMagic(info.usType)) return; //检测施法速度 ushort magiclv = play.GetMagicSystem().GetMagicLevel(info.usType); if (!play.GetMagicSystem().CheckMagicAttackSpeed((ushort)info.usType, (byte)magiclv)) { return; } //-------------------------------------------------------------------------- //暗黑龙骑--焰魂枪·裂地三段斩 if (info.usType == GameStruct.MagicTypeInfo.YANHUNQIANG_LIEDI) { uint nMagicId = info.usType + mnYanHunQiangIndex; //没有下一段技能 if (!play.GetMagicSystem().isMagic(nMagicId)) { mnYanHunQiangIndex = 0; nMagicId = info.usType; } info.usType = nMagicId; mnYanHunQiangIndex++; if (mnYanHunQiangIndex >= 3) mnYanHunQiangIndex = 0; } //-------------------------------------------------------------------------- //暗黑龙骑- 焰魂枪·流焰 四段斩 if (info.usType == GameStruct.MagicTypeInfo.YANHUNQIANG_LIUYAN) { uint nMagicId = info.usType + mnYanHunQiangExIndex; //没有下一段技能 if (!play.GetMagicSystem().isMagic(nMagicId)) { mnYanHunQiangExIndex = 0; nMagicId = info.usType; } info.usType = nMagicId; mnYanHunQiangExIndex++; if (mnYanHunQiangExIndex >= 4) mnYanHunQiangExIndex = 0; } //------------------------------------------------------------------------ GameStruct.MagicTypeInfo typeinfo = ConfigManager.Instance().GetMagicTypeInfo(info.usType); if (typeinfo == null) return; uint injured = 0; BaseObject targetobj = null; //xp技能校验- if (typeinfo.use_xp > 0 && play.GetTimerSystem().QueryStatus(GameStruct.RoleStatus.STATUS_XPFULL_ATTACK) == null) return; //加经验 if (typeinfo.need_exp > 0 && play.GetBaseAttr().level >= typeinfo.need_level) { play.GetMagicSystem().AddMagicExp(info.usType, 1); } if (typeinfo.use_ep > 0 && play.GetBaseAttr().sp < typeinfo.use_ep) { return; } if (typeinfo.use_mp > 0 && play.GetBaseAttr().mana < typeinfo.use_mp) return; //消耗体力 if (typeinfo.use_ep > 0 && play.GetBaseAttr().sp > typeinfo.use_ep) { play.ChangeAttribute(UserAttribute.SP, (int)-typeinfo.use_ep); } //消耗魔法 if (typeinfo.use_mp > 0 && play.GetBaseAttr().mana > typeinfo.use_mp) { play.ChangeAttribute(UserAttribute.MANA, (int)-typeinfo.use_mp); } switch (typeinfo.sort) { case GameStruct.MagicTypeInfo.MAGICSORT_ATTACK: case GameStruct.MagicTypeInfo.MAGICSORT_JUMP_ATTACK: //跳斩单体攻击 { targetobj = play.GetGameMap().FindObjectForID(info.idTarget); if (targetobj == null) { return; } if (targetobj.IsDie()) return; if (targetobj.IsLock()) return; //被锁定了 byte bdir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), targetobj.GetCurrentX(), targetobj.GetCurrentY()); play.SetDir(bdir); //距离判断,防止非法封包 if (Math.Abs(play.GetCurrentX() - targetobj.GetCurrentY()) > typeinfo.distance && Math.Abs(play.GetCurrentY() - targetobj.GetCurrentY()) > typeinfo.distance) { return; } //连击技能 if (!play.CanPK(targetobj)) return; if (IsComboMagic(typeinfo.typeid)) { this.ComboMagic(info, targetobj); //血袭- 增加buff与状态 if (info.usType == GameStruct.MagicTypeInfo.XUEXI) { play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_XUEXI, Define.XUEXI_TIME); } return; } //单体魔法攻击 injured = BattleSystem.AdjustDamage(play, targetobj, true); //怪物承受XP技能加倍伤害 if (targetobj.type == OBJECTTYPE.MONSTER && typeinfo.use_xp > 0) { injured = injured * Define.XP_MULTIPLE; } NetMsg.MsgMonsterMagicInjuredInfo magicattack = new NetMsg.MsgMonsterMagicInjuredInfo(); magicattack.time = System.Environment.TickCount; magicattack.roleid = play.GetTypeId(); magicattack.role_x = play.GetCurrentX(); magicattack.role_y = play.GetCurrentY(); magicattack.monsterid = targetobj.GetTypeId(); magicattack.tag = 21; magicattack.magicid = (ushort)info.usType; magicattack.magiclv = magiclv; play.BroadcastBuffer(magicattack.GetBuffer(), true); NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo(); //有轨迹的魔法-- magicattackex.SetSigleAttack(targetobj.GetTypeId()); magicattackex.nID = play.GetTypeId(); //magicattackex.nX = (short)info.usPosX; //magicattackex.nY = (short)info.usPosY; magicattackex.nMagicID = (ushort)info.usType; magicattackex.nMagicLv = magiclv; magicattackex.bDir = play.GetDir(); magicattackex.AddObject(targetobj.GetTypeId(),(int) injured); play.BroadcastBuffer(magicattackex.GetBuffer(),true); targetobj.Injured(play, injured, info); ////跳斩单体攻击 //位置还没计算好..2015.10.27 暂时搁置 //位置已解决- 2015.11.1 if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_JUMP_ATTACK) { int nNewX = targetobj.GetCurrentX() - (DIR._DELTA_X[bdir] + DIR._DELTA_X[bdir]); int nNewY = targetobj.GetCurrentY() - (DIR._DELTA_Y[bdir] + DIR._DELTA_Y[bdir]); play.SetPoint((short)nNewX,(short) nNewY); } break; } case GameStruct.MagicTypeInfo.MAGICSORT_BOMB: //范围攻击 case GameStruct.MagicTypeInfo.MAGICSORT_JUMPBOMB: //跳斩范围攻击 case GameStruct.MagicTypeInfo.MAGICSORT_POINTBOMB: //指定鼠标位置攻击 { byte bdir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(bdir); //亡灵巫师巫怒噬魂 if (typeinfo.typeid == GameStruct.MagicTypeInfo.WUNUSHIHUN) { if (targetobj == null) { return; } int nNewX = targetobj.GetCurrentX() - (DIR._DELTA_X[bdir] + DIR._DELTA_X[bdir]); int nNewY = targetobj.GetCurrentY() - (DIR._DELTA_Y[bdir] + DIR._DELTA_Y[bdir]); play.SetPoint((short)nNewX, (short)nNewY); targetobj = play.GetGameMap().FindObjectForID(info.idTarget); } if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_JUMPBOMB) //跳斩 { if (Math.Abs(play.GetCurrentX() - info.usPosX) > typeinfo.distance && Math.Abs(play.GetCurrentY() - info.usPosY) > typeinfo.distance) { return; } play.SetPoint((short)info.usPosX, (short)info.usPosY); //跳斩嘛。先跳过去 } NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo(); magicattackex.nID = play.GetTypeId(); magicattackex.nX = play.GetCurrentX(); magicattackex.nY = play.GetCurrentY(); if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_POINTBOMB) { magicattackex.nX = (short)info.usPosX; magicattackex.nY = (short)info.usPosY; } magicattackex.nMagicID = (ushort)info.usType; magicattackex.nMagicLv = magiclv; magicattackex.bDir = play.GetDir(); //被攻击的对象 List<BaseObject> list = this.RefreshMagicVisibleObject(typeinfo.typeid,info); if (list != null) { for (int i = 0; i < list.Count; i++) { injured = BattleSystem.AdjustDamage(play, list[i], true); //怪物承受XP技能加倍伤害 if (list[i].type == OBJECTTYPE.MONSTER && typeinfo.use_xp > 0) { injured = injured * Define.XP_MULTIPLE; } list[i].Injured(play, injured, info); magicattackex.AddObject(list[i].GetTypeId(), (int)injured); } } byte[] msg = magicattackex.GetBuffer(); play.BroadcastBuffer(msg, true); //血族 血雨旋涡 if (typeinfo.typeid == GameStruct.MagicTypeInfo.XUEYUXUANWO) { int nAddX = 0; int nAddY = 0; switch(bdir) { case DIR.LEFT_DOWN: case DIR.RIGHT_UP: { nAddX = 10; nAddY = 15; break; } case DIR.LEFT: case DIR.UP: case DIR.RIGHT: case DIR.DOWN: { nAddY = 10; nAddX = 10; break; } case DIR.LEFT_UP: case DIR.RIGHT_DOWN: { nAddX = 15; nAddY = 10; break; } } int nNewX = play.GetCurrentX() + (DIR._DELTA_X[bdir] * nAddX); int nNewY = play.GetCurrentY() + (DIR._DELTA_Y[bdir] * nAddY); play.SetPoint((short)nNewX, (short)nNewY); } break; } case GameStruct.MagicTypeInfo.MAGICSORT_FAN: //扇形攻击 { byte bdir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(bdir); NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo(); magicattackex.nID = play.GetTypeId(); magicattackex.nX = play.GetCurrentX(); magicattackex.nY = play.GetCurrentY(); magicattackex.nMagicID = (ushort)info.usType; magicattackex.nMagicLv = magiclv; magicattackex.bDir = bdir; //被攻击的对象 List<BaseObject> list = this.RefreshMagicVisibleObject(typeinfo.typeid, info); if (list != null) { for (int i = 0; i < list.Count; i++) { injured = BattleSystem.AdjustDamage(play, list[i], true); //怪物承受XP技能加倍伤害 if (list[i].type == OBJECTTYPE.MONSTER && typeinfo.use_xp > 0) { injured = injured * Define.XP_MULTIPLE; } list[i].Injured(play, injured, info); magicattackex.AddObject(list[i].GetTypeId(), (int)injured); } } byte[] msg = magicattackex.GetBuffer(); play.BroadcastBuffer(msg, true); break; } case GameStruct.MagicTypeInfo.MAGICSORT_LINE: //直线型攻击 { byte bByte = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(bByte); NetMsg.MsgMonsterMagicInjuredInfo magicattack = new NetMsg.MsgMonsterMagicInjuredInfo(); magicattack.roleid = play.GetTypeId(); magicattack.role_x = play.GetCurrentX(); magicattack.role_y = play.GetCurrentY(); magicattack.tag = 21; magicattack.magicid = (ushort)info.usType; magicattack.magiclv = magiclv; play.BroadcastBuffer(magicattack.GetBuffer(), true); NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo(); magicattackex.nID = play.GetTypeId(); magicattackex.nX = (short)info.usPosX; magicattackex.nY = (short)info.usPosY; magicattackex.nMagicID = (ushort)info.usType; magicattackex.nMagicLv = magiclv; magicattackex.bDir = play.GetDir(); List<BaseObject> list = this.RefreshMagicVisibleObject(typeinfo.typeid, info); if (list != null) { for (int i = 0; i < list.Count; i++) { injured = BattleSystem.AdjustDamage(play, list[i], true); //怪物承受XP技能加倍伤害 if (list[i].type == OBJECTTYPE.MONSTER && typeinfo.use_xp > 0) { injured = injured * Define.XP_MULTIPLE; } list[i].Injured(play, injured, info); magicattackex.AddObject(list[i].GetTypeId(), (int)injured); } } play.BroadcastBuffer(magicattackex.GetBuffer(), true); break; } case GameStruct.MagicTypeInfo.MAGICSORT_ATTACHSTATUS: //引诱 { foreach (RefreshObject refobj in play.GetVisibleList().Values) { BaseObject obj = refobj.obj; if (obj.type == OBJECTTYPE.MONSTER) { if ((obj as MonsterObject).GetAi().GetTargetObject() == null) { (obj as MonsterObject).GetAi().SetAttackTarget(play); } } } byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg,true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); break; } case GameStruct.MagicTypeInfo.MAGICSORT_STEALTH: //潜行 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_STEALTH, Define.STEALTH_TIME); break; } case GameStruct.MagicTypeInfo.MAGICSORT_HIDEDEN://隐身 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); if (play.GetTimerSystem().QueryStatus(GameStruct.RoleStatus.STATUS_HIDDEN) != null) { play.GetTimerSystem().DeleteStatus(GameStruct.RoleStatus.STATUS_HIDDEN); } else { play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_HIDDEN, Define.HIDEDEM_TIME); } break; } case GameStruct.MagicTypeInfo.MAGICSORT_YUANSUZHANGKONG: //法师 元素掌控 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); if (play.GetTimerSystem().QueryStatus(GameStruct.RoleStatus.STATUS_YUANSUZHANGKONG) != null) { play.GetTimerSystem().DeleteStatus(GameStruct.RoleStatus.STATUS_YUANSUZHANGKONG); //流星陨火要清空 mnLiuXingYunHuoCount = 0; play.ChangeAttribute(UserAttribute.LIUXINGYUNHUO, mnLiuXingYunHuoCount); } else { play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_YUANSUZHANGKONG, 0); } NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); break; } case GameStruct.MagicTypeInfo.MAGICSORT_LIUXINGYUNHUO: //法师 流星陨石 { targetobj = play.GetGameMap().FindObjectForID(info.idTarget); if (targetobj == null) { return; } byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); if (mnLiuXingYunHuoCount <= 0) break; NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); for (int i = 0; i < mnLiuXingYunHuoCount; i++) { injured = BattleSystem.AdjustDamage(play, targetobj, true); NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo(); //有轨迹的魔法-- magicattackex.SetSigleAttack(targetobj.GetTypeId()); magicattackex.nID = play.GetTypeId(); magicattackex.nMagicID = (ushort)info.usType; magicattackex.nMagicLv = magiclv; magicattackex.bDir = play.GetDir(); magicattackex.AddObject(targetobj.GetTypeId(), (int)injured); play.BroadcastBuffer(magicattackex.GetBuffer(), true); targetobj.Injured(play, injured, info); } mnLiuXingYunHuoCount = 0; play.ChangeAttribute(UserAttribute.LIUXINGYUNHUO, mnLiuXingYunHuoCount); break; } case GameStruct.MagicTypeInfo.MAGICSORT_JUYANSHENGDUN://法师 巨岩圣盾 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_JUYANSHENGDUN, 0); break; } case GameStruct.MagicTypeInfo.MAGICSORT_YUANSUZHAOHUAN: //法师 元素召唤 { if (play.IsMountState()) play.TakeOffMount(0); else play.TakeMount(0,Define.YUANSUZHAOHUAN_MOUNTID); break; } case GameStruct.MagicTypeInfo.MAGICSORT_GULINGQIYUE: //亡灵巫师 骨灵契约 { if (play.IsMountState()) play.TakeOffMount(0); else play.TakeMount(0,Define.GULINGQIYUE_MOUNTID); break; } case GameStruct.MagicTypeInfo.MAGICSORT_ZHAOHUANWUHUAN: { NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = play.GetDir(); msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); if (play.GetTimerSystem().QueryStatus(GameStruct.RoleStatus.STATUS_ZHAOHUANWUHUAN) != null) { play.GetTimerSystem().DeleteStatus(GameStruct.RoleStatus.STATUS_ZHAOHUANWUHUAN); } else { play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_ZHAOHUANWUHUAN); } break; } case GameStruct.MagicTypeInfo.MAGICSORT_JIANGLINGZHOUYU: //亡灵巫师- 降灵咒雨 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); EffectObject _effobj = new EffectObject(play, Define.JIANGLINGZHOUYU, 10, 14, Define.JIANGLINGZHOUYU_TIME, (short)info.usPosX, (short)info.usPosY); play.GetGameMap().AddObject(_effobj); _effobj.RefreshVisibleObject(); _effobj.SendInfo(play); break; } case GameStruct.MagicTypeInfo.MAGICSORT_ANSHAXIELONG: //暗沙邪龙 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_ANSHAXIELONG); break; } case GameStruct.MagicTypeInfo.MAGICSORT_MINGGUOSHENGNV: //冥国圣女 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_MINGGUOSHENGNV); break; } case GameStruct.MagicTypeInfo.MAGICSORT_WANGNIANWULING: //亡念巫灵 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_WANGNIANWULING); break; } case GameStruct.MagicTypeInfo.MAGICSORT_SHENYUANELING: //深渊恶灵 case GameStruct.MagicTypeInfo.MAGICSORT_DIYUXIEFU: //地狱邪蝠 case GameStruct.MagicTypeInfo.MAGICSORT_SHIHUNWULING://蚀魂巫灵 { targetobj = play.GetGameMap().FindObjectForID(info.idTarget); if (targetobj == null) { return; } uint monster_id = Define.SHENYUANELING_MONSTER_ID; if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_DIYUXIEFU) { monster_id = Define.DIYUXIEFU_MONSTER_ID; } else if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_SHIHUNWULING) { monster_id = Define.SHIHUNWULING_MONSTER_ID; } GameStruct.MonsterInfo monster_info = ConfigManager.Instance().GetMonsterInfo(monster_id); if(monster_info == null) { Log.Instance().WriteLog("获取深渊恶灵怪物ID失败"); break; } byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); //play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_SHENYUANELING); int nNewX = targetobj.GetCurrentX() - DIR._DELTA_X[play.GetDir()]; int nNewY = targetobj.GetCurrentY() - DIR._DELTA_Y[play.GetDir()]; MonsterObject Object_CALL = null; if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_DIYUXIEFU) { Object_CALL = new DiYuXieFu(play, targetobj, (short)nNewX, (short)nNewY, play.GetDir(), monster_info.id, monster_info.ai); } else if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_SHIHUNWULING) { Object_CALL = new ShiHunWuLing(play, targetobj, (short)nNewX, (short)nNewY, play.GetDir(), monster_info.id, monster_info.ai); } else if (typeinfo.sort == GameStruct.MagicTypeInfo.MAGICSORT_SHENYUANELING) { Object_CALL= new ShenYuanELing(play, targetobj, (short)nNewX, (short)nNewY, play.GetDir(), monster_info.id, monster_info.ai); } play.GetGameMap().AddObject(Object_CALL, null); // Object_CALL.RefreshVisibleObject(); Object_CALL.Alive(false); break; } case GameStruct.MagicTypeInfo.MAGICSORT_DRAGON_MOLONGSHOUHU: //暗黑龙骑魔龙守护 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_MOLONGSHOUHU, Define.STATUS_MOLONGSHOUHU_TIME, true); //添加buff图标 break; } case GameStruct.MagicTypeInfo.MAGICSORT_DRAGON_QISHITUANSHOUHU: //骑士团守护 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); //创建四个守护骑士 GuardKnightObject obj = null; GameStruct.MonsterInfo monster = ConfigManager.Instance().GetMonsterInfo(Define.GUARDKNIGHTID); if (monster == null) { Log.Instance().WriteLog("创建守护骑士失败!!,无此怪物id!"); break; } if (mListQiShiTuanGuard == null) {mListQiShiTuanGuard = new List<BaseObject>();} // else // { RemoveQiShiTuanGuardEffect(); // } short[] _x = { -5, -5, +5, +5 }; short[] _y = { +5, -5, -5, +5 }; byte[] _dir = { DIR.LEFT_DOWN, DIR.LEFT_UP, DIR.RIGHT_UP, DIR.RIGHT_DOWN }; for (int i = 0; i < _x.Length; i++) { short x = (short)(play.GetCurrentX() + _x[i]); short y = (short)(play.GetCurrentY() + _y[i]); obj = new GuardKnightObject(play, x, y, _dir[i], monster.id, monster.ai); play.GetGameMap().AddObject(obj,null); obj.RefreshVisibleObject(); obj.SendInfo(play); mListQiShiTuanGuard.Add(obj); play.AddVisibleObject(obj, true); } //地面特效- EffectObject _effobj = new EffectObject(play, Define.GUARDKNIGHT_EFFID, 10, 15, Define.GUARDKNIGHT_TIME, play.GetCurrentX(), play.GetCurrentY()); play.GetGameMap().AddObject(_effobj); _effobj.RefreshVisibleObject(); _effobj.SendInfo(play); mListQiShiTuanGuard.Add(_effobj); play.AddVisibleObject(_effobj, true); break; } case GameStruct.MagicTypeInfo.MAGICSORT_DRAGON_QISHITUANCHONGFENG: //骑士团冲锋 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); //创建四个冲锋骑士 FightKnightObject obj = null; GameStruct.MonsterInfo monster = ConfigManager.Instance().GetMonsterInfo(Define.FIGHTKNIGHTID); if (monster == null) { Log.Instance().WriteLog("创建黑暗骑士失败!!,无此怪物id!"); break; } //先不管这个技能了---烦 short[] _x = { -5, -5, +5, +5 }; short[] _y = { +5, -5, -5, +5 }; byte[] _dir = { DIR.LEFT_DOWN, DIR.LEFT_UP, DIR.RIGHT_UP, DIR.RIGHT_DOWN }; for (int i = 0; i < Define.FIGHTKNIGHT_AMOUNT; i++) { short x = (short)(play.GetCurrentX() + _x[i]); short y = (short)(play.GetCurrentY()+ _y[i] ); obj = new FightKnightObject(x, y, play.GetDir(), monster.id, Define.FIGHTKNIGHT_TIME); play.GetGameMap().AddObject(obj, null); obj.RefreshVisibleObject(); obj.SendInfo(play); play.AddVisibleObject(obj, true); } break; } case GameStruct.MagicTypeInfo.MAGICSORT_MIXINSHU: //血族 迷心术 { byte dir = DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), (short)info.usPosX, (short)info.usPosY); play.SetDir(dir); NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = dir; msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.GetTimerSystem().AddStatus(GameStruct.RoleStatus.STATUS_MIXINSHU,Define.MIXINSHU_TIME); break; } case GameStruct.MagicTypeInfo.MAGICSORT_SINGLE_DANCING: //单人舞 case GameStruct.MagicTypeInfo.MAGICSORT_DOUBLE_DANCING: //双人舞 { NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; byte[] msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg, true); NetMsg.MsgMagicAttackInfo _info = new NetMsg.MsgMagicAttackInfo(); _info.id = _info.targetid = play.GetTypeId(); _info.magicid = (ushort)info.usType; _info.level = magiclv; _info.dir = play.GetDir(); msg = _info.GetBuffer(); play.BroadcastBuffer(msg, true); play.SetDancing((short)info.usType); break; } //{ // break; //} //{ // break; //} } // lastattacktime = System.Environment.TickCount; }
//连击技能 private void ComboMagic(NetMsg.MsgAttackInfo info, BaseObject target) { byte[] msg = null; ushort magiclv = play.GetMagicSystem().GetMagicLevel(info.skillid); GameStruct.MagicTypeInfo baseinfo = ConfigManager.Instance().GetMagicTypeInfo(info.usType); //施法动作 NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg); //play.GetGameMap().BroadcastBuffer(play, msg); int _locktime = ConfigManager.Instance().GetTrackTime(baseinfo.track_id); int _target_locktime = ConfigManager.Instance().GetTrackTime(baseinfo.track_id2); int trackcount = ConfigManager.Instance().GetTrackNumber(baseinfo.track_id); //锁定自己与目标 play.Lock(_locktime); target.Lock(_target_locktime, target.type == OBJECTTYPE.PLAYER); //计算伤害值 NetMsg.MsgMagicAttackInfo magicattack ; for (int i = 0; i < trackcount; i++) { ////如果是影轮回,就有几率穿透伤害 //magicattack = new NetMsg.MsgMagicAttackInfo(); //magicattack.id = play.GetTypeId(); //magicattack.value = 0; //magicattack.magicid = (ushort)GameStruct.MagicTypeInfo.ZHENSHIDAJI; //magicattack.level = magiclv; //magicattack.targetid = target.GetTypeId(); //msg = magicattack.GetBuffer(); //play.BroadcastBuffer(msg, true); // target.Injured(play, injured, info); //优先攻击合体的幻兽 uint target_id = target.GetTypeId(); if (target.type == OBJECTTYPE.PLAYER) { EudemonObject eudemon_obj = (target as PlayerObject).GetEudemonSystem().GetInjuredEudemon(); if (eudemon_obj != null) { target_id = eudemon_obj.GetTypeId(); } } magicattack = new NetMsg.MsgMagicAttackInfo(); magicattack.id = play.GetTypeId(); uint injured = BattleSystem.AdjustDamage(play, target); magicattack.value = injured; magicattack.magicid = (ushort)info.usType; magicattack.level = magiclv; magicattack.targetid = target_id; msg = magicattack.GetBuffer(); play.BroadcastBuffer(msg, true); target.Injured(play, injured, info); } if (baseinfo.track_id > 0) { //取得攻击方向 byte attackdir = GameStruct.DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), target.GetCurrentX(), target.GetCurrentY()); play.SetDir(attackdir); target.SetDir(attackdir); NetMsg.MsgCombo combo = new NetMsg.MsgCombo(); combo.CalcTag(info.usType, play, target); short x = 0; short y = 0; GameStruct.TrackInfo trackinfo = ConfigManager.Instance().GetTrackInfo(baseinfo.track_id); GameStruct.TrackInfo track2 = ConfigManager.Instance().GetTrackInfo(baseinfo.track_id2); for (int i = 0; i < trackcount; i++) { //怪物 if (track2.step > 0) { if (GameStruct.DIR.GetNexPoint(target, ref x, ref y)) { target.SetPoint(x, y); } } //角色 if (trackinfo.step > 0) { for (int j = 0; j < trackinfo.step;j++ ) { if (GameStruct.DIR.GetNexPoint(play, ref x, ref y)) { play.SetPoint(x, y); } } } combo.AddComboInfo(info.usType, play, target, trackinfo.action, track2.action); trackinfo = ConfigManager.Instance().GetTrackInfo(trackinfo.id_next); if (track2.id_next != 0) { track2 = ConfigManager.Instance().GetTrackInfo(track2.id_next); } } msg = combo.GetBuffer(); play.BroadcastBuffer(msg, true); } }