fix 3shot/5shot infinite range

This commit is contained in:
Kent Rasmussen
2024-02-15 07:35:32 +09:00
parent c71e8387a2
commit aa73b6f8cf
+26 -30
View File
@@ -8268,7 +8268,7 @@ function init_io() {
}
// Range check
if (target && (gSkill.range || gSkill.use_range)) {
const isTargetTooFar = (target) => {
let range = gSkill.range || player.range;
if (gSkill.range_multiplier) {
range *= gSkill.range_multiplier;
@@ -8283,12 +8283,19 @@ function init_io() {
const dist = distance(player, target);
if (dist > range + player.xrange) {
return fail_response("too_far", data.name, { dist: dist, id: target.id });
return true;
}
if (dist > range) {
// xrange was used, reduce it by however much we used
player.xrange -= dist - range;
}
return false;
};
if (target && (gSkill.range || gSkill.use_range)) {
if (isTargetTooFar(target)) {
fail_response("too_far", data.name, { dist: dist, id: target.id });
return;
}
}
// Consume item check
@@ -8671,40 +8678,33 @@ function init_io() {
xy_emit(player, "ui", { type: data.name });
} else if (data.name == "3shot" || data.name == "5shot") {
player.halt = true;
var times = 0;
var hit = {};
var reftarget = null;
var targets = 3;
var attack = null;
var c_resolve = null;
if (data.name == "5shot") {
targets = 5;
}
const targeted = {};
let c_resolve = null;
//console.log(data.ids);
if (is_array(data.ids)) {
data.ids.forEach(function (id) {
if (times >= targets) {
return;
// Only look at the first Xshot targets in the array if more are provided
for (const id of data.ids.slice(0, data.name === "5shot" ? 5 : 3)) {
if (targeted[id]) {
// Already targeted this monster
continue;
}
times += 1;
var target = instances[player.in].monsters[id];
targeted[id] = true;
target = instances[player.in].monsters[id];
if (!target) {
target = instances[player.in].players[id];
}
if (!target || is_invinc(target) || target.name == player.name) {
attack = { failed: true, place: data.name, reason: "no_target" };
return;
continue;
}
if (hit[id]) {
return;
if (isTargetTooFar(target)) {
continue;
}
hit[id] = true;
attack = commence_attack(player, target, data.name);
const attack = commence_attack(player, target, data.name);
if (!attack || !attack.projectile) {
return;
continue;
}
if (!c_resolve) {
reftarget = target;
consume_mp(player, gSkill.mp, target);
c_resolve = attack;
attack.pids = [attack.pid];
attack.targets = [attack.target];
@@ -8712,16 +8712,12 @@ function init_io() {
c_resolve.pids.push(attack.pid);
c_resolve.targets.push(attack.target);
}
// if(times==1 && attack==null) times=40;
});
}
}
consume_mp(player, gSkill.mp, reftarget);
player.halt = false;
player.to_resend = "u+cid";
if (!c_resolve) {
if (attack) {
reject = attack;
}
reject = { failed: true, place: data.name, reason: "no_target" };
disappearing_text(player.socket, player, "NO HITS");
} else {
resolve = c_resolve;