햄딘(수수기준) 보스 잡다가 안맞으면 위치 바꾸도록 스크립트 약간 바꿔 봤습니다..(민공님 요...
분류
봇관련
조회 수
2,027
추천 수
2
쪽지로 답변 드리고 싶었는데.. 이상하게 쪽지 기능이나 정보수정 같은 기능을 하나도 이용할 수가 없네여..
마치 로그인이 안된 것처럼 계속 작동을 해서.. 머가 문젠지..;
저도 잘 아는게 없어서 많은 이야기는 못드리겠고... 대충 스크립트 흐름 보면.. 보스 공격 부분 정의는..
\xp2.3c_v1\scripts\libs\XP\Libs\XP_Incude.d2l 안에 있는
XP_KillBoss() 함수를 우선 호출하고 이 안에서..
...
// Detecting the boss if no target is already provided
if (arguments.length < 6) {
pTarget = DC_FindMonster( pClassID, pSpectype );
}
// If the boss is detected
if (pTarget) {
_monsterx = pTarget.x;
_monstery = pTarget.y;
var _monstername = pTarget.name;
// If the target has a enchantment i want to chicken, log and quit
if (pCheckImmunities) { XP_DoCheckImmunities( pTarget, true, pUseLoader ); }
XP_Attack( pTarget ); // << 이부분 주목하고 다시 추적..
.....
....
function XP_Attack(target) {
switch (me.classid) {
case 6: XP_AssassinBossAttack(target); break;
case 5: XP_DruidBossAttack(target); break;
case 4: XP_BarbBossAttack(target); break;
case 3: XP_PaladinBossAttack(target); break; // << 다시 추적.. 하면..
case 2: XP_NecroBossAttack(target); break;
case 1: XP_SorcBossAttack(target); break;
case 0: XP_AmazonBossAttack(target); break;
}
}
.....
결국 다음 함수가 나옵니다..
function XP_PaladinBossAttack(target) {
// 변수 정의
var _loop=0;
var _prevhp = target.hp;
// 무엇인가 종료를 위해?
_XP_AttackCompleted=0;
// 목표물 근처로 이동(단 홀리 볼트나 Fist of the Heavens가 아닐때만) - move to get close to the target
if (XP_PallyAttack != 101 || XP_PallyAttack != 121) { commAttack.GotoDest(target.x,target.y); }
// 먼가 위치 지정 하는 듯..;
_XP_EndPosition = new XP_Coord(me.x,me.y);
// 이뮨 체크
// If the target is immune to physical attacks, set the alternate skills
if (target.getStat(36) > 99) {
XP_PallyAttack = XP_PallyPhysAttack;
XP_PallyAura = XP_PallyPhysAura;
}
// 오른쪽에 오오라 지정 하기 - Set aura on the right hand
DC_PutSkill(XP_PallyAura,0);
// 타겟의 피가 0보다 큰 이상 계속 한다.
while (target.hp > 0) {
// 타겟이 544 이고.... 기타등등 -- 죽은경우에 대한 것인듯.. ==> 아템 줍기
if(target.classid==544 && Math.round(target.hp / 1.28)<=3){ DSN_PickItems(); }
// 홀리 볼트 공격 - Holy Bolt attack
if (XP_PallyAttack == 101) {
// Only attack if target is undead
if (getBaseStat(1,target.classid,16) || getBaseStat(1,target.classid,17)) {
DC_DoCast(XP_PallyAttack,2,target);
}
// Heal player/merc instead
else { XP_Healing(); }
}
else
{ // 일반 공격 - Normal attack
DC_DoCast(XP_PallyAttack,2,target);
}
// 여기서 루프 수를 증가 했다. (왜? 한번 공격 했으니까..)
_loop +=1;
// 루프 수가 2 이상이고, 홀리볼트나 피스트 오브 헤븐 공격이 아니라면...
if (_loop > 2 && (XP_PallyAttack != 101 || XP_PallyAttack != 121)) {
// 여전히 타겟을 놓치고 있다...(왜? ) - still missing target
// 타겟의 피 > _prevhp(타겟의 초기 피의 양) - 2000
// 즉 타겟으 ㅣ피가 타겟의 초기피의 양에서 2000 뺀 것 보다 달지 않았다면
// 맞고 있지 않은 것으로 간주한다. ( 뎀지가 적어도 2000 이상이어야 유효하다는 결론?)
if (target.hp > (_prevhp-2000)) {
// 타겟을 향해 이동한다. - Move to the target
commAttack.GotoDest(target.x, target.y);
// 오른쪽 스킬에 오오라를 지정한다.
// Set the aura on the right hand
DC_PutSkill(XP_PallyAura,0);
}
// 이제 다시 때리기 시작할 것이므로.. 루프를 0으로 초기화 하자.
_loop = 0;
}
else
{ // 제대로 맞고 있는경우
// 위치를 체크 한다.(잘 되는가 점검하는건가.. 아무튼. .무엇인가 필요해서 있을듯..;)
DM_CheckPosition(target.x, target.y);
}
// 여기 까지 왔다면 타겟의 초기 피를 바꾸어 주자..
// 이 라인을 통해 타겟에 대한 변화에 능동적으로 대응할 수 있을듯.. - Target is hit so reset the prevhp var
if (target.hp < _prevhp) { _prevhp = target.hp; }
// 공걱 점검( 아무튼... 있다 치고.. )
XP_CheckAttacks();
// 있다 치고..
if (XP_CheckUtil(target)) { return; }
// 이것도..;
XP_CheckDefense();
}
}
한글 주석은 영어 주석을 토대로 나름대로 적어 보았습니다.. 민공 님이 말씀하신 내용은 아무래도..
// 여전히 타겟을 놓치고 있다...(왜? ) - still missing target
// 타겟의 피 > _prevhp(타겟의 초기 피의 양) - 2000
// 즉 타겟으 ㅣ피가 타겟의 초기피의 양에서 2000 뺀 것 보다 달지 않았다면
// 맞고 있지 않은 것으로 간주한다. ( 뎀지가 적어도 2000 이상이어야 유효하다는 결론?)
if (target.hp > (_prevhp-2000)) {
// 타겟을 향해 이동한다. - Move to the target
commAttack.GotoDest(target.x, target.y);
// 오른쪽 스킬에 오오라를 지정한다.
// Set the aura on the right hand
DC_PutSkill(XP_PallyAura,0);
}
이 부분에서 변경 해야 할 것 같습니다.
이 스크립트 에서 좌표에 대한 개념을 확실하게 잡을 수 없어서 무어라 꼭 집어 말씀 드리긴 머하지만..
다음과 같이 한번 바꾸어 보는 것도..
// 여전히 타겟을 놓치고 있다...(왜? ) - still missing target
// 타겟의 피 > _prevhp(타겟의 초기 피의 양) - 2000
// 즉 타겟으 ㅣ피가 타겟의 초기피의 양에서 2000 뺀 것 보다 달지 않았다면
// 맞고 있지 않은 것으로 간주한다. ( 뎀지가 적어도 2000 이상이어야 유효하다는 결론?)
//if (target.hp > (_prevhp-2000)) {
if (target.hp >= _prevhp) {// 이전 피보다 많거나 같다면..
// 아마도.. 다른 파티원이 공격을 해서 이전 피보다 작아 졌다면..
// 자신이 때리고 있지 않더라도 움직이지 않겠쬬......
// 혹시나 혼자 사냥중이라면.. 맞지 않는 경우에만 움직일듯..
///////////////////////////////////////////////////////////////////////////
// 혹시나 해머와 같은 경우 각도의 문제일 수도 있는 것을 감안.. 다른 곳으로 한번
// 이동했다가 다시 와서 시도해 보자..
// \xp2.3c_v1\scripts\libs\common\d2jsp-move.d2l 참고
// 타겟의 위치에서 x, y 좌표 에 대해 각각 랜덤 +/-4의 범위로 이동한다.
///////////////////////////////////////////////////////////////////////////
DM_MoveTo(target.x+rnd(-4,4) , target.y+rnd(-4,4));
///////////////////////////////////////////////////////////////////////////
// 다시 타겟을 향해 이동한다. - Move to the target
///////////////////////////////////////////////////////////////////////////
commAttack.GotoDest(target.x, target.y);
// 타겟을 향해 이동한다. - Move to the target
//commAttack.GotoDest(target.x, target.y);
// 오른쪽 스킬에 오오라를 지정한다.
// Set the aura on the right hand
DC_PutSkill(XP_PallyAura,0);
}
테스트 해봤는데.. 뭐.. 얼추 보기엔.. 제대로 되는듯도...;;;