[번역]눈동자 버프 코딩한 사람의 코멘트
아래의 번역글은 지난시즌 4인파티에서 돌개법사가 눈동자 버프위에서 딜하도록 수정했던 파일을 이번시즌에 어떻게 써먹을수 없을까 하는 질문글에 달린 답변입니다. 읽어보시면 아시겠지만, 이 사람은 당장은 이 작업을 할 시간이 없다고 합니다. 하단부에 첨부된 파일들은 해당 파일을 열어서 어떤 코딩을 했었는가 참고만 해서 다른 사람이 코딩하는데 도움을 주기위한 목적이지 저 파일을 지금 받아서 덮어씌우면 당연히 작동하지 않습니다.
결론만 이야기 하자면 눈동자 버프를 손쉽게 이용할수 있는 방법이 담긴글이 아닙니다. 어떻게 코딩할수있나에 대한 이야기입니다. 재미삼아 읽어보실분만 읽어보세용
안녕들하십니까,
ol' Bentag의 글에서 제가 썼던 댓글을 보신모양입니다. 시즌5때 돌개법사용으로 만들었었고, 작동이 잘되어서 96단에서 8~10분 스피드런이 가능했었고 50%정도 확률로 100단도 뚫었었드랬죠. 불행하게도 제가 이 작업을 다시 다시하기에는 시즌6 현재 수정할 시간이 당장은 없어서 몇주정도 걸릴것 같습니다. 하지만 이 글을 통해 여러분의 시간을 조금이나마 아껴드릴순 있습니다:
눈동자 반지 감지는 사실 전체 작업중 제일 심플한 부분입니다. (당연히 반짝거리는 눈동자 반지 장판 이펙트는 SNO를 가지고 있습니다) (* SNO가 정확히 어떤 의미인지 모르겠습니다. 시리얼넘버, 즉 ID같은 의미가 아닐까 추측합니다. 이 말은 이 윗댓글에서 눈동자에 SNO가 없을꺼라고 생각한다는 어떤 사람의 글에 대한 답변의 의미도 있습니다.) 아래의 코드는 현재 타겟의 설정 범위(기본=20)내의 눈동자 버프를 감지합니다. 대담성 패시브때문에 현재 타겟을 기준점으로 삼았습니다. 캐릭터의 현재위치를 기준점으로 바꿔 사용해도 됩니다. (물론 간단한 옵션체크 같은걸로 바뀌는게 아니라 직접 코딩해야됨)
어떤 이유에서인가 오큘러스 버프의 중심부가 지하 18미터로 설정되있어서 Z좌표는 캐릭터의 위치로 설정해야 합니다. 예를들어서 WizardCombat.cs파일의 텔레포트 부분을 수정하면 다음과 같이 됩니다:
* 보시다시피 X,Y좌표는 눈동자 포지션(ocul.Position)인데 Z좌표는 캐릭터 위치(Player.Position)입니다.
정작 어려운 것은 이동을 해결하는 부분입니다. 트리니티의 컴뱃에 대한 제 짧은 이해도로 살펴본바 'GetPower()' (WizardCombat.cs파일안에있는)가 매초마다 TPS의 수치 만큼 호출됩니다. TPS가 20이라고 해봅시다. 'GetPower()'는 매번 파워(주문시전,이동,평타공격)을 입력하며, 결코 null을 입력하지 않습니다. 명령의 중요성에 의해서 'GetPower():회피->버프->자원소모->자원생성->평타와같은 기본 명령' 식으로 위쪽에서 아래쪽으로 순차적으로 배열되어있습니다. 데몬버디를 실행하는동안 매초마다 20개의 스펠 시전 명령을 서버에 보내고 서버에서 여러분 캐릭터의 공격속도에 의거하여 스펠을 실제 시전할지 안할지를 결정하게 됩니다. 일반적으로는 매초당 1~3개의 주문만을 시전하게 됩니다. 자 그럼 눈동자 버프와 관련된 코드를 어디에 집어 넣어야할까요? 2가지 옵션이 있습니다:
1) 버프와 자원소모 사이의 높은 순위에 집어넣을수 있습니다. 이 결정을 내릴때는 피해야할 지역에 눈동자 버프가 있을때 무시하는것을 개선하기위해선 반드시 회피 설정과 동일 지역을 향하도록 맞추셔야 합니다. (회피 움직임과 회피 영역에 있는 눈동자 버프) 그렇지 않는다면 좌우로 캐릭터가 와리가리를 치게 될겁니다. 더우기 이 명령은 자원생성기가 없을 경우 GetPower()의 자원 소모기를 시전하지 못한다면 아래순위로 내려가게 되고 평타 공격을 불러오게 되기때문에 작동하지 않게 됩니다. 이게 바로 5시즌때 자원 생성기가 없는 돌개법사를 운영할때 제 골머리를 아프게한 문제입니다.
2) 두번째 옵션은 텔레포트 주문에 눈동자 버프를 집어넣고 default_power의 하위 목록에 위치하게 하는겁니다. 시즌5때 저는 default_power의 TrinityPower(SNOPower.Walk, ocul.Distance, oculspot)를 변경했었습니다. 이 경우 자원 소모기에 딜레이를 추가해야만 하고, 그러지 않으면 하단부의 default_power부분까지 내려가지않고 자원소모기만 주구장창 써대게 됩니다. (실제 시전한다는 의미가 아니라 그 명령만 계속 내린다는 의미입니다) 딜레이는 현재 캐릭터의 공격속도에 의해서 delayms=1000.0f/ZetaDia.Me.AttacksPerSecond. 이렇게 결정됩니다. 이것으로 인해 주문 시전 사이사이에 GetPower()의 하단부의 default_power와 눈동자쪽으로 움직임을 실행할 여분의 시간을 만들수 있습니다. 이것이 제가 지난시즌에 제가 제대로 작동하도록 짠 방법입니다.
저의 트리니티에 대한 이해도 부족때문에 일반적인 컴뱃루틴에 다른 문제들이 다소 나타날수 있을것입니다. 시즌5때 제가 작성했던 파일들을 아래에 첨부합니다. 유용하게 사용하시길 바랍니다.
https://www.thebuddyforum.com/attac...iation-wizard-stand-oculus-ring-targetutil-cs
https://www.thebuddyforum.com/attac...tion-wizard-stand-oculus-ring-wizardcombat-cs
아래의 번역글은 지난시즌 4인파티에서 돌개법사가 눈동자 버프위에서 딜하도록 수정했던 파일을 이번시즌에 어떻게 써먹을수 없을까 하는 질문글에 달린 답변입니다. 읽어보시면 아시겠지만, 이 사람은 당장은 이 작업을 할 시간이 없다고 합니다. 하단부에 첨부된 파일들은 해당 파일을 열어서 어떤 코딩을 했었는가 참고만 해서 다른 사람이 코딩하는데 도움을 주기위한 목적이지 저 파일을 지금 받아서 덮어씌우면 당연히 작동하지 않습니다.
결론만 이야기 하자면 눈동자 버프를 손쉽게 이용할수 있는 방법이 담긴글이 아닙니다. 어떻게 코딩할수있나에 대한 이야기입니다. 재미삼아 읽어보실분만 읽어보세용
안녕들하십니까,
ol' Bentag의 글에서 제가 썼던 댓글을 보신모양입니다. 시즌5때 돌개법사용으로 만들었었고, 작동이 잘되어서 96단에서 8~10분 스피드런이 가능했었고 50%정도 확률로 100단도 뚫었었드랬죠. 불행하게도 제가 이 작업을 다시 다시하기에는 시즌6 현재 수정할 시간이 당장은 없어서 몇주정도 걸릴것 같습니다. 하지만 이 글을 통해 여러분의 시간을 조금이나마 아껴드릴순 있습니다:
눈동자 반지 감지는 사실 전체 작업중 제일 심플한 부분입니다. (당연히 반짝거리는 눈동자 반지 장판 이펙트는 SNO를 가지고 있습니다) (* SNO가 정확히 어떤 의미인지 모르겠습니다. 시리얼넘버, 즉 ID같은 의미가 아닐까 추측합니다. 이 말은 이 윗댓글에서 눈동자에 SNO가 없을꺼라고 생각한다는 어떤 사람의 글에 대한 답변의 의미도 있습니다.) 아래의 코드는 현재 타겟의 설정 범위(기본=20)내의 눈동자 버프를 감지합니다. 대담성 패시브때문에 현재 타겟을 기준점으로 삼았습니다. 캐릭터의 현재위치를 기준점으로 바꿔 사용해도 됩니다. (물론 간단한 옵션체크 같은걸로 바뀌는게 아니라 직접 코딩해야됨)
Code:
// Get reference to the oculus buff closest to your current target
internal static DiaObject GetOculusBuffDiaObject(float range = 20f)
{
var objects = ZetaDia.Actors.GetActorsOfType<DiaObject>()
.Where(o => o.ActorSnoId == 433966 && CurrentTarget.Position.Distance(o.Position) < range)
.OrderBy(o => CurrentTarget.Position.Distance(o.Position));
foreach (DiaObject o in objects)
{
if (o == null || !o.IsValid) continue;
return o;
}
return null;
}
어떤 이유에서인가 오큘러스 버프의 중심부가 지하 18미터로 설정되있어서 Z좌표는 캐릭터의 위치로 설정해야 합니다. 예를들어서 WizardCombat.cs파일의 텔레포트 부분을 수정하면 다음과 같이 됩니다:
Code:
if (CanCastTeleport())
{
Vector3 telespot;
DiaObject ocul = TargetUtil.GetOculusBuffDiaObject();
if (ocul) {
telespot.X = ocul.Position.X;
telespot.Y = ocul.Position.Y;
telespot.Z = Player.Position.Z;
} else {
telespot = something_else;
}
return new TrinityPower(SNOPower.Wizard_Teleport, 65f, telespot);
}
정작 어려운 것은 이동을 해결하는 부분입니다. 트리니티의 컴뱃에 대한 제 짧은 이해도로 살펴본바 'GetPower()' (WizardCombat.cs파일안에있는)가 매초마다 TPS의 수치 만큼 호출됩니다. TPS가 20이라고 해봅시다. 'GetPower()'는 매번 파워(주문시전,이동,평타공격)을 입력하며, 결코 null을 입력하지 않습니다. 명령의 중요성에 의해서 'GetPower():회피->버프->자원소모->자원생성->평타와같은 기본 명령' 식으로 위쪽에서 아래쪽으로 순차적으로 배열되어있습니다. 데몬버디를 실행하는동안 매초마다 20개의 스펠 시전 명령을 서버에 보내고 서버에서 여러분 캐릭터의 공격속도에 의거하여 스펠을 실제 시전할지 안할지를 결정하게 됩니다. 일반적으로는 매초당 1~3개의 주문만을 시전하게 됩니다. 자 그럼 눈동자 버프와 관련된 코드를 어디에 집어 넣어야할까요? 2가지 옵션이 있습니다:
1) 버프와 자원소모 사이의 높은 순위에 집어넣을수 있습니다. 이 결정을 내릴때는 피해야할 지역에 눈동자 버프가 있을때 무시하는것을 개선하기위해선 반드시 회피 설정과 동일 지역을 향하도록 맞추셔야 합니다. (회피 움직임과 회피 영역에 있는 눈동자 버프) 그렇지 않는다면 좌우로 캐릭터가 와리가리를 치게 될겁니다. 더우기 이 명령은 자원생성기가 없을 경우 GetPower()의 자원 소모기를 시전하지 못한다면 아래순위로 내려가게 되고 평타 공격을 불러오게 되기때문에 작동하지 않게 됩니다. 이게 바로 5시즌때 자원 생성기가 없는 돌개법사를 운영할때 제 골머리를 아프게한 문제입니다.
2) 두번째 옵션은 텔레포트 주문에 눈동자 버프를 집어넣고 default_power의 하위 목록에 위치하게 하는겁니다. 시즌5때 저는 default_power의 TrinityPower(SNOPower.Walk, ocul.Distance, oculspot)를 변경했었습니다. 이 경우 자원 소모기에 딜레이를 추가해야만 하고, 그러지 않으면 하단부의 default_power부분까지 내려가지않고 자원소모기만 주구장창 써대게 됩니다. (실제 시전한다는 의미가 아니라 그 명령만 계속 내린다는 의미입니다) 딜레이는 현재 캐릭터의 공격속도에 의해서 delayms=1000.0f/ZetaDia.Me.AttacksPerSecond. 이렇게 결정됩니다. 이것으로 인해 주문 시전 사이사이에 GetPower()의 하단부의 default_power와 눈동자쪽으로 움직임을 실행할 여분의 시간을 만들수 있습니다. 이것이 제가 지난시즌에 제가 제대로 작동하도록 짠 방법입니다.
저의 트리니티에 대한 이해도 부족때문에 일반적인 컴뱃루틴에 다른 문제들이 다소 나타날수 있을것입니다. 시즌5때 제가 작성했던 파일들을 아래에 첨부합니다. 유용하게 사용하시길 바랍니다.
https://www.thebuddyforum.com/attac...iation-wizard-stand-oculus-ring-targetutil-cs
https://www.thebuddyforum.com/attac...tion-wizard-stand-oculus-ring-wizardcombat-cs
Last edited: