📄 sorceress.d2l
字号:
else
DebugWrite("Attack returned false");
DebugWrite("CheckSelf during countess attack");
CheckSelf();
DebugWrite("CheckSelf during countess attack done");
if (layout) { // top left
if (countess.y >= 11084) { // left
if (me.y < 11084)
Teleport(bpl[0].x, bpl[0].y, 5, 5);
else
CheckEnemyBPDist(countess, bpl, true);
}
else if (countess.y <= 11055) { // right
if (me.y > 11055)
Teleport(bpr[0].x, bpr[0].y, 5, 5);
else
CheckEnemyBPDist(countess, bpr, true);
}
else { // center
if (me.y > 11084 || me.y < 11055)
Teleport(bpc[0].x, bpc[0].y, 5, 5);
else
CheckEnemyBPDist(countess, bpc, true);
}
}
else { // top right
if (countess.x <= 12548) { // left
if (me.x > 12548)
Teleport(bpl[0].x, bpl[0].y, 5, 5);
else
CheckEnemyBPDist(countess, bpl, true);
}
else if (countess.x >= 12581) { // right
if (me.x < 12581)
Teleport(bpr[0].x, bpr[0].y, 5, 5);
else
CheckEnemyBPDist(countess, bpr, true);
}
else { // center
if (me.x > 12581 || me.x < 12548)
Teleport(bpc[0].x, bpc[0].y, 5, 5);
else
CheckEnemyBPDist(countess, bpc, true, poly);
}
}
delay(50);
}
DebugWrite("Countess attack done");
return true;
}
function CharKillBaal(baal)
{
if (!baal) {
Error("Baal not detected");
DebugWrite(" * ERROR: Baal not detected");
return false;
}
if (!ChooseSkills(baal)) {
Error("Failed to choose skills for baal");
return false;
}
DebugWrite("Baal attack started");
var bp1 = new Array();
bp1[0] = new coord(15136,5897);
bp1[1] = new coord(15136,5936);
var bp2 = new Array();
bp2[0] = new coord(15152,5946);
bp2[1] = new coord(15134,5967);
bp2[2] = new coord(15108,5943);
Teleport(15166, 5900, 5);
Teleport(15137, 5897, 5);
var life = baal.hp;
var d = new Date();
var timer = d.getTime();
CheckEnemyBPDist(baal, bp1);
while(baal && baal.hp > 0) {
if (Attack(baal)) {
DebugWrite("Attack successfull");
if (baal.hp >= life) {
d = new Date();
if ((d.getTime() - timer) >= 5000)
Teleport(baal.x, baal.y, 5, 2);
}
}
if (!CheckSelf()) {// townheal
delay(50);
if (!CheckSelf()) {
DebugWrite("Going to town to heal");
// go to town to heal
var spot = null;
if (baal.y < 5936)
spot = CalcSafestSpot(bp2);
else
spot = CalcSafestSpot(bp1);
if (!spot) {
BebugWrite("No safe spot calculated");
return false;
}
Teleport(spot.x, spot.y, 5, 3);
while(me.mode == 10 || me.mode == 19)
delay(50);
delay(500);
Sc_TownHeal(true, true);
DebugWrite("Townheal done");
baal = getUnit(1, Lang.NPC.Baal);
if (!baal) {
DebugWrite("Failed to detect baal after heal");
Teleport(15135, 5939, 5, 5);
delay(250);
baal = getUnit(1, Lang.NPC.Baal);
if (!baal) {
DebugWrite("Failed to detect baal after heal and teleport");
return false;
}
}
}
}
if (baal.y < 5936)
CheckEnemyBPDist(baal, bp1, true);
else
CheckEnemyBPDist(baal, bp2, true);
delay(50);
}
DebugWrite("Baal killed");
return true;
}
function CharThroneAttack(bp)
{
Teleport(15095, 5045, 5);
var enemy = FindThroneEnemy();
while(enemy && enemy.hp > 0 && enemy.mode != 12) {
if (!BattlePointsAttack(enemy, bp))
return false;
delay(50);
enemy = FindThroneEnemy();
}
DebugWrite("Throne attack done");
return true;
}
function BattlePointsAttack(enemy, bp)
{
if (!enemy || enemy.hp <= 0 || enemy.mode == 12) {
DebugWrite("BattlePointsAttack: No enemy or dead enemy");
return true; // retrurn, continue attack
}
if (!ChooseSkills(enemy)) {
DebugWrite("ChooseSkills failed");
return false;
}
DebugWrite("Battlepoints Attack, enemy: " + enemy.name);
var life = enemy.hp;
var d = new Date();
var timer = d.getTime();
var misses = 0; // 43 misses is abort attack and retry
var test;
var as; // attack successfull
CheckEnemyBPDist(enemy, bp);
while(enemy && enemy.hp > 0 && enemy.mode != 12) {
me.overhead("Attacking " + enemy.name + "("+enemy.hp+")");
DebugWrite("Launching attack");
as = Attack(enemy);
DebugWrite("Attack returned " + as);
test = CheckEnemyBPDist(enemy, bp);
DebugWrite("Enemy distance checked, returned: " + test);
if (life <= enemy.hp) {
DebugWrite("Life higher then start life");
d = new Date();
if ((d.getTime() - timer) >= 3000) {
DebugWrite("Enemy life is higher then previous life for 3 seconds");
Teleport(enemy.x, enemy.y, 3, 3);
timer = d.getTime();
misses++;
}
if (misses >= 3) {
DebugWrite("To many misses");
return true;
}
DebugWrite("Timer check done");
}
else {
DebugWrite("Enemy life is lower");
life = enemy.hp;
d = new Date();
timer = d.getTime();
misses = 0;
DebugWrite("Updated timer and life");
}
DebugWrite("Going to check self while attacking");
if (!CheckSelf()) {
DebugWrite("Going to town to heal");
// go to town to heal
var spot = CalcSafestSpot(bp);
if (!spot) {
BebugWrite("No safe spot calculated");
return false;
}
Teleport(spot.x, spot.y, 5, 3);
while(me.mode == 10 || me.mode == 19)
delay(50);
delay(500);
Sc_TownHeal(true, true);
DebugWrite("Townheal done");
return true;
}
DebugWrite("Self check done");
delay(50);
}
DebugWrite("Battlepoints Attack done");
return true;
}
function CheckEnemyBPDist(enemy, bp, ignore_close, poly)
{
var pos = new coord(enemy);
var dist = pos.dist(me);
DebugWrite("Checking enemy distance (" + dist + "): me(" + me.x + "," + me.y + ") enemy(" + enemy.x + "," + enemy.y + ")");
if (dist > character["max_attack_dist"] || dist < character["min_attack_dist"] || (!ignore_close && FindEnemyNear(me, 5))) {
var spot = CalcNewSpot(pos, bp, poly);
if (!spot || !spot.x || !spot.y) {
Error("No Spot");
delay(2000);
DebugWrite("CheckEnemyBPDist() -> No Spot");
Abort();
}
DebugWrite("Need to move to " + spot.toString());
Teleport(spot.x, spot.y, 5);
DebugWrite("Move done me(" + me.x + "," + me.y + ")");
return true;
}
DebugWrite("Distance is ok");
return false;
}
function CalcNewSpot(pos, bp, poly)
{
if (!pos) {
DebugWrite("CalcNewSpot() -> No pos");
Abort();
}
if (!bp || !bp.length) {
DebugWrite("CalcNewSpot() -> No battlepoints");
Abort();
}
DebugWrite("Calculating new spot for pos (" + pos.x + "," + pos.y + ")");
var spots = new Array();
for (var i = 0; i < bp.length; i++) {
spots[i] = new coord(pos);
var dir = spots[i].dir(bp[i]);
spots[i].move(dir, character["max_attack_dist"] - 2);
var closest_enemy = FindClosestEnemyNear(spots[i]);
if (closest_enemy && closest_enemy.x && closest_enemy.y)
spots[i].data = spots[i].dist(closest_enemy);
else
spots[i].data = 32767; // no enemy near spot!
if (poly && !PointInPoly(poly, spots[i]))
spots[i].data = -1; // invalid point
}
var best = new coord();
for (var j = 0; j < spots.length; j++) {
if (!best.x && !best.y) {
best.set(spots[j]);
}
if (spots[j].data > best.data) {
best.set(spots[j]);
}
}
if (best.data == -1) {
DebugWrite("Best has data -1, returning (me.x,me.y)");
return new coord(me.x,me.y);
}
DebugWrite("New calculated spot: " + best.toString());
return best;
}
function CalcSafestSpot(bp)
{
if (!bp || !bp.length) {
DebugWrite("CalcNewSpot() -> No battlepoints");
Abort();
}
DebugWrite("Calculating safest spot: " + bp.length + " points");
var best = null;
for (var i = 0; i < bp.length; i++) {
if (!best) {
best = new coord(bp[i]);
var closest_enemy = FindClosestEnemyNear(best);
if (closest_enemy && closest_enemy.x && closest_enemy.y)
best.data = best.dist(closest_enemy);
else
best.data = 32767;
DebugWrite("No best, best set to: " + best.toString());
}
else {
DebugWrite("Going to check bp["+i+"]");
var closest_enemy = FindClosestEnemyNear(bp[i]);
var dist = 32767;
if (closest_enemy && closest_enemy.x && closest_enemy.y)
dist = bp[i].dist(closest_enemy);
if (dist > best.data) {
best.set(bp[i]);
best.data = dist;
DebugWrite("Best changed to: " + best.toString());
}
}
}
return best;
}
function CharDefend()
{
var e = FindEnemy();
if (e) {
var pos = new coord(e);
if (pos.dist(me) < 10) {
Attack(e);
}
}
}
function Attack(e)
{
if (!e) {
DebugWrite("Warning: Attack: no enemy");
return false;
}
var dt = new Date();
var time = dt.getTime();
// merc kill
// check static
if (character["static_field"] && ((e.hp * 100) / e.hpmax) <= 60)
character["static_field"] = false;
// dont attack when last attack still casting
var pos = new coord(e);
if (me.mode == 10)
return false;
DebugWrite("Attack: " + character["primary_skill"] + " and " + character["secondary_skill"]);
if (character["primary_skill"] && (time - character["primary_skill_time"]) >= character["primary_skill_delay"]) {
DebugWrite("Primary attack");
Sc_SetSkill(character["primary_skill"], left_hand);
e.useSkill(left_hand);
character["primary_skill_time"] = time;
delay(50);
if (me.mode != 10)
return false;
}
else if ((character["static_field"] || character["secondary_skill"]) && me.mode != 10)
{
DebugWrite("Secondary attack");
if (character["static_field"]) {
Sc_SetSkill("Static Field", right_hand);
e.useSkill(right_hand);
delay(50);
if (me.mode != 10)
return false;
}
else if (character["secondary_skill"]) {
if (character["secondary_skill"] == "Nova" && pos.dist(me) >= character["max_attack_dist"])
return false;
Sc_SetSkill(character["secondary_skill"], right_hand);
e.useSkill(right_hand);
delay(50);
if (me.mode != 10)
return false;
}
}
else
return false;
return true;
}
function ChooseSkills(e, no_secondary)
{
if (!e) {
DebugWrite("Warning: No enemy in ChooseSkills");
return false;
}
character["primary_skill"] = "";
character["secondary_skill"] = "";
var fire_immune = (e.getStat(39) > 99) ? true : false;
var light_immune = (e.getStat(41) > 99) ? true : false;
var cold_immune = (e.getStat(43) > 99) ? true : false;
// check for skills
var fire_wall = me.getSkill("Fire Wall");
var meteor = me.getSkill("Meteor");
var hydra = me.getSkill("Hydra");
var blizzard = me.getSkill("Blizzard");
var frozen_orb = me.getSkill("Frozen Orb");
// check secondary skills
var inferno = me.getSkill("Inferno");
var fire_ball = me.getSkill("Fire Ball");
var frost_nova = me.getSkill("Frost Nova");
var ice_blast = me.getSkill("Ice Blast");
var glacial_spike = me.getSkill("Glacial Spike");
var charged_bolt = me.getSkill("Charged Bolt");
var telekinesis = me.getSkill("Telekinesis");
var lightning = me.getSkill("Lightning");
var nova = me.getSkill("Nova");
var chail_lightning = me.getSkill("Chain Lightning");
character["static_field"] = me.getSkill("Static Field");
if (!character["static_field"]) character["static_field"] = false; else character["static_field"] = true;
if (!fire_wall) fire_wall = 0;
if (!meteor) meteor = 0;
if (!hydra) hydra = 0;
if (!blizzard) blizzard = 0;
if (!frozen_orb) frozen_orb = 0;
if (!inferno) inferno = 0;
if (!fire_ball) fire_ball = 0;
if (!frost_nova) frost_nova = 0;
if (!ice_blast) ice_blast = 0;
if (!glacial_spike) glacial_spike = 0;
if (!charged_bolt) charged_bolt = 0;
if (!telekinesis) telekinesis = 0;
if (!lightning) lightning = 0;
if (!nova) nova = 0;
if (!chail_lightning) chail_lightning = 0;
var ps = 0; // primary skill
var ss = 0; // secondary skill
var fire_penalty = 0;
if (e.getEnchant(6) || e.getEnchant(9) || e.getEnchant(25)) { // extra fast
fire_penalty += 3;
}
// choose primary skill
if (!cold_immune) {
if (frozen_orb && frozen_orb >= blizzard) {
character["primary_skill"] = "Frozen Orb";
ps = frozen_orb;
}
else if (blizzard) {
character["primary_skill"] = "Blizzard";
ps = blizzard;
}
}
if (!fire_immune) {
if (fire_wall && fire_wall >= meteor && fire_wall >= hydra) {
if (!ps || ps < (fire_wall - fire_penalty) || (character["primary_skill"] == "Blizzard" && ps < (fire_wall+ 5 ))) {
ps = fire_wall;
character["primary_skill"] = "Fire Wall";
}
}
else if (meteor && meteor >= fire_wall && meteor >= hydra) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -