스태틱을 사용하는 봇소서의 공격방식 변경
분류
봇관련
조회 수
1,600
추천 수
6
봇소서의 공격 방식에 대해서 말하기 전에 봇이 주변을 정리하는 루틴은 기본적으로 다음과 같습니다.
1. 주변 몹의 리스트를 만든다. (NTC_FindUnit(NTC_UNIT_MONSTER))
2. 몹이 없거나 무시하는 몹의 리스트에 있는 몹밖에는 없으면 주변 정리를 종료한다.
2. 리스트에서 가장 가까운 몹을 확인한다.
3. 확인된 몹에 한 번의 공격을 가한다.
4. 공격이 안되는 몹은 무시하는 몹의 리스트에 추가한다.
5. 1부터 다시 반복한다.
여기서 핵심적인 부분은 가장 가까운 몹부터 공격한다는 것과 공격 대상이 된 몹을 죽을 때까지 공격하는 것이 아니라 한 번의 공격만을 가한다는 점입니다. 전에는 거리 확인도 하지 않았고 한 번 공격 대상이 된 몹이 있으면 그 몹이 죽을 때까지 계속 그 몹만 공격하는 방식이었읍니다. 그래서 몹에 둘러쌓여서도 저 멀리 있는 몹만 계속 공격하는 경우가 종종 관찰되었읍니다. 보면서 매우 답답한 점이었는데 새 버전에서는 아주 멋있게 좋아졌읍니다.
이제 위의 3.번에 언급한 한 번의 공격이 어떻게 이루어지는지 살펴봅시다. 기본적인 흐름은 다음과 같습니다.
1. 일단 자신의 상태를 체크합니다. 저주에 걸렸는지 포션은 있는지 용병은 살아있는지 등등을 체크합니다.
2. 1의 체크에서 필요하면 마을에 갔다 옵니다.
3. 처음 공격(NTConfig_AttackSkill[0])을 할 때인지 판단합니다.
4. 처음 공격을 할 때이면 처음 공격을 수행합니다. 공격이 성공적으로 가해지면 공격 루틴을 끝냅니다.
5. 처음 공격을 할 때가 아니면 스태틱 공격이 설정되어 있는지 확인합니다. (NTConfig_CastStatic < 100)
6. 몹이 라이트닝 내성이 아니고 몹의 피가 스태틱 변수보다 크면 스태틱 공격을 가합니다. 공격이 성공적으로 가해지면 공격 루틴을 끝냅니다.
7. 처음 공격도 스태틱 공격도 해당되지 않으면 몹의 종류에 따라 주력 공격을 합니다. (NTConfig_AttackSkill[1] / NTConfig_AttackSkill[3])
8. 주력 공격이 캐스팅 딜레이에 걸려있으면 부공격을 합니다. (NTConfig_AttackSkill[2] / NTConfig_AttackSkill[4])
9. 7/8의 공격이 성공하면 공격 루틴을 종료합니다.
10. 7/8의 공격에 몹이 내성이면 보조 공격을 합니다. (NTConfig_AttackSkill[5])
11. 10의 공격이 캐스팅 딜레이 상태이면 보조 공격의 부공격을 합니다. (NTConfig_AttackSkill[6])
12. 10/11의 공격이 수행되면 공격을 끝냅니다.
13. 공격 루틴이 이 단계까지 오면 몹은 내성있는 경우인데 마지막으로 용병이 있는지 체크합니다. 현재 공격하는 몹이 보스몹이고 용병이 있다면 의미없는 주력 공격을 하고 공격 루틴을 종료합니다. (일단 이 단계가 계속 반복되면 언젠가 용병이 몹을 잡게되겠죠)
14. 공격도 안되고 용병도 없다면 봇은 이 몹을 공격할 능력이 없음을 표시하고 공격 루틴을 종료합니다. 이 몹들은 주변 정리 루틴의 4번째에 있는 무시몹 리스트에 올라가게 됩니다.
위의 공격 방식은 봇이 강할 때나 스태틱을 사용하지 않는 경우 큰 문제가 없읍니다. 하지만 아템이 별로 없는 오리봇은 스태틱을 사용하지 않으면 몹 잡는 시간도 오래 걸리고 따라서 치킨될 확률도 커집니다. 그런데 스태틱을 사용하는 경우 봇이 강하지 않으면 위의 공격 방식은 다소 문제가 있을 수 있읍니다.
위의 공격 방식에 따르면 몹의 피가 스태틱 변수보다 작아지기 전까지 봇은 계속 스태틱 공격만을 합니다. 그 동안 봇은 몹에 둘러쌓여 계속 공격받게 됩니다. 특히 메테오 공격처럼 캐스팅한 다음 약간의 시간 후에 떨어지는 공격은 다른 공격에 의해 몹들이 없어진 후에 떨어지는 경우가 종종 관찰됩니다. 결국 메테오같은 공격은 매우 비효율적인 공격이 되고 귀중한 스킬 포인트를 낭비하는 것이 됩니다.
이런 저런 이유로 생각해 본 것이 위의 공격 방식에 약간의 수정을 가하는 것입니다. 수정의 핵심은 스태틱 공격을 계속 하는 것이 아니라 한 번 스태틱 공격이 수행되면 일시적으로 스태틱 공격을 막고 다른 공격이 이루어지게 하는 것입니다. 스태틱 공격을 할지 말지를 결정하는 변수는 NTConfig_CastStatic이므로 스태틱 공격이 성공하면 이 값을 100으로 합니다. 이 때 원래의 값은 다른 변수에 일시적으로 저장합니다. 다른 공격이 수행되면 NTConfig_CastStatic의 값을 원래 값으로 다시 바꿉니다. 그러면 다음 번 공격 때는 스태틱 공격이 수행될 것입니다.
이렇게 수정하면 스태틱 한 번 오브나 메테오 한 번 (오브메테오 봇소서의 경우) 번갈아 가면서 공격합니다. 오리에서는 스태틱에 제한이 없으므로 NTConfig_CastStatic의 값을 아주 작게 잡아도 아무 문제가 없읍니다. 어차피 중간중간에 다른 주력 공격도 하기 때문입니다. 몹의 종류에 따라 적절한 NTConfig_CastStatic 값이 다 다른데 하나의 값을 써야하므로 NTConfig_CastStatic의 값을 정하는게 다소 애매한 경우가 많습니다. 그래서 몹의 종류에 따라 NTConfig_CastStatic의 값을 달리하는 여러가지 팁이 사용되는 것으로 알고 있읍니다.
또 다른 장점은 오브를 주력으로 사용하는 경우 스태틱 중간 중간에 콜드 공격을 사용하므로 몹들을 얼리거나 느려지게 하여 공격받는 위험을 줄일 수도 있읍니다. 메테오 같은 경우에도 중간 중간에 시전하므로 몹의 피가 꽤 많은 상황에서 떨어지게 되어 몹의 피를 효과적으로 줄일 수 있읍니다. 또한 스태틱 자체의 효력도 무시할 수 없읍니다. 몹들이 봇 주위로 모이면 모일수록 범위 공격인 스태틱으로 깍는 몹들의 피값의 총합은 매우 크므로 충분히 한 번의 캐스팅의 가치가 있읍니다.
래더가 다시 시작되어 오리에서 맨땅으로 봇소서를 돌릴려니 워낙 약해서 이런 생각 저런 생각하다가 꽤 효과가 있는 듯하여 소개합니다. 실제로 위의 수정을 적용하였더니 치킨이 많이 줄어들었읍니다. 오리에서 봇을 사용하시는 분들에게 추천합니다.
실제 스크립트 수정
NTAttack.ntl 파일을 열어 스태틱값을 저장할 변수를 파일의 앞 부분에 추가합니다.
var _NTA_SkillHand = new Array(7);
var _NTA_SkillDamage = new Array(7);
var _NTA_SkillRange = new Array(7);
var _Save_Static; //추가
그 다음 소서 공격 함수 NTA_SorceressAttackInt()를 찾아서 스태틱 공격 부분에서 다음 부분을 찾읍니다.
if(NTConfig_CastStatic < 100 && parseInt(target.hp*100/target.hpmax) > NTConfig_CastStatic &&
NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) <= 80)
{
.
.
.
if(_staticlevel > 0)
{
if(!NTC_CastSkill(42, NTC_HAND_RIGHT, _castx, _casty))
return 2;
_Save_Static = NTConfig_CastStatic; //추가
NTConfig_CastStatic = 100; //추가
return 3;
}
그러면 한번 스태틱 공격이 성공한 다음 스태틱 변수를 100으로 설정하여 다음 번 공격에서는 스태틱 공격이 수행되지 않습니다.
마지막으로 다른 공격을 한 다음 스태틱 공격을 다시 가능하게 하기 위하여 원래의 값으로 다시 고쳐줍니다.
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_SorceressCastSkillInt(_primaryindex, target))
return 2;
NTConfig_CastStatic = _Save_Static; //추가
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(!NTA_SorceressCastSkillInt(5, target))
return 2;
NTConfig_CastStatic = _Save_Static; //추가
return 3;
}
하면 수정은 완료됩니다.