From aa73b6f8cfa0d6129e9e24a42628c9d4a0f0884f Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 1 Feb 2024 16:18:02 +0900 Subject: [PATCH 01/10] fix 3shot/5shot infinite range --- node/server.js | 56 +++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/node/server.js b/node/server.js index ca58062..c941f87 100644 --- a/node/server.js +++ b/node/server.js @@ -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; From c4377b810cb1c25e0d89477ab65bc03f0c5b8f08 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 1 Feb 2024 16:41:52 +0900 Subject: [PATCH 02/10] fix cburst infinite range --- node/server.js | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/node/server.js b/node/server.js index c941f87..0f23417 100644 --- a/node/server.js +++ b/node/server.js @@ -2886,9 +2886,6 @@ function commence_attack(attacker, target, atype) { } else if (atype == "cburst") { var mp_cutoff = attacker.next_mp; var mp = attacker.next_mp; - if (atype == "cburst") { - mp = mp_cutoff = attacker.next_mp; - } if (attacker.mp < mp_cutoff) { attacker.socket.emit("game_response", { response: "no_mp" }); return { failed: true, reason: "no_mp", place: atype, id: target.id }; @@ -8589,37 +8586,38 @@ function init_io() { resend(target, "u+cid"); } } else if (data.name == "cburst") { - var hit = {}; - var times = 0; + var targeted = {}; var attack = null; var c_resolve = null; consume_mp(player, gSkill.mp); player.first_burst = true; player.halt = true; if (is_array(data.targets)) { - data.targets.forEach(function (t) { - // console.log(id); - var id = t[0]; - var mp = max(0, parseInt(t[1]) || 0); - if (player.mp < 20 || times > 16 || !mp) { - return; + // Only look at the first 16 targets in the array if more are provided + for (const t of data.targets.slice(0, 16)) { + const id = t[0]; + if (targeted[id]) { + continue; } - times += 1; - var target = instances[player.in].monsters[id]; + targeted[id] = true; + const mp = max(0, parseInt(t[1]) || 0); + if (mp <= 0) { + continue; + } + let target = instances[player.in].monsters[id]; if (!target) { target = instances[player.in].players[id]; } if (!target || is_invinc(target) || target.name == player.name) { - return; + continue; } - if (hit[id]) { - return; + if (isTargetTooFar(target)) { + continue; } - hit[id] = true; player.next_mp = mp; attack = commence_attack(player, target, "cburst"); if (!attack || !attack.projectile) { - return; + continue; } if (!c_resolve) { c_resolve = attack; @@ -8629,14 +8627,12 @@ function init_io() { c_resolve.pids.push(attack.pid); c_resolve.targets.push(attack.target); } - }); + } } 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; From 5b1fc357c3ba5b840bc14f7b345316cd92309837 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 1 Feb 2024 16:48:37 +0900 Subject: [PATCH 03/10] set curse range to 200 it was `min(200, attacker.range * 5 + 20)` before I mistakenly removed it in the refactor --- design/skills.py | 1 + 1 file changed, 1 insertion(+) diff --git a/design/skills.py b/design/skills.py index b8cdc2d..68beb25 100644 --- a/design/skills.py +++ b/design/skills.py @@ -810,6 +810,7 @@ skills={ "name":"Curse", "explanation":"Cursed opponents receive 20% more damage, deal 20% less damage and they slow down by 20.", "mp":400, + "range":200, "duration":5000, "cooldown":5000, "condition":"cursed", From f08e479e48f0c409604bb14dcb06dfb30595d116 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Mon, 5 Feb 2024 13:03:36 +0900 Subject: [PATCH 04/10] default to player range if no range is set --- node/server.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/node/server.js b/node/server.js index 0f23417..a3b74b1 100644 --- a/node/server.js +++ b/node/server.js @@ -8266,6 +8266,7 @@ function init_io() { // Range check const isTargetTooFar = (target) => { + // Use the range of the skill, falling back to the player range if it isn't set let range = gSkill.range || player.range; if (gSkill.range_multiplier) { range *= gSkill.range_multiplier; @@ -8288,11 +8289,8 @@ function init_io() { } return false; }; - if (target && (gSkill.range || gSkill.use_range)) { - if (isTargetTooFar(target)) { - fail_response("too_far", data.name, { dist: dist, id: target.id }); - return; - } + if (target && isTargetTooFar(target)) { + return fail_response("too_far", data.name, { dist: dist, id: target.id }); } // Consume item check From f6f6fc2f5554ae5ef74167cc35f69f1a1d9524c5 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Mon, 5 Feb 2024 13:17:05 +0900 Subject: [PATCH 05/10] add `use_range` to `mentalburst` and `supershot` for clarity --- design/skills.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/design/skills.py b/design/skills.py index 68beb25..ce9c422 100644 --- a/design/skills.py +++ b/design/skills.py @@ -644,6 +644,7 @@ skills={ "warning":"Highly unbalanced skill, could get nerfed or modified", "hostile":True, "projectile":"mentalburst", + "use_range":True, }, "quickpunch":{ "type":"skill", @@ -748,6 +749,7 @@ skills={ "pierces_immunity":True, "damage_type":"physical", "procs":True, + "use_range":True, }, "3shot":{ "type":"skill", From 3a8d8105a60c4b8c3aaf0e45a0f3c5ce0dabac31 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 15 Feb 2024 07:34:50 +0900 Subject: [PATCH 06/10] have huntersmark use same range as supershot --- design/skills.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/design/skills.py b/design/skills.py index ce9c422..4cafb54 100644 --- a/design/skills.py +++ b/design/skills.py @@ -606,6 +606,9 @@ skills={ "cooldown":10000, "target":True, "hostile":True, + "range_multiplier":3, + "range_bonus":20, + "use_range": True }, "pcoat":{ "type":"skill", From cddfefbc36cc70268336203a9dac78f26d248902 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 15 Feb 2024 07:39:32 +0900 Subject: [PATCH 07/10] Use 2x range for tangle --- design/skills.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/design/skills.py b/design/skills.py index 4cafb54..557c5fd 100644 --- a/design/skills.py +++ b/design/skills.py @@ -232,6 +232,8 @@ skills={ "cooldown":60000, "target":True, "hostile":True, + "use_range":True, + "range_multiplier":2, }, "rspeed":{ "type":"skill", From cc504fbda4176684b60684a43e6f7fdf86ad8b33 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 15 Feb 2024 07:39:41 +0900 Subject: [PATCH 08/10] use range for charm --- design/skills.py | 1 + 1 file changed, 1 insertion(+) diff --git a/design/skills.py b/design/skills.py index 557c5fd..909ab12 100644 --- a/design/skills.py +++ b/design/skills.py @@ -221,6 +221,7 @@ skills={ "cooldown":60000, "target":"monster", "hostile":True, + "use_range":True, }, "tangle":{ "type":"skill", From 348ee2d871ed7df3ac0d53b253fc1d94541aa663 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 15 Feb 2024 15:33:51 +0900 Subject: [PATCH 09/10] Add clarifying comments for what `targeted` does --- node/server.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/node/server.js b/node/server.js index a3b74b1..1560843 100644 --- a/node/server.js +++ b/node/server.js @@ -8594,10 +8594,13 @@ function init_io() { // Only look at the first 16 targets in the array if more are provided for (const t of data.targets.slice(0, 16)) { const id = t[0]; + + // Prevent attacking the same entity twice if (targeted[id]) { continue; } targeted[id] = true; + const mp = max(0, parseInt(t[1]) || 0); if (mp <= 0) { continue; @@ -8678,15 +8681,17 @@ function init_io() { if (is_array(data.ids)) { // 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)) { + // Prevent attacking the same entity twice if (targeted[id]) { - // Already targeted this monster continue; } 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) { continue; } From 4d99e3e742dc17e68d84c41c674a183aa289e772 Mon Sep 17 00:00:00 2001 From: Kent Rasmussen Date: Thu, 15 Feb 2024 15:41:11 +0900 Subject: [PATCH 10/10] consume mp even if nothing was shot for 3/5shot --- node/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/server.js b/node/server.js index 1560843..cb98f83 100644 --- a/node/server.js +++ b/node/server.js @@ -8703,7 +8703,6 @@ function init_io() { continue; } if (!c_resolve) { - consume_mp(player, gSkill.mp, target); c_resolve = attack; attack.pids = [attack.pid]; attack.targets = [attack.target]; @@ -8715,6 +8714,7 @@ function init_io() { } player.halt = false; player.to_resend = "u+cid"; + consume_mp(player, gSkill.mp, target); if (!c_resolve) { reject = { failed: true, place: data.name, reason: "no_target" }; disappearing_text(player.socket, player, "NO HITS");