디아 XP.bot_Avenger 좀더 안전한 사냥을 위한 소스 수정팁 몇개..
분류
디아관련
조회 수
2,563
추천 수
3
.여기 게시판을 훓어 보긴 했지만 제가 모든 게시물을 다 읽진 못했습니다. 해서 혹 제가 보지 못한 중복된 내용이거나 이후 버전에 관련해서 수정된게 있다면 리플이나 쪽지 주시거나, 운영자분이 그걸 아신다면 살짜기 지워주세요. 저도 중복내용 리플 달리면 지우겟습니다
몇가지 좀더 안전한 앵벌? 을 위한 봇소스 수정 팁입니다.
제가 돌려본게 파볼오브 소스하고 달려 활마라서 저 두 Class에 관한것만 알 수 있었습니다.
D2JSP_1.1.4+XP.bot_Avenger.Ver4.0 용인데.. 아마 Final도 확인이 필요할것입니다.
1. 파볼오브소서인 경우 보스전이 아닌 필드 잡몹전에서 필요없는 스킬 난사 수정.
필드 사냥에서 파볼난사를 하는데 이것이 대상이 죽어도 일정한 회수까지 계속 파볼 쏩니다.
소서인 경우 아마 다른 기술이라도 Delay 없는 기술이면 마찬가지 일겁니다.
마나가 무한일때 난사좀 하면 어떠랴만 문제는 그거 다 쏠때까지 시간을 잡아먹는것이고 더큰 문제는 그 시간에는 마을로 치킨 상황이 발생해도 치킨을 안하죠. 이것은 기본 5회로 지정되어 있는데 쏘는 동안 얻어맞거나 용병이 죽어서 치킨상황이 발생하면 재빨이 치킨해줘야 하는데 그렇게 안하고 다 쏩니다. 그동안에 주변몹들에게 다구리 당해서 넉백상태에 빠져 결국 다 쏘고도 치킨 못하고 죽거나 방나가는 치킨을 하는 좀 위험한 상황에 빠지는 경우가 많더군요. 이부분 수정입니다.
2. 1번과 같은 상황인데 이번엔 활마입니다. 활마에 관한 사항입니다만 소스 보니 자벨마도 같은 문제일겁니다.
아마인 경우 사용 기술을 지정할때 '몇번 써라'라고 회수를 줄 수 있습니다. 제파일을 예를 들면
// Bowazon skills
XP_BowAttack.push(12); XP_BowNumber.push(1); // "Multiple Shot"
XP_BowAttack.push(26); XP_BowNumber.push(3); // "Strafe"
XP_BowAttack.push(6); XP_BowNumber.push(1); // "Magic Arrow"
몹이 죽을때까지 처음 멀티 1번, 다음 스트레이프 3번, 그때까지도 안 죽으면 최종으로 매직에로우 한번 쏘는걸 되풀이 합니다. 요걸 좀더 수정해서 물리 이뮨이 아닌 경우 매직은 안쏘게 하는 방법을 연구해 볼까 합니다만 그건 차후문제고 어쨋건 저기서 스트 3번을 쏘게 되어 있습니다. 여기서 역시 1번과 마찬가지 상황이 발생합니다. 몹이 죽건말건 일단 스트를 시작하면 3번까지 다 쏘고는 끝냅니다. 스트는 딜레이가 좀있죠? 싸울때 시간 낭비가 많더군요. 물론 여기서 스트를 1번으로 지정하면 이문제는 없어지지만 그렇게 하면 멀티한번, 스트한번, 매직한번 요렇게 반복합니다. 주력이 스트인데 몹잡는게 무지 느려지죠. 당연히 주력인 스트는 많이 써야 하고 해서 이부분 수정입니다.
3. 소서 보스전 문제입니다.
파볼오브 소서인 경우 파이어이뮨과 콜드이뮨이 같이 붙어있는 보스를 만났을때(Eldritch,Shenk,Thresh등등) 주변에 잡몹이 없으면(강조하거니와 주변에 잡몹이 없으면 입니다.) 용병이 그 보스를 다 잡을때까지 Delay없는 루프에 빠져 PC CPU 점유율 다 잡아먹으면서 무지하게 느려집니다. 물론 치킨도 안합니다. 치킨하는 상황 체크도 안하거니와 CPU를 다 점유하고 있어서 LW 쓰레드에서 치킨 메세지 자체도 아마 못 날릴겁니다.
이상황은 소스로 보아 다른 이뮨도 마찬가지 일겁니다. 캐릭이 두가지 엘리 스킬만 쓸 경우 그 두가지에 해당하는 이뮨을 가진 보스를 만났을때 같은 문제가 일어날겁니다. 이부분 수정입니다.
자 이제 소스 수정들어가 봅시다. 먼저 1번 문제부터 고치죠.
scripts\libs\XP\Libs\XP_AreaClearing.d2l 파일을 불러올립니다.
function XP_AttackMonsterSorceress(monster,range,x,y,attackSkills) 를 찻습니다. 원본은 316라인이군요. 이 함수를 고쳐야 하는데 그 아래 좀더 내려가서 354라인에 가면 원소스는 아래와 같습니다.
for (var r = 0; r < XP_UntimedRepeat; r+=1) {
DC_DPrint("XP_AttackMonsterSorceress() Casting UntimedSkill # " + _skill + " on index " + _XP_CurrentUntimed);
DC_DoCast(_skill,hand,monster.x,monster.y);
}
요기서 for 루프가 문제입니다. 캐릭터 환경설정 파일의 XP_UntimedRepeat에 지정된 숫자 만큼 무조건 루프를 돕니다. 기본 5로 지정되어 있습니다. for 루프를 좀 수정해야 하죠. 제 소스입니다. 이렇게 변경하시기 바랍니다.
// 2006년 5월 수정 deer
for (var r = 0; !isDead(monster) && r < XP_UntimedRepeat; r+=1)
{
DC_DPrint("XP_AttackMonsterSorceress() Casting UntimedSkill # " + _skill + " on index " + _XP_CurrentUntimed);
DC_DoCast(_skill,hand,monster.x,monster.y);
if (_XP_MercDead || _XP_OutOfPots || _XP_Town) break; // // 2006년 5월 추가 deer
}
대상이 죽었는지 확인하는 isDead(monster)라는 함수를 for 루프 조건문에 쓰고 있는데 이건 제가 만들어 넣어서 원본 소스에는 없습니다. 그리고 루프 안에 if (_XP_MercDead || _XP_OutOfPots || _XP_Town) break; 라는 코드가 추가 되어 있습니다.
isDead라는 함수를 만들어야 하는데 XP_AreaClearing.d2l 소스 맨 아래쪽에 다음과 같은 코드를 추가합니다.
// victim이 죽은 상황인지 확인한다. 2006년 5월 추가 deer
function isDead(victim)
{
if((victim.hp <= 0) || (victim.mode == 12) || (victim.mode == 0)) return true;
return false;
}
이로서 상대가 죽거나, 난사중에 치킨상황이 발생하면 더이상 스킬을 쓰지 않습니다.
2번 아마 문제 수정입니다.
같은 scripts\libs\XP\Libs\XP_AreaClearing.d2l 파일입니다.
function XP_AttackMonsterAmazon(monster,range,x,y,attackSkills) 함수를 찻습니다. 아마존 필드 공격함수지요. 원본 194라인에 있습니다. 찻았으면 주욱 아래로 내려가 보면 Jav attacks과 Bow attacks 으로 나눠져 있습니다. Bow attacks을 예로 수정합니다. 제것이 활마라...
원본 259라인을 보면 for (x = 1; x <= XP_BowNumber[y]; x+=1) 라고 되어 있는 for 루프가 있습니다. 이 루프를 고쳐야 합니다. 1번과 같이 isDead 함수를 만들고 for문안에 넣습니다.
for (x = 1; !isDead(monster) && x <= XP_BowNumber[y] ; x+=1)
그리고 마을로 치킨하는 코드가 대상이 이번 공격에 조금이라도 기스가 나야 실행됩니다. 이걸 밖으로 빼는게 좋겟지요?
완전한 수정된 코드입니다. 자벨쪽은 전 손을 안댔는데 아마 같이 수정하면 될것입니다.
// monster hp check 추가 2006년 5월 deer
for (x = 1; !isDead(monster) && x <= XP_BowNumber[y] ; x+=1)
{
attempted = true;
DC_DoCast(XP_BowAttack[y],hand,monster);
XP_CheckAttacks();
if (monster.hp < hpprev)
{
hpprev = monster.hp;
attprev = _XP_AttackCompleted + 1;
}
// if문안의 코드를 밖으로 빼냄. 2006년 5월 deer
// Go to town if one of the messages is received from LW
if (_XP_MercDead || _XP_OutOfPots || _XP_Town) { XP_TownManager(); }
}
3번 소서 보스전 수정입니다.
이번엔 scripts\libs\XP\Libs\XP_Include.d2l 파일을 에디터로 불러올립니다.
원본 2155라인에 보면 function XP_SorcBossAttack(target) 이 있는데 이 함수 안을 수정해야 합니다.
원본 2245라인에 DC_DoDel(100); 이라는 코드가 있는데 요것이 잠시 쉬는 코드인데 2225라인의 조건문 안에 있습니다.
이 조건문은 if (!_XP_haveUntimed && !_XP_haveTimed && (_XP_UseTeleOnImmune && XP_ClearPosition(30,target))) 인데 이 조건문을 얼핏 보면 이뮨때문에 쓸 기술이 전혀 없고 XP_ClearPosition(30,target)으로 인해 대상 보스 주변에 잡몹이 있으면 대상에게 텔키를 쓰게 되어 있습니다.
이부분은 외 이렇게 했는지 제가 잘 이해를 못하고 있습니다. 하여튼 반대가 되어야 하지 않을까요. 주변에 잡몹이 없어야 대상에게 텔키를 쓰게... 이거보고 알았는데 텔키도 애교 데미지가 있더군요. XP_ClearPosition 앞에 !을 붙여줍니다. 이것은 !를 붙여야 하는건지 빼야 하는건지 잘 모르겟습니다. 하여튼 전 붙여서 씁니다.
(_XP_UseTeleOnImmune && !XP_ClearPosition(30,target))
그리고 원본 소스 2245라인의 DC_DoDel(100); 를 주석처리 하고 이것을 조건문 밖으로 빼냅니다. 위에처럼 고쳤다 하더라도 이 소스의 위쪽에 있는 var _XP_UseTeleOnImmune=true를 false로 고치면(대상에게 텔키를 안쓰게 하면) 여전히 Delay없는 루프에 빠져들고 XP_CheckUtil(target)의 여러가지 피하기등의 조건을 실행 안합니다. 원본 2245라인을 다음과 같이 고치고 추가합니다.
원본 소스.
}
// Increase the counter
XP_CheckAttacks();
수정된 소스.
} else { // 2006년 5월 수정 deer (else 구문 추가함.)
if (XP_CheckUtil(target)) { return; }
}
DC_DoDel(100); // 2006년 5월 위에서 이동함 deer
// Increase the counter
XP_CheckAttacks();
DC_DoDel(100)이 밖으로 빠져 나왔고.. else 구문이 추가 되었습니다만 이부분은 상황에 따라서 else을 안써야 할지도 모릅니다. 각자 돌아가는데 문제가 있으면 else 구문은 빼버려야 합니다. 그리고 XP_CheckUtil 함수도 조금 문제가 있던데 함수안의 여러 조건문 안에서만 return 문이 있습니다. 그 조건중 하나라도 충족시키지 못하면 값을 돌려주지 않습니다. 상황에 따라서 봇이 정지하는 일이 생길지도 모르지요. 아직 저부분 문제는 보지를 못해서 그냥 놔두고 있습니다. 어쨋건 잠재중인 버그입니다.
하긴.. d2jsp 가 조건문 안에선 아예 에러 체크를 안하는듯 하던데.. 구버전 봇소스 버그잡다가 봤는데 LW이던가? 조건문안에 예를 들면 if (XP_CheckUtil()) 처럼 함수 호출 비교문을 if (XP_CheckUtil) 이렇게 함수명 뒤에 괄호()를 안해줬는데도 예외를 일으키지 않고 돌아가더만요. 물론 찻아보니 같은 이름의 변수도 없었구요. 물론 이 스크립터 코어에서는 함수와 같은이름의 변수가 동시에 존재해도 되는지는 모르겟지만 여하튼 ()가 없어서 조건은 무조건 false로 처리되는 버그였습니다.
이거 고쳐서 쓰다가 봇 버전 바꿔서 보니 그 버전에선 제대로 되어 있었습니다. 그래서 어딘지 잘 기억이 안남.
하여튼 이 3번 상황은 각자 상황에 따라 수정방법이 바뀌어야 할지 모릅니다. 제 오브 파볼 소서는 이렇게 해 놓으니 잘 돌아가더군요.
여기까지 수정 끝입니다. 수정후 봇의 상황이 어떻게 바뀔지 모르므로 만약 이상이 있으면 원래대로 돌려주시구요. 그때 저에게 책임을 지우진 말아주세요. 저도 일단 문제가 있어서 고쳐 쓰는 것이고 제 상황이 아닌 다른상황에선 저도 테스트 해보진 못했습니다. 그리고 고친 파일 두개 자료실에 올려 드렸으면 좋겟는데...
제 소스는 이 문제 이외 싸우다 화살이나 자벨 던질 회수 떨어지면 타운으로 가서 자동충전, 통 걷어차는거 기타 등등 고친게 많아 제소스론 몇가지 파일을 추가 하지 않은 이상 딴분들은 쓰지 못합니다. 그래서 자료실에 못올리네요.
관련 파일까지 자료실에 같이 올리면 되지 않느냐 하실분도 계시지만.. 전에 자료실에 제가 사용하는 파일을 한번 올렸는데.... Reject 되었습니다. 등록은 했는데 나타나지는 않더군요.
예를 들면 isDead 함수의 실제 제 소스입니다.
function isDead(victim)
{
if((victim.hp <= 0) || (victim.mode == c_UnitMode_NPC_Death) || (victim.mode == c_UnitMode_NPC_Dead)) return true;
return false;
}
보시다시피 상수 0,12를 어떤 내용인지 좀더 알아보기 쉽게 const 상수 변수 c_UnitMode_NPC_Dead등으로 바꿔 넣어 놨습니다.
c_UnitMode_NPC_Dead 이 상수를 정의해 놓은 파일을 자료실에 올렸드랬는데.. 그게 안올라오더군요.
제가 소스속에 숫자 상수가 박혀 있는것을 싫어해서 보이는 족족 수정해 놔서.. 저뿐만 아니라 경력 프로그래머 입사지원자는 직접 작성한 소스 제출을 요구할 경우 그 소스안에 필요 없는 숫자 상수가 박혀있으면 감점 대상인걸로 알고 있습니다. 저역시 그런 경우 감점합니다. 뭐 여기 봇소스야 꼭 전문가만 만든게 아니고 또 다른 이유가 있을지 모르니 제가 딴지걸 일이 아니지요.
여하튼 이런저런 이유로 제 소스는 직접 쓰지 못합니다. 따라서 직접 고쳐 쓸 자신 있는분만 고쳐 쓰세요.
내용에 문법도 틀리고 띄어쓰기도 많이 틀렸을것인데 그부분은 용서를 바라구요. 내용중에 틀린 부분있으면 말씀해주세요. 같이 더불어 살아가는게...