少年修仙传客户端代码仓库
hch
2025-06-12 204ef05a831c9484e2abc561d27ecbff7c797453
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
using UnityEngine;
 
public class AI_BossFMT : SampleAI
{
    public AI_BossFMT(GA_NpcClientFightBoss owner, Vector3 bornPosition)
        : base(owner, bornPosition)
    {
        BornPos = bornPosition;
 
        m_SleepTime = 2f;
    }
 
    protected override void OnUpdate()
    {
        base.OnUpdate();
 
        m_Owner.SelectTarget = PlayerDatas.Instance.hero;
 
        if (m_Owner.SelectTarget == null)
        {
            return;
        }
 
        // 攻击间隔中
        if (Time.time - m_LastAttackTime
          < (1f / m_Owner.ActorInfo.atkSpeed) * .8f)
        {
            return;
        }
 
        Skill _skill = m_Owner.SkillMgr.CurCastSkill;
 
        // 判断主角当前是否有技能尚未释放完毕
        if (_skill != null)
        {
            if (!_skill.SkillCompelete)
            {
                return;
            }
 
            if (m_Owner.SkillMgr.DoingPrepareSkill)
            {
                return;
            }
        }
 
        _skill = m_Owner.SkillMgr.Get(10016);
 
        // 判断技能范围, 不在可释放范围需要移动至目标
        float _compareDist = .5f + m_Owner.NpcConfig.ModelRadius;
        float _compareDistSqrt = _compareDist * _compareDist;
 
        // 计算当前和目标的距离
        float _currentDistSqrt = MathUtility.DistanceSqrtXZ(m_Owner.Pos, m_Owner.SelectTarget.Pos);
        // 比较距离
        if (_currentDistSqrt >= _compareDistSqrt)
        {
            // 移动至目标
            m_Owner.MoveToTarget(m_Owner.SelectTarget, _compareDist);
 
            return;
        }
 
        Vector3 _forward = MathUtility.ForwardXZ(m_Owner.SelectTarget.Pos, m_Owner.Pos);
        m_Owner.destForward = m_Owner.Forward = _forward;
 
        m_Owner.Play(GAStaticDefine.State_Attack1Hash);
        m_Owner.SkillMgr.CastSkill(m_Owner.ServerInstID, _skill.id);
 
        ulong hurtValue = 0;
        byte attackType = 0;
 
        AttackHandler.CalculateDamage(m_Owner, m_Owner.SelectTarget as GActorFight,
                                      _skill,
                                      0,
                                      ref hurtValue, ref attackType);
 
 
        if (ClientDungeonStageUtility.isClientDungeon)
        {
            // hurtValue = int(dMaxHP*0.01*(1+atkSkillPer/10000.0))
            hurtValue = (ulong)Mathf.Ceil(PlayerDatas.Instance.extersion.MaxHP * .01f * (1 + m_Owner.NpcConfig.PoisionAtk * Constants.F_DELTA));
            if (m_Owner.SelectTarget.ActorInfo.Hp <= hurtValue)
            {
                hurtValue = 0;
            }
            if (hurtValue != 0)
            {
                if (!ArenaManager.isArenaPK)
                {
                    var _p = new CB40E_tagCMRoleLostHP();
                    _p.LostHP = (uint)(hurtValue % Constants.ExpPointValue);
                    _p.LostHPEx = (uint)(hurtValue / Constants.ExpPointValue);
                    GameNetSystem.Instance.SendInfo(_p);
                }
            }
        }
 
        AttackHandler.HurtObjs _hurtObject = new AttackHandler.HurtObjs
        {
            AttackType = attackType,
            clientInstID = m_Owner.SelectTarget.ClientInstID,
            CurHP = m_Owner.SelectTarget.ActorInfo.Hp,
            HurtHP = hurtValue,
            RealHurtHP = hurtValue,
            ObjID = m_Owner.SelectTarget.ServerInstID,
            ObjType = (byte)m_Owner.SelectTarget.ActorType
        };
 
        _skill.hurtClientList.Add(_hurtObject);
 
        m_Owner.StartCantAtkedRotate();
 
        m_LastAttackTime = Time.time;
    }
 
 
}