少年修仙传客户端代码仓库
client_Hale
2019-03-01 1338e9db38b5a6e584579a02af261e3643bdd599
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using UnityEngine;
using System.Collections.Generic;
 
public class TransferGroup
{
    private H2Engine.MapTrasfer m_Data;
    private int m_CurrentIndex;
    private byte m_Step;
    private int targetPoint;
    private List<SFXController> m_EffectList = new List<SFXController>();
 
    public TransferGroup(H2Engine.MapTrasfer data)
    {
        m_Data = data;
        m_CurrentIndex = -1;
        targetPoint = -1;
 
        if (m_Data.transferPoints != null
         && m_Data.transferPoints.Length > 0)
        {
            foreach (var _p in m_Data.transferPoints)
            {
                if (_p.effectID > 0)
                {
                    var _effect = SFXPlayUtility.Instance.PlayBattleEffect(_p.effectID, _p.position, Vector3.forward);
                    m_EffectList.Add(_effect);
                }
            }
        }
    }
 
    private float m_InCreaseTime;
    private Vector3 m_StartPos;
    private bool isPositive = true;
 
    public void Update()
    {
        if (m_Data.transferPoints == null
         || m_Data.transferPoints.Length == 0)
        {
            return;
        }
 
        var _hero = PlayerDatas.Instance.hero;
        if (_hero == null)
        {
            return;
        }
 
        float _distance = 0;
        H2Engine.MapTransferPoint _p;
        switch (m_Step)
        {
            case 0:// 等待第一次进入某个传送点 
                for (int i = 0; i < m_Data.transferPoints.Length; ++i)
                {
                    _p = m_Data.transferPoints[i];
                    _distance = MathUtility.DistanceSqrtXZ(_hero.Pos, _p.position);
                    if (_distance < _p.radius * _p.radius)
                    {
                        m_Step = 1;
                        m_InCreaseTime = 0;
                        GA_Hero.s_MapSwitching = true;
                        _hero.Pos = m_StartPos = m_Data.transferPoints[i].position;
                        _hero.StopPathFind();
                        if (i == 0)
                        {
                            isPositive = true;
                            targetPoint = i + 1;
                        }
                        else
                        {
                            targetPoint = i - 1;
                            isPositive = false;
                        }
                        break;
                    }
                }
                break;
            case 1:
                if (m_Data.transferType == H2Engine.MapTrasfer.E_TransferType.Current)
                {
                    if (targetPoint < 0 || targetPoint > m_Data.transferPoints.Length - 1)
                    {
                        Debug.LogFormat("数据异常: (m_Data.transferPoints.Length = {0}, index = {1})",
                                         m_Data.transferPoints.Length,
                                         targetPoint);
                        m_Step = 0;
                        GA_Hero.s_MapSwitching = false;
                    }
                    else
                    {
                        _p = m_Data.transferPoints[targetPoint];
                        var _pkg = new CB40B_tagCMMoveByType();
                        _pkg.PosX = (ushort)(_p.position.x * 2 + GA_Hero.MapOffset.x);
                        _pkg.PosY = (ushort)(_p.position.z * 2 + GA_Hero.MapOffset.z);
                        _pkg.MoveType = 0;
                        GameNetSystem.Instance.SendInfo(_pkg);
                        GA_Hero.s_MapSwitching = true;
                        m_Step = 2;
                        _hero.OnHorse(0);
                        DTC0428_tagPlayerRideHorse.Send_tagPlayerRideHorse(false);
                        _hero.Play(GAStaticDefine.State_Fly);
                        _hero.Idle();
                    }
                }
                else
                {
                    // 打开地图 / 直接传送
                }
                break;
            case 2:// 执行坐标改变
                _p = m_Data.transferPoints[targetPoint];
                _hero.Forward = MathUtility.ForwardXZ(_p.position, _hero.Pos);
                m_InCreaseTime += .5f * Time.deltaTime;
                _hero.Pos = Vector3.Lerp(m_StartPos, _p.position, m_InCreaseTime);
                _distance = MathUtility.DistanceSqrtXZ(_hero.Pos, _p.position);
                if (_distance < 0.05f)
                {
                    _hero.PrevPos = _hero.Pos = _p.position;
                    _hero.IdleImmediate();
                    _hero.StopPathFind();
 
                    int _nextIndex = -1;
                    if (isPositive)
                    {
                        _nextIndex = targetPoint + 1;
                    }
                    else
                    {
                        _nextIndex = targetPoint - 1;
                    }
                    if (_nextIndex >= 0 && _nextIndex < m_Data.transferPoints.Length)
                    {
                        _hero.Pos = m_StartPos = m_Data.transferPoints[targetPoint].position;
                        targetPoint = _nextIndex;
                        m_InCreaseTime = 0;
                        _hero.StopPathFind();
                        m_Step = 1;
                    }
                    else
                    {
                        m_Step = 3;
                        GA_Hero.s_MapSwitching = false;
                    }
                }
                break;
            case 3:
                _p = m_Data.transferPoints[targetPoint];
                _distance = MathUtility.DistanceSqrtXZ(_hero.Pos, _p.position);
                if (_distance > _p.radius * _p.radius)
                {
                    m_Step = 0;
                    m_InCreaseTime = 0;
                    targetPoint = -1;
                    _hero.StopPathFind();
                    _hero.Behaviour.StopHandupAI(true);
                }
                break;
        }
    }
 
    public void UnInit()
    {
        foreach (var _effect in m_EffectList)
        {
            SFXPlayUtility.Instance.Release(_effect);
        }
        m_EffectList.Clear();
        m_Data = null;
    }
}