NTbot 로비에러 해결(전면 재수정, 테스트 결과)
분류
봇관련
조회 수
2,947
추천 수
4
==============================
제가 밤새 테스트한 결과 wihle문이 계속적으로 반복수행되어야 하지만
로비에러가 났을시에는 반복수행 자체가 멈추더군요;;
아래 수정 방법으로는 해결이 안될듯 싶습니다..
(어후 밤새 헛고생만 한 꼴이 됐네요 ㅠㅠ)
이번 재수정글로 고치셨던 분들께서는 죄송하지만 이 코드를 적용하지 않은
스크립트로 돌려서 사용해 주세요
기존 제가 올렸던 방법으로 사용해서 성공하셨던 분들은 다시 그걸 사용해서
써주시면 감사하겠습니다
이자료로 적용해 보시고 테스트 해 보셨던 분들께 감사함니다
혹 지금 이 자료를 참고하셔서 더욱 완벽한 로비에러 해결에 도전하실분들을 위해
자료는 그대로 남겨놓겠습니다...
==============================
이전 로비에러에 대한글로 해결되셨던 분들도 필독해주세요(제목에 쓰니 범위를 넘어가네요;;)
아랫글에 로비에러 해결에 대한 글을 썼었습니다^^
많은분들께서 관심 보여 주신것 감사드려요~
이번에 다시 로비에러에 대해 올리게 된 이유는 우선 저 아래쪽의 해결방안은
케릭이 로비에있는지를 체크하는 타이밍을 조절함으로써 로비에러를 해결했었습니다
하지만 각 컴퓨터 시스템 성능마다 렉이 좀더 있다든지 하는 이유로
해결이 안된다고 하시는분들이 몇분 있었습니다 이점 죄송하게 생각함니다(_ _)a
그래서 다시한번 야심차게 준비해봤습니다^^
지금부터 설명드리는 해결방안은 타이밍을 조절해서 하는 불안정한 해결방안이 아닙니다^^(고민 마니했어요ㅎㅎ)
그럼 지금 바로 본론으로 들어갈께요~!!
1--------------------------------------
scripts폴더에 있는 starter.dbj파일을 에디트 플러스나 메모장등 편집프로그램으로 불러옵니다
2--------------------------------------
controlData.click(controlData.controls.lobby.button.create); << 이부분이 씌여있는 라인을 찾아
각 앞쪽과 뒷쪽에 delay(1000);를 추가해 줍니다
(이미 delay(1000); 이라던지 이렇게 고치신분들은 그냥 두셔도 됩니다!!)
아레 처럼 바뀌었겠죠??
delay(1000);
controlData.click(controlData.controls.lobby.button.create);
delay(1000);
3--------------------------------------
지금부터 두눈 크게 뜨고 잘 따라하셔야 합니다 조금은 어려울수도 있으니까요
만약 제가 이전에 올린 글을 잘 따라 하셨다면 starter.dbj파일의 내용은 아래와 같이 되어있을 것입니다(이건 제가 자료실에 올린 starter.dbj파일과 코딩이 같습니다^^)
이렇게 고치지 않으 셨다 해도 상관은없습니다^^ 어짜피 이전에 소개한 방법과는 완전히 다르기 때문이죠
##################################################################
생략......
function main()
{
delay(1000);
var _ingame = false;
controlData.clickDelay = clickDelay;
controlData.textDelay = textDelay;
controlData.clickDelayRandom = clickDelayRandom;
controlData.textDelayRandom = textDelayRandom;
while(1)
{
if(me.ingame)
{
if(!inGameAt)
inGameAt = getTickCount();
if(getTickCount()-lastGameMade < gameMaxLength)
{
if(!_ingame)
{
_ingame = true;
sendEventToOOG(126, "In Game", parseInt(gameMinLength/1000));
lastGameStatus = 2; // in game successful
}
delay(1000);
}
else
{
sendEventToOOG(65535, "Maximum game length reached!", 65535);
quit();
delay(2000);
while(me.ingame)
delay(500);
}
}
else
{
if(_ingame)
_ingame = false;
delay(1000);
locationAction(controlData.getLocation());
delay(1000);
}
}
}
생략......
##################################################################
자 죽 훓어 보셨습니까??
그럼 이 함수 바로 아래에 다음과 같은 함수를 추가함니다
#########################################(이 줄까지 추가하시는 분은 없겠죠?^^;;)
function locationislobby(location)
{
if(location.id >= 1 && location.id <= 28)
{
return true
}
return false
}
#########################################
그럼 다음과 같은 내용으로 바뀌어있겠군요~
######################################################
생략......
function main()
{
delay(1000);
var _ingame = false;
controlData.clickDelay = clickDelay;
controlData.textDelay = textDelay;
controlData.clickDelayRandom = clickDelayRandom;
controlData.textDelayRandom = textDelayRandom;
while(1)
{
if(me.ingame)
{
if(!inGameAt)
inGameAt = getTickCount();
if(getTickCount()-lastGameMade < gameMaxLength)
{
if(!_ingame)
{
_ingame = true;
sendEventToOOG(126, "In Game", parseInt(gameMinLength/1000));
lastGameStatus = 2; // in game successful
}
delay(1000);
}
else
{
sendEventToOOG(65535, "Maximum game length reached!", 65535);
quit();
delay(2000);
while(me.ingame)
delay(500);
}
}
else
{
if(_ingame)
_ingame = false;
delay(1000);
locationAction(controlData.getLocation());
delay(1000);
}
}
}
function locationislobby(location)
{
if(location.id >= 1 && location.id <= 28)
{
return true
}
return false
}
생략......
###############################################################
여기까지만 하셨으면 벌써 40%는 성공하신 겁니다^^
4--------------------------------------
이제부터는 위쪽의 메인 함수를 뜯어 고쳐야 할 시간입니다
제가 이전에 추가하라고 했던 딜레이중 하나를 삭제 합니다(2번의 내용만 빼구..)
###############################################################
function main()
{
delay(1000);
var _ingame = false;
controlData.clickDelay = clickDelay;
controlData.textDelay = textDelay;
controlData.clickDelayRandom = clickDelayRandom;
controlData.textDelayRandom = textDelayRandom;
while(1)
{
if(me.ingame)
{
if(!inGameAt)
inGameAt = getTickCount();
if(getTickCount()-lastGameMade < gameMaxLength)
{
if(!_ingame)
{
_ingame = true;
sendEventToOOG(126, "In Game", parseInt(gameMinLength/1000));
lastGameStatus = 2; // in game successful
}
delay(1000);
}
else
{
sendEventToOOG(65535, "Maximum game length reached!", 65535);
quit();
delay(2000); <<--- 이런 부분이 있다면 삭제, 없다면 넘어가세요
while(me.ingame)
delay(500);
}
}
else
{
if(_ingame)
_ingame = false;
delay(1000);
locationAction(controlData.getLocation());
delay(1000);
}
}
}
################################################################
자 여기까지 따라 오셨습니까??
5--------------------------------------
위의 고쳐진 메인 함수를 다음과 같이 고칩시다 자 어디가 바뀌었을까요??
################################################################
function main()
{
delay(1000);
var _ingame = false;
controlData.clickDelay = clickDelay;
controlData.textDelay = textDelay;
controlData.clickDelayRandom = clickDelayRandom;
controlData.textDelayRandom = textDelayRandom;
while(1)
{
if(me.ingame)
{
delay(1000); //이부분 추가
if(!locationislobby(controlData.getLocation())) //<<<이부분 추가
{ //<<<이부분 추가
if(!inGameAt)
inGameAt = getTickCount();
if(getTickCount()-lastGameMade < gameMaxLength)
{
if(!_ingame)
{
_ingame = true;
sendEventToOOG(126, "In Game", parseInt(gameMinLength/1000));
lastGameStatus = 2; // in game successful
}
delay(1000);
}
else
{
sendEventToOOG(65535, "Maximum game length reached!", 65535);
quit();
while(me.ingame)
delay(500);
}
} //<<<이부분 추가
else //<<<이부분 추가
{ //<<<이부분 추가
if(_ingame) //<<<이부분 추가
_ingame = false; //<<<이부분 추가
delay(1000); //<<<이부분 추가
locationAction(controlData.getLocation()); //<<<이부분 추가
//<<<이부분 추가
delay(1000); //<<<이부분 추가
} //<<<이부분 추가
}
else
{
if(_ingame)
_ingame = false;
delay(1000);
locationAction(controlData.getLocation());
delay(1000);
}
}
}
###############################################################
여기까지 빼놓지 않고 수정하셨다면 성공입니다^^
생각보단 그렇게 어렵지 않죠??
자 왜 위처럼 고쳤는지 이해가 잘 안되시는 분을 위해 설명 들어갈께요
2단계에서 했던 내용은
제가 예전에 설명했던 바와 같이 방에 나와서 방을 만드는동작을 약간 천천히 바꾼것입니다
1초의 딜레이를 두고 방을 생성합니다
3단계에 함수 추가가 있었습니다
왠만 큼 하시는 분이라면 한눈에 아!!! 이러실꺼에요
바로 케릭이 로비에있을땐 true값을 리턴하고
그 이외의 상황(방안에서 사냥하고있는 상황이겠죠??)에서는 false값을 리턴하도록 하는 함수입니다
이 함수는 계속적인 케릭의 위치를 알아내기 위해 사용합니다
4단계
이부분을 뺀이유는 코드를 보니 이미 아래부분에
while(me.ingame)
delay(500);
위와 같은 애용으로 대기하는 부분이 있으므로 필요없다 판단 했습니다
5단계
여기가 중요한 부분입니다
NTmanager는 이 스타터의 스크립트에 씌여진대로
while(1)이라는 반복문 안의 내용을 반복적으로 수행하게 됩니다 <<반복문 1이기 때문에 무한 반복
while문 안에있는 if(me.ingame) 라는 줄이 보이시죠?? 여기서 me.ingame이 true라면 매니져는 케릭이 방에있는것으로 인식하여
이 if문 안의 명령들을 수행하게됩니다
이 if문 안의 내용은 케릭이 방안에 있고 아직 타이머가 최대 사냥시간을 넘지 않았다면
매니져에 IN GAME(~~s)라고 표시하며 계속적으로 타이머를 증가시키는 일을 합니다
그런데 이전에도 말했듯이 케릭이 방에서 빠져나올때 me.ingame를 false로 바꾸어 주는 명령이 실행되어야 하는데
렉이나 기타 알려지지 않은 오류로 인해 케릭은 방에서 나와 로비에 있지만 me.ingame가 false로 변경되지 않아
매니져는 me.ingame를 true로 인식하고 케릭이 계속 방에 있는것으로 간주하는 것 입니다..
그래서 me.ingame이 ture인지 false인지를 검사한 이 후에 me.ingame가 true인 경우에 케릭의 진짜 위치를 한번더 검사해서
진짜 위치가 로비라면 NTmanager에게 케릭이 로비에 있는걸로 인식시켜주도록 한것입니다
한마디로 IN GAME 즉 me.ingame가 true인 상태에서도 계속 케릭이 로비인지 아닌지를 검사한다는 내용이죠
(이전의 스크립트는 me.ingame가 true이면 무조껀 케릭은 방에있다 이렇게 확정되었지만 말이죠)
머 길게 설명하긴했지만 어느정도 볼줄 아는 분들이시라면 어떤 원리인지 한눈에 보실수 있으실 껍니다