Skip to content
봇관련다크 모드

쪽지로 답변 드리고 싶었는데.. 이상하게 쪽지 기능이나 정보수정 같은 기능을 하나도 이용할 수가 없네여..
마치 로그인이 안된 것처럼 계속 작동을 해서.. 머가 문젠지..;

저도 잘 아는게 없어서 많은 이야기는 못드리겠고... 대충 스크립트 흐름 보면.. 보스 공격 부분 정의는..

\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);

 }

테스트 해봤는데.. 뭐.. 얼추 보기엔.. 제대로 되는듯도...;;;
댓글 5
  • 댓글 #141245

    아.. 감사합니다.. 이제야 봤네요.. 오늘 한번 고쳐서 해봐야 할꺼 같아요 ^^ 너무 수고 하셨습니다, ^^ 바람도 많이 불고 황사도 심한데 .. 건강 조심 하세요 ^^
  • 댓글 #141248

    어아 ㅜ.ㅜ 무슨 말인지 모르겠어요 민공님 되면 저도 좀 알려주세요 ^^ diaimm 님 감사합니다~~ 제가 무지해서 ㅜ.ㅜ
  • 댓글 #141251

    commAttack.GotoDest(target.x, target.y);=> +- 4 위치 안에 있으면 같은 위치로 보구 이동 안해여 DM_MoveTo(target.x+1 , target.y+1); => 우선 텔레 가능한지 확인 후 텔레 하구 위치 확인 합니다. 무조건 텔레 한다는 뜻 +1씩을 준것은 약간 아래쪽으로 텔하라는 ... 이미 수정해서 쓰고 있지요
  • 댓글 #141254

    위의 내용은 이름이 있는 유니크 를 잡을 때만 적용되는 함수 입니다. 빠른 바알런 을 위해서는 일반 몬스터를 잡을 때로 (target.x+1 , target.y+1); 을 적용해야 한방에 죽습니다. 또한 일정 거리 이내이면 걸어서 이동후 attack을 하는데 일정 패케 이상의 햄딘 이시라면 버닝 소울, 등 .. 위 험 요소를 생각 하면 무조건 텔 후 공격 하도록 수정 해야 바알 런이 빨라 지더라구요... GotoDest 함수는 일정 범위 이내면 같은 위치로 보는것, 또한 가까우면 걸어가던가? 가물.... DM_MoveTo는 텔레스킬만 있으면 텔레 하구 위치 확인 한다는것 (무조건 텔)
권한이 없습니다.
다크 모드