Beispiel #1
0
    public void Exit()
    {
        SetStage(0);

        if (mSkillEnd != null)
        {
            mSkillEnd(SkillID);
        }

        if (mSkillContext.IsSkillContextFlag(SkillContextFlag.SyncPosOnSkillEnd))
        {
            if (Owner != null)
            {
                NotifySetPos notify = new NotifySetPos();
                notify.uid       = Owner.gid;
                notify.position  = Vector3Packat.FromVector3(Owner.Position);
                notify.direction = Vector3Packat.FromVector3(Owner.Direction);
                Scene scn = Owner.mScene;
                for (int i = 0; i < scn.GetPlayerCount(); ++i)
                {
                    Player p = scn.GetPlayerByIndex(i);

                    NetWork.NotifyMessage <NotifySetPos>(p.UserID, STC.STC_SetPos, notify);
                }
            }
        }
    }
Beispiel #2
0
    public void BeginSkill()
    {
        int firstStageID = -1;

        for (int i = 0; i < mSkillInfo.stages.Length; ++i)
        {
            int stageID = mSkillInfo.stages[i];
            excel_skill_stage stageInfo = excel_skill_stage.Find(stageID);
            if (stageInfo == null)
            {
                Debug.LogErrorFormat("Error: 找不到技能段{0},技能ID:{1}", stageID, mSkillInfo.id);
                continue;
            }
            if (SkillStage.IsStageTrait(SkillStageTrait.FirstStage, stageInfo))
            {
                firstStageID = stageInfo.id;
                break;
            }
        }
        if (firstStageID < 0)
        {
            Debug.LogErrorFormat("Error: 找不到初始技能段,技能ID:{0}", mSkillInfo.id);
            return;
        }
        SetStage(firstStageID);
        if (mCurStage == null)
        {
            mSkillState = SkillState.Break;
            return;
        }

        Character skillTarget = mSkillContext.SkillTarget;

        if (mSkillInfo.targetType != (int)SkillTargetType.All && skillTarget != null)
        {
            Vector3 dir = skillTarget.Position - Owner.Position;
            Owner.Direction = dir;
        }

        if (!SkillStage.IsStageTrait(SkillStageTrait.AllowMove, mCurStage.mStageInfo) ||
            SkillStage.IsStageTrait(SkillStageTrait.MoveBreak, mCurStage.mStageInfo))
        {
            //Owner.StopMove(false);
        }

        mSkillState = SkillState.Using;

        // 自己客户端放技能通知服务器开始放技能;
        if (GameController.IsConntrller(Owner))
        {
            SkillBegin req = new SkillBegin();
            req.uid       = Owner.gid;
            req.skillID   = mSkillInfo.id;
            req.position  = Vector3Packat.FromVector3(Owner.Position);
            req.direction = Vector3Packat.FromVector3(Owner.Direction);
            NetWork.SendPacket(CTS.CTS_SkillBegin, req, null);
        }
    }
Beispiel #3
0
    public static Vector3Packat FromVector3(Vector3 v)
    {
        Vector3Packat packet = new Vector3Packat();

        packet.x = v.x;
        packet.y = v.y;
        packet.z = v.z;
        return(packet);
    }
Beispiel #4
0
    public void LogicTick()
    {
        UpdateDirty();

        if (mDirty)
        {
            float time = Time.realtimeSinceStartup - GameController.mClientStartTime;

            ReqPlayerMove req = new ReqPlayerMove();
            req.gid       = mMainPlayer.gid;
            req.speed     = mMainPlayer.MoveSpeed;
            req.direction = Vector3Packat.FromVector3(mMainPlayer.Direction);
            req.position  = Vector3Packat.FromVector3(mMainPlayer.Position);
            req.control   = mMainPlayer.IsControl;
            req.timestamp = time;
            req.timespan  = time - mLastTimeStamp;
            NetWork.SendPacket <ReqPlayerMove>(CTS.CTS_PlayerMove, req, null);

            mLastTimeStamp = time;

            ClearDirty();
        }
    }
Beispiel #5
0
    public void DoSkill(int skillID, bool autoTarget, Vector3 targetPos)
    {
        Player player = GameController.mMainPlayer;

        if (player == null)
        {
            return;
        }
        if (player.IsCannotFlag(CannotFlag.CannotSkill))
        {
            return;
        }
        Character target = player.GetTarget();

        if (GameApp.Instance.directGame)
        {
            SkillHandle handle = new SkillHandle();
            handle.skillID       = skillID;
            handle.caster        = player;
            handle.autoTargetPos = autoTarget;
            handle.targetPos     = targetPos;
            handle.skillTargetID = 0;
            SkillHandle.UseSkill(handle);
        }
        else
        {
            ReqSkill reqSkill = new ReqSkill();
            reqSkill.casterID      = player.gid;
            reqSkill.skillID       = skillID;
            reqSkill.position      = Vector3Packat.FromVector3(player.Position);
            reqSkill.direction     = Vector3Packat.FromVector3(player.Direction);
            reqSkill.targetID      = target == null ? 0 : target.gid;
            reqSkill.autoTargetPos = autoTarget;
            reqSkill.targetPos     = Vector3Packat.FromVector3(targetPos);
            NetWork.SendPacket <ReqSkill>(CTS.CTS_SkillReq, reqSkill, null);
        }
    }
Beispiel #6
0
    public void BeginSkill()
    {
        int firstStageID = -1;

        for (int i = 0; i < mSkillInfo.stages.Length; ++i)
        {
            int stageID = mSkillInfo.stages[i];
            excel_skill_stage stageInfo = excel_skill_stage.Find(stageID);
            if (stageInfo == null)
            {
                Debug.LogError("Error: 找不到技能段{0},技能ID:{1}", stageID, mSkillInfo.id);
                continue;
            }
            if (SkillStage.IsStageTrait(SkillStageTrait.FirstStage, stageInfo))
            {
                firstStageID = stageInfo.id;
                break;
            }
        }
        if (firstStageID < 0)
        {
            Debug.LogError("Error: 找不到初始技能段,技能ID:{0}", mSkillInfo.id);
            return;
        }
        SetStage(firstStageID);
        if (mCurStage == null)
        {
            mSkillState = SkillState.Break;
            return;
        }

        Character skillTarget = mSkillContext.SkillTarget;

        if (mSkillInfo.targetType != (int)SkillTargetType.All && skillTarget != null)
        {
            Vector3 dir = skillTarget.Position - Owner.Position;
            Owner.Direction = dir;
        }

        if (!SkillStage.IsStageTrait(SkillStageTrait.AllowMove, mCurStage.mStageInfo) ||
            SkillStage.IsStageTrait(SkillStageTrait.MoveBreak, mCurStage.mStageInfo))
        {
            Owner.StopMove(false);
        }

        mSkillState = SkillState.Using;

        SkillBegin msg = new SkillBegin();

        msg.uid       = Owner.gid;
        msg.skillID   = SkillID;
        msg.position  = Vector3Packat.FromVector3(Owner.Position);
        msg.direction = Vector3Packat.FromVector3(Owner.Direction);

        Scene scn = Owner.mScene;

        for (int i = 0; i < scn.GetPlayerCount(); ++i)
        {
            Player player = scn.GetPlayerByIndex(i);
            if (player == Owner)
            {
                continue;
            }
            NetWork.NotifyMessage(player.UserID, STC.STC_SkillBegin, msg);
        }
    }
Beispiel #7
0
    public static SkillResult UseSkill(SkillHandle handle)
    {
        if (handle.caster == null || handle.caster.IsCannotFlag(CannotFlag.CannotSkill))
        {
            return(SkillResult.InvalidCaster);
        }
        Skill lastSkill = handle.caster.GetSkill();

        if (lastSkill != null)
        {
            SkillStage stage = lastSkill.mCurStage;
            if (stage != null)
            {
                if (SkillStage.IsStageTrait(SkillStageTrait.WaitBreakStage, stage.mStageInfo))
                {
                    if (stage.mStageEnd == null)
                    {
                        WaitBreakStage onStageEnd = new WaitBreakStage();
                        onStageEnd.nextSkillHandle = handle;
                        stage.SetBreak(SkillBreakType.OtherSkill, false, onStageEnd.OnStageEnd);
                    }

                    return(SkillResult.CannotBreak);
                }
                if (!SkillStage.IsStageTrait(SkillStageTrait.BreakSelf, stage.mStageInfo) &&
                    lastSkill.SkillID == handle.skillID)
                {
                    return(SkillResult.CannotBreak);
                }
                if (!SkillStage.IsStageTrait(SkillStageTrait.SkillBreak, stage.mStageInfo))
                {
                    return(SkillResult.CannotBreak);
                }
            }
        }

        excel_skill_list skillExcel = excel_skill_list.Find(handle.skillID);

        if (skillExcel == null)
        {
            return(SkillResult.ExcelNotExist);
        }
        Character target = handle.caster.mScene.FindCharacter(handle.skillTargetID);

        SkillTargetType targetType = (SkillTargetType)skillExcel.targetType;

        if (targetType != SkillTargetType.All)
        {
            if (target == null)
            {
                return(SkillResult.InvalidTarget);
            }
            if (targetType == SkillTargetType.Enemy && !CampSystem.IsEnemy(handle.caster, target))
            {
                return(SkillResult.InvalidTarget);
            }
            if (targetType == SkillTargetType.Friend && !CampSystem.IsFriend(handle.caster, target))
            {
                return(SkillResult.InvalidTarget);
            }
        }
        if (target == null && skillExcel.maxDistance > 0.0f)
        {
            return(SkillResult.InvalidTarget);
        }

        SkillContext context = new SkillContext();

        context.mSkillID      = handle.skillID;
        context.mOwner        = handle.caster;
        context.SkillTargetID = handle.skillTargetID;
        if (!handle.autoTargetPos)
        {
            context.TargetPos = handle.targetPos;
        }
        else
        {
            context.TargetPos = target == null ? Vector3.zero : target.Position;
        }
        Skill skill = new Skill(handle.skillID, context);

        handle.caster.SetSkill(skill);
        skill.mSkillEnd = handle.skillEndMethod;

        ReqSkill notifyMsg = new ReqSkill();

        notifyMsg.skillID       = handle.skillID;
        notifyMsg.casterID      = handle.caster.gid;
        notifyMsg.targetID      = handle.skillTargetID;
        notifyMsg.autoTargetPos = handle.autoTargetPos;
        notifyMsg.targetPos     = Vector3Packat.FromVector3(handle.targetPos);
        notifyMsg.position      = Vector3Packat.FromVector3(handle.caster.Position);
        notifyMsg.direction     = Vector3Packat.FromVector3(handle.caster.Direction);

        for (int i = 0; i < handle.caster.mScene.GetPlayerCount(); ++i)
        {
            Player player = handle.caster.mScene.GetPlayerByIndex(i);
            NetWork.NotifyMessage(player.UserID, STC.STC_SkillNotify, notifyMsg);
        }

        return(SkillResult.Success);
    }