protected virtual void UpdateSkill() { if (_coolTick == 0) { // 유효한 타겟인지 if (_target == null || _target.Room != Room) { _target = null; State = CreatureState.Moving; BroadcastMove(); return; } // 스킬이 아직 사용 가능한지 Vector2Int dir = (_target.CellPos - CellPos); int dist = dir.cellDistFromZero; bool canUseSkill = (dist <= _skillRange && (dir.x == 0 || dir.y == 0)); if (canUseSkill == false) { State = CreatureState.Moving; BroadcastMove(); return; } // 타게팅 방향 주시 MoveDir lookDir = GetDirFromVector(dir); if (Dir != lookDir) { Dir = lookDir; BroadcastMove(); } Skill skillData = null; DataManager.SkillDict.TryGetValue(1, out skillData); // 데미지 판정 _target.OnDamaged(this, skillData.damage + TotalAttack); // 스킬 사용 Broadcast S_Skill skill = new S_Skill() { Info = new SkillInfo() }; skill.ObjectId = Id; skill.Info.SkillId = skillData.id; Room.Broadcast(CellPos, skill); // 스킬 쿨타임 적용 int coolTick = (int)(1000 * skillData.cooldown); _coolTick = Environment.TickCount64 + coolTick; } if (_coolTick > Environment.TickCount64) { return; } _coolTick = 0; }
protected virtual void UpdateSkill() { // _coolTick이 0이라는것은 스킬 사용할 준비가 완료됐음을 뜻함 if (_coolTick == 0) { // 유효한 타겟인지 체크 if (_target == null || _target.Room != Room || _target.Hp == 0) { _target = null; State = CreatureState.Moving; BroadcastMove(); // 좀 비효율적이지만.. return; } // 스킬이 아직 사용 가능한지 Vector2Int dir = (_target.CellPos - CellPos); int dist = dir.cellDistFromZero; bool canUseSkill = (dist <= _skillRange && (dir.x == 0 || dir.y == 0)); if (canUseSkill == false) { // 스킬을 사용할 수 없는 상태가 됨 // 플레이어가 도망가거나 게임 자체를 나가거나 할 때 그걸 다시 쫓을지는 Moving 상태에서 판단 State = CreatureState.Moving; BroadcastMove(); return; } // 타게팅 방향 주시 MoveDir lookDir = GetDirFromVec(dir); // 상대방 - 내위치 = 내가 상대방을 바라보는 방향 if (Dir != lookDir) { Dir = lookDir; // 모가지를 돌리고 BroadcastMove(); // 알림 } Skill skillData = null; // 몬스터 시트를 따로 빼서 몬스터에 연결된 스킬과 아이디를 맵핑 DataManager.SkillDict.TryGetValue(1, out skillData); // 데미지 판정 _target.OnDamaged(this, skillData.damage + Stat.Attack); // 스킬 사용 Broadcast S_Skill skill = new S_Skill() { Info = new SkillInfo() }; skill.ObjectId = Id; skill.Info.SkillId = skillData.id; Room.Broadcast(skill); // 몹이 스킬을 쓴다고 알림 // 스킬 쿨타임 시작 int coolTick = (int)(1000 * skillData.cooldown); // 단위 ms임 _coolTick = Environment.TickCount64 + coolTick; // 다음 tick 시간 구함 } // 다시 스킬을 사용할 준비가 됐는지 여부 if (_coolTick > Environment.TickCount64) { return; } // 햇갈릴수도 있겠네 _coolTick = 0; //_coolTick이 0이면 스킬사용 준비가 됐다는 뜻이다. }