public void OnDown(CmdFspSendSkill cmd) { if (m_casterObject == null || m_casterObject.GetEnt() == null) { return; } m_casterObject.StartRotate(cmd.m_dir.ToVector3(), 0.11f); BattleEntity ent = m_casterObject.GetEnt() as BattleEntity; int animaId = m_casterData.animaName; if (m_casterObject.m_state == CmdFspEnum.eFspMove || m_casterObject.m_state == CmdFspEnum.eFspAutoMove) { // 施法方向和移动方向一致时 float dot = Vector2.Dot(cmd.m_dir.ToVector2(), m_casterObject.m_moveInfo.m_dir.ToVector2()); if (dot > 0) { animaId = m_casterData.forwardAnimaId; } else { animaId = m_casterData.backAnimaId; } } ent.PlayAnima(animaId); // 表现层,玩家不发生移动转向,而是直接设置方向 m_casterObject.m_bRotate = false; }
public static bool SendSkill(CCreature m_creature, BtDatabase m_dataBase, bool bDown = false) { int targetUid = m_dataBase.GetData <int>((int)eAIParam.INT_TARGET_UID); if (targetUid == m_creature.GetUid()) { return(false); } CCreature targetCc = CCreatureMgr.Get(targetUid); if (targetCc != null) { Vector2d dir = (targetCc.GetPos() - m_creature.GetPos()); dir.Normalize(); //if (dir == Vector2.zero) //{ // dir = m_creature.GetDir(); //} int selectSkillUid = m_dataBase.GetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX); CSkillInfo skillInfo = m_creature.GetSkillByIndex(selectSkillUid); CmdFspSendSkill cmd = new CmdFspSendSkill(); cmd.m_casterUid = (int)m_creature.GetUid(); cmd.m_skillIndex = selectSkillUid; if (skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.Self) { } else if (skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.Dir || skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.SectorDir) { cmd.m_dir = dir; } else if (skillInfo.m_skillInfo.selectTargetType == (int)eSelectTargetType.Pos) { cmd.m_dir = dir; cmd.m_endPos = targetCc.GetPos(); } cmd.m_bDown = bDown; if (m_creature.m_aiType == eAIType.Player) { m_creature.SendFspCmd(cmd); } else { m_creature.PushCommand(cmd); } // 进入公共CD m_dataBase.SetData <int>((int)eAIParam.INT_SKILL_INTERVAL, GetSkillCastCd(m_creature, m_dataBase)); // 清空当前发送的技能 m_dataBase.SetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX, -1); return(true); } return(false); }
/// <summary> /// 指令对象转消息内容并发送 /// </summary> /// <param name="cmd"></param> public void SendFspCmd(IFspCmdType cmd) { // 如果本地单机测试 if (Client.Inst().isSingleTest) { PushCommand(cmd); return; } CmdFspEnum type = cmd.GetCmdType(); FspMsgFrame msg = (FspMsgFrame)NetManager.Inst.GetMessage(eNetMessageID.FspMsgFrame); FspVKey key = new FspVKey(); key.vkey = (int)type; key.playerId = (uint)GetUid(); switch (type) { case CmdFspEnum.eFspStopMove: msg.m_frameData.vkeys.Add(key); break; case CmdFspEnum.eFspMove: CmdFspMove moveCmd = cmd as CmdFspMove; key.args = new int[2]; key.args[0] = (int)(moveCmd.m_dir.x * 100); key.args[1] = (int)(moveCmd.m_dir.y * 100); msg.m_frameData.vkeys.Add(key); break; case CmdFspEnum.eFspAutoMove: CmdFspAutoMove amoveCmd = cmd as CmdFspAutoMove; key.args = new int[2]; key.args[0] = (int)(amoveCmd.m_pos.x * 100); key.args[1] = (int)(amoveCmd.m_pos.y * 100); Debug.Log("send :" + key.args[0] + " " + key.args[1]); msg.m_frameData.vkeys.Add(key); break; case CmdFspEnum.eFspSendSkill: CmdFspSendSkill skill = cmd as CmdFspSendSkill; key.args = new int[7]; key.args[0] = (int)skill.m_casterUid; key.args[1] = (int)skill.m_skillIndex; key.args[2] = (int)skill.m_targetId; key.args[3] = (int)(skill.m_dir.x * 100); key.args[4] = (int)(skill.m_dir.y * 100); key.args[5] = (int)(skill.m_endPos.x * 100); key.args[6] = (int)(skill.m_endPos.y * 100); msg.m_frameData.vkeys.Add(key); break; } FspNetRunTime.Inst.SendMessage(msg); }
public void OnUp(CmdFspSendSkill cmd) { if (m_casterObject == null || m_casterObject.GetEnt() == null) { return; } m_casterObject.StartRotate(cmd.m_dir.ToVector3(), 0.1f); m_casterObject.m_bRotate = true; }
public virtual void PushCommand(IFspCmdType cmd) { switch (cmd.GetCmdType()) { case CmdFspEnum.eFspSendSkill: m_curSkillCmd = cmd as CmdFspSendSkill; Init(); break; } }
public void PushCommand(IFspCmdType cmd) { switch (cmd.GetCmdType()) { case CmdFspEnum.eFspSendSkill: m_curSkillCmd = cmd as CmdFspSendSkill; Start(); m_vSkill.PushCommand(cmd); break; } }
public static void SendSkill(CCreature m_creature, BtDatabase m_dataBase) { int selectSkillUid = m_dataBase.GetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX); CmdFspSendSkill cmd = new CmdFspSendSkill(); cmd.m_casterUid = (int)m_creature.GetUid(); cmd.m_skillIndex = selectSkillUid; cmd.m_bDown = false; m_creature.PushCommand(cmd); // 进入公共CD m_dataBase.SetData <int>((int)eAIParam.INT_SKILL_INTERVAL, GetSkillCastCd(m_creature, m_dataBase)); // 清空当前发送的技能 m_dataBase.SetData <int>((int)eAIParam.INT_SELECT_SKILL_INDEX, 0); }
/// <summary> /// 消息内容转指令对象 /// </summary> private void HandleServerCmd(FspVKey cmd) { CmdFspEnum type = (CmdFspEnum)cmd.vkey; uint uid = cmd.playerId; if (uid == 0) { return; } CCreature player = CCreatureMgr.Get(uid); IFspCmdType logicCmd = null; switch (type) { case CmdFspEnum.eFspStopMove: //Debug.Log(uid + " 停止移动"); logicCmd = new CmdFspStopMove(); break; case CmdFspEnum.eFspMove: //Debug.Log(uid + " 客户端调用移动命令 " + cmd.args[0] + " " + cmd.args[1]); Vector2d v = new Vector2d(cmd.args[0] * 0.01f, cmd.args[1] * 0.01f); logicCmd = new CmdFspMove(ref v); break; case CmdFspEnum.eFspAutoMove: Vector2d v1 = new Vector2d(cmd.args[0] * 0.01f, cmd.args[1] * 0.01f); logicCmd = new CmdFspAutoMove(ref v1); break; case CmdFspEnum.eFspSendSkill: //Debug.Log(uid + " 客户端调用技能 " + cmd.args[0] + " " + cmd.args[1]); CmdFspSendSkill skill = new CmdFspSendSkill(); skill.m_casterUid = cmd.args[0]; skill.m_skillIndex = cmd.args[1]; skill.m_targetId = cmd.args[2]; Vector2d dir = new Vector2d(cmd.args[3] * 0.01f, cmd.args[4] * 0.01f); Vector2d endPos = new Vector2d(cmd.args[5] * 0.01f, cmd.args[6] * 0.01f); skill.m_dir = dir; skill.m_endPos = endPos; logicCmd = skill; break; } player.PushCommand(logicCmd); }
public void SetCmd(CmdFspSendSkill cmd) { if (m_noLaunchUp) { return; } //Debug.Log("cmd :" + cmd.m_bDown + " launch:" +m_bLaunch); m_curSkillCmd = cmd; if (cmd.m_bDown) { OnDown(); } else { if (m_bLaunching) // 如果还在前摇状态中就终止了 { m_noLaunchUp = true; return; } OnUp(); } }
/// <summary> /// 摇杆的场景指示器也只能主角自己有,并且是操作完成才发送指令 /// </summary> private void OnSkillEvent(int index, eJoyStickEvent jsEvent, Vector2 m_delta, bool bCancel) { m_curSkillIndex = index; m_curSkillJoyStick = jsEvent; CCreature master = CCreatureMgr.GetMaster(); CSkillInfo sInfo = m_master.GetSkillByIndex(index); //if (sInfo == null || !sInfo.IsCanUse()) //{ // Debug.Log(index + " 不可用" + jsEvent); // return; //} if (jsEvent == eJoyStickEvent.Drag) { m_curSkillDir = new Vector3(m_delta.x, 0, m_delta.y); m_curSkillDir.Normalize(); } if (jsEvent == eJoyStickEvent.Down) { m_bSkillCancel = false; skillInfo = sInfo.m_skillInfo; m_ui.m_cancelBtn.SetActiveNew(true); m_ui.SetColor(index, SKLL_BLUE); m_skillChose.gameObject.SetActiveNew(true); m_skillCenter.gameObject.SetActiveNew(true); m_skillDistance.gameObject.SetActiveNew(true); m_skillSectorDir.gameObject.SetActiveNew(false); m_skillDir.gameObject.SetActiveNew(false); m_skillPos.gameObject.SetActiveNew(false); m_skillDistance.localScale = new Vector3(skillInfo.distance, 0.01f, skillInfo.distance) * 2; } // 自己 if (skillInfo.selectTargetType == (int)eSelectTargetType.Self) { m_curSkillDir = master.GetDir().ToVector3(); } // 扇形方向 else if (skillInfo.selectTargetType == (int)eSelectTargetType.SectorDir) { if (jsEvent == eJoyStickEvent.Down) { m_curSkillDir = master.GetDir().ToVector3(); m_skillSectorDir.gameObject.SetActiveNew(true); m_skillSectorDir.localScale = new Vector3(skillInfo.distance, 0.01f, skillInfo.distance); } else if (jsEvent == eJoyStickEvent.Drag) { } m_skillCenter.rotation = Quaternion.LookRotation(m_curSkillDir); // 只用控制中心点的方向 } // 直线方向 else if (skillInfo.selectTargetType == (int)eSelectTargetType.Dir) { if (jsEvent == eJoyStickEvent.Down) { int tUid = master.GetTarget(skillInfo.distance); if (tUid == 0) { m_curSkillDir = master.GetDir().ToVector3(); } else { CCreature cc = CCreatureMgr.Get(tUid); if (cc != null) { m_curSkillDir = (cc.GetPos() - master.GetPos()).ToVector3().normalized; } } m_skillDir.gameObject.SetActiveNew(true); m_skillDir.localScale = new Vector3(skillInfo.distance, 0.01f, skillInfo.distance); } else if (jsEvent == eJoyStickEvent.Drag) { } m_skillCenter.rotation = Quaternion.LookRotation(m_curSkillDir); // 只用控制中心点的方向 } // 位置 else if (skillInfo.selectTargetType == (int)eSelectTargetType.Pos) { if (jsEvent == eJoyStickEvent.Down) { int tUid = master.GetTarget(skillInfo.distance); if (tUid == 0) { m_curSkilPos = m_master.GetPos().ToVector3(); } else { CCreature cc = CCreatureMgr.Get(tUid); if (cc != null) { m_curSkilPos = cc.GetPos().ToVector3(); } } m_skillPos.gameObject.SetActiveNew(true); m_skillPos.position = m_curSkilPos; m_skillPos.localScale = new Vector3(skillInfo.length, 0.001f, skillInfo.length); } else if (jsEvent == eJoyStickEvent.Drag) { Vector3 atkOffset = m_curSkillDir * m_delta.magnitude * skillInfo.distance; m_curSkilPos = m_master.m_vCreature.GetEnt().GetPos() + atkOffset; m_skillPos.position = m_curSkilPos; } } if (jsEvent == eJoyStickEvent.Up) { // 发送技能 if (!m_bSkillCancel) { m_bSkillCancel = true; //Debug.Log("发送技能:" + skillInfo.id + "dir:" + m_curSkillDir + " pos:" + m_curSkilPos); CmdFspSendSkill cmd = new CmdFspSendSkill(); cmd.m_casterUid = (int)m_master.GetUid(); cmd.m_skillIndex = m_curSkillIndex; cmd.m_dir = (new Vector2(m_curSkillDir.x, m_curSkillDir.z)).ToVector2d(); cmd.m_endPos = (new Vector2(m_curSkilPos.x, m_curSkilPos.z)).ToVector2d(); master.SendFspCmd(cmd); OnSkillSpeak(index); } // 还原指示器 CancelSkill(); m_skillChose.gameObject.SetActiveNew(false); } }