diff --git a/scripts/_test/scripts/engine/debug_addobj.rs2 b/scripts/_test/scripts/engine/debug_addobj.rs2 index eaaefc908a..5db6dc3eb8 100644 --- a/scripts/_test/scripts/engine/debug_addobj.rs2 +++ b/scripts/_test/scripts/engine/debug_addobj.rs2 @@ -7,6 +7,12 @@ if (p_finduid(uid) = true) { @please_finish; } +// Drops a pile of 20 cowhides on the player's own tile for spam-click +// interaction testing (MoveClick/OpObj packet-split repro). +[debugproc,dropcowhides] +obj_add(coord, cow_hide, 20, ^lootdrop_duration); +mes("Dropped 20 cowhides on your tile."); + [debugproc,addobj2](int $size) def_int $half = calc(($size / 2) * -1); diff --git a/scripts/areas/area_desert/scripts/desert_heat.rs2 b/scripts/areas/area_desert/scripts/desert_heat.rs2 index 413f0f3da0..5208c51189 100644 --- a/scripts/areas/area_desert/scripts/desert_heat.rs2 +++ b/scripts/areas/area_desert/scripts/desert_heat.rs2 @@ -115,7 +115,7 @@ if(inv_total(inv, water_skin0) > 0) { mes("You should get a waterskin for any travelling in the desert."); } mes("You start dying of thirst while you're in the desert."); -queue(damage_player, 0, ~random_range(1, 10)); +~queue_damage_player(0, ~random_range(1, 10)); ~calculate_desertheat_timer; [mapzoneexit,0_49_46] ~clear_desertheat_timer; diff --git a/scripts/areas/area_draynor/scripts/manor_vines.rs2 b/scripts/areas/area_draynor/scripts/manor_vines.rs2 index 19aaa0c705..9f66a1dd4e 100644 --- a/scripts/areas/area_draynor/scripts/manor_vines.rs2 +++ b/scripts/areas/area_draynor/scripts/manor_vines.rs2 @@ -9,4 +9,4 @@ if(inzone(0_48_52_40_8, movecoord(0_48_52_40_8, 9, 0, 9), coord) = false) { mes("A vine whips out and attacks you!"); spotanim_map(whippingplant_attack, coord, 0, 0); sound_synth(nasty_tree_attack, 0, 0); -queue(damage_player, 0, 1); +~queue_damage_player(0, 1); diff --git a/scripts/areas/area_kalphite/scripts/kalphite_queen.rs2 b/scripts/areas/area_kalphite/scripts/kalphite_queen.rs2 index 10e4cb3916..95d6a8ec38 100644 --- a/scripts/areas/area_kalphite/scripts/kalphite_queen.rs2 +++ b/scripts/areas/area_kalphite/scripts/kalphite_queen.rs2 @@ -113,7 +113,7 @@ if ($duration = 0) { // first target } // mes("Distance: , delay: "); anim(%com_defendanim, $duration); -queue(combat_damage_player, $queue_delay, $damage); +~queue_combat_damage_player($queue_delay, $damage); queue*(playerhit_n_retaliate, $queue_delay)(npc_uid); return(coord, $duration, $total_distance); @@ -142,7 +142,7 @@ while (huntnext = true & $i < 5) { // up to 5? https://youtu.be/ZHaxxMq3nVI?list } $duration = ~player_projectile(movecoord(npc_coord, 2, 0, 2), coord, uid, kalphite_spine, 30, 31, 0, 20, 0, 11, 5); - queue(combat_damage_player, divide($duration, 30), $damage); + ~queue_combat_damage_player(divide($duration, 30), $damage); queue*(playerhit_n_retaliate, divide($duration, 30))(npc_uid); sound_synth(kalphite_queen_spines, 0, 0); $i = add($i, 1); @@ -221,7 +221,7 @@ while (huntnext = true & $i < 5) { // up to 5? https://youtu.be/ZHaxxMq3nVI?list } $duration = ~player_projectile(movecoord(npc_coord, 2, 0, 2), coord, uid, kalphite_queen_spine, 30, 31, 0, 20, 0, 11, 5); - queue(combat_damage_player, divide($duration, 30), $damage); + ~queue_combat_damage_player(divide($duration, 30), $damage); queue*(playerhit_n_retaliate, divide($duration, 30))(npc_uid); sound_synth(kalphite_queen_spines, 0, 0); $i = add($i, 1); diff --git a/scripts/areas/area_mortmyre/scripts/vampire.rs2 b/scripts/areas/area_mortmyre/scripts/vampire.rs2 index a5141944ed..1174c2f282 100644 --- a/scripts/areas/area_mortmyre/scripts/vampire.rs2 +++ b/scripts/areas/area_mortmyre/scripts/vampire.rs2 @@ -121,4 +121,4 @@ if (npc_stat(hitpoints) = 0) { ~npc_set_attack_vars; queue*(playerhit_n_retaliate, 0)(npc_uid); -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); diff --git a/scripts/areas/area_mortmyre/scripts/vampire_leech.rs2 b/scripts/areas/area_mortmyre/scripts/vampire_leech.rs2 index f446823742..ce187289b2 100644 --- a/scripts/areas/area_mortmyre/scripts/vampire_leech.rs2 +++ b/scripts/areas/area_mortmyre/scripts/vampire_leech.rs2 @@ -43,7 +43,7 @@ if (npc_stat(hitpoints) = 0) { ~npc_set_attack_vars; queue*(playerhit_n_retaliate, 0)(npc_uid); -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); [proc,leech_reduce_stats] if (random(5) = 0) { diff --git a/scripts/areas/area_wilderness/scripts/king_black_dragon.rs2 b/scripts/areas/area_wilderness/scripts/king_black_dragon.rs2 index ebf3b07b51..5a8eea492d 100644 --- a/scripts/areas/area_wilderness/scripts/king_black_dragon.rs2 +++ b/scripts/areas/area_wilderness/scripts/king_black_dragon.rs2 @@ -164,7 +164,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { mes("You're horribly burnt by the dragon's fiery breath!"); // https://youtu.be/R3ozXHcQkgs?list=PLn23LiLYLb1bYAFU3Vdk3N9niuHs-b-4-&t=78 } } -queue(combat_damage_player, calc($duration / 30), $damage); +~queue_combat_damage_player(calc($duration / 30), $damage); queue*(playerhit_n_retaliate, calc($duration / 30))(npc_uid); ~npc_set_attack_vars; // ------------ @@ -190,7 +190,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { } } -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); ~npc_set_attack_vars; @@ -221,7 +221,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { queue(poison_player, 0, 36); // poison the player starting at 8 damage } } -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); ~npc_set_attack_vars; @@ -263,7 +263,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { } } } -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); ~npc_set_attack_vars; // ------------ @@ -298,7 +298,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { queue(kbd_freeze_player, 0, 10); // freeze the player } } -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); ~npc_set_attack_vars; diff --git a/scripts/general_use/scripts/haybales.rs2 b/scripts/general_use/scripts/haybales.rs2 index 471b639537..5eadec598d 100644 --- a/scripts/general_use/scripts/haybales.rs2 +++ b/scripts/general_use/scripts/haybales.rs2 @@ -19,7 +19,7 @@ anim(human_pickupfloor, 0); p_delay(2); def_int $rand = random(100); if ($rand < 2) { - queue(damage_player, 0, 1); + ~queue_damage_player(0, 1); ~chatplayer("Ow! There's something sharp in there!"); } else if ($rand < 12) { inv_add(inv, needle, 1); diff --git a/scripts/macro events/scripts/general/macro_event_drunken_dwarf.rs2 b/scripts/macro events/scripts/general/macro_event_drunken_dwarf.rs2 index 7e390a0e61..2bd8a10380 100644 --- a/scripts/macro events/scripts/general/macro_event_drunken_dwarf.rs2 +++ b/scripts/macro events/scripts/general/macro_event_drunken_dwarf.rs2 @@ -107,5 +107,5 @@ if (randominc($attack_roll) > randominc($defence_roll)) { } if_close; // close the player interface when taking a hit. anim(%com_defendanim, 60); -queue(combat_damage_player, 1, $damage); +~queue_combat_damage_player(1, $damage); queue*(playerhit_n_retaliate, 1)(npc_uid); diff --git a/scripts/macro events/scripts/mining/macro_event_gas.rs2 b/scripts/macro events/scripts/mining/macro_event_gas.rs2 index ce65505bff..5eade5c002 100644 --- a/scripts/macro events/scripts/mining/macro_event_gas.rs2 +++ b/scripts/macro events/scripts/mining/macro_event_gas.rs2 @@ -40,7 +40,7 @@ if (%macro_gas_counter < 4) { anim(null, 0); sound_synth(gas_explosion, 0, 0); spotanim_map(firewave_impact, loc_coord, 92, 0); -queue(damage_player, 0, 10); +~queue_damage_player(0, 10); %macro_gas_counter = 0; mes("A spark from your pickaxe ignites the gas!"); // https://imgur.com/Rjj4JqR diff --git a/scripts/macro events/scripts/mining/macro_event_rock_golem.rs2 b/scripts/macro events/scripts/mining/macro_event_rock_golem.rs2 index b63d23a593..76abd1b9b1 100644 --- a/scripts/macro events/scripts/mining/macro_event_rock_golem.rs2 +++ b/scripts/macro events/scripts/mining/macro_event_rock_golem.rs2 @@ -62,7 +62,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { if (~check_protect_prayer(^melee_style) = true) { $damage = 0; } -queue(combat_damage_player, calc($delay/60), $damage); +~queue_combat_damage_player(calc($delay/60), $damage); queue*(playerhit_n_retaliate, calc($delay/60))(npc_uid); %npc_action_delay = add(map_clock, 4); ~npc_set_attack_vars; diff --git a/scripts/macro events/scripts/thieving/macro_event_poisonous_gas.rs2 b/scripts/macro events/scripts/thieving/macro_event_poisonous_gas.rs2 index 72be453cc4..3f55f386a2 100644 --- a/scripts/macro events/scripts/thieving/macro_event_poisonous_gas.rs2 +++ b/scripts/macro events/scripts/thieving/macro_event_poisonous_gas.rs2 @@ -31,7 +31,7 @@ if (loc_find(%macro_event_target_coord, chest_macro_gas) = true) { // set active // todo: figure out the mes for this thing sound_synth(gas_hiss, 0, 0); def_int $random_poison_damage = ~random_range(2, 3); - queue(poison_damage, 0, $random_poison_damage); // poison damage doesnt actually poison, its just a green hitsplat + queue(poison_damage, 0, ~clamp_hit($random_poison_damage)); // poison damage doesnt actually poison, its just a green hitsplat } settimer(poison_gas, 4); } else { diff --git a/scripts/minigames/game_agilityarena/scripts/agilityarena_clerk.rs2 b/scripts/minigames/game_agilityarena/scripts/agilityarena_clerk.rs2 index b60ea2418a..0b0b0c4909 100644 --- a/scripts/minigames/game_agilityarena/scripts/agilityarena_clerk.rs2 +++ b/scripts/minigames/game_agilityarena/scripts/agilityarena_clerk.rs2 @@ -115,7 +115,7 @@ else if(coordx($dest) < coordx(coord)) $dir = ^exact_east; mes("You were hit by the saw blade!"); anim(human_stumble_back, 30); p_exactmove(coord, $dest, 30, 56, $dir); -queue(damage_player, 0, calc((stat(hitpoints) * 5 / 100) + 2)); +~queue_damage_player(0, calc((stat(hitpoints) * 5 / 100) + 2)); [proc,random_fixed_bridge]()(loc) switch_int(random(3)) { diff --git a/scripts/minigames/game_gnomeball/scripts/gnome_baller.rs2 b/scripts/minigames/game_gnomeball/scripts/gnome_baller.rs2 index e3b796b8f5..bb60d61647 100644 --- a/scripts/minigames/game_gnomeball/scripts/gnome_baller.rs2 +++ b/scripts/minigames/game_gnomeball/scripts/gnome_baller.rs2 @@ -28,7 +28,7 @@ npc_changetype_keepall(npc_param(gnome_hasball), ^max_32bit_int); // perm? npc_anim(midget_human_tackle, 0); p_stopaction; -queue(damage_player, 0, add(random(2), 1)); +~queue_damage_player(0, add(random(2), 1)); anim(human_tackled, 0); inv_delslot(worn, ^wearpos_rhand); diff --git a/scripts/minigames/game_mortton/scripts/mortton_shades.rs2 b/scripts/minigames/game_mortton/scripts/mortton_shades.rs2 index 960f498367..4fd2634d11 100644 --- a/scripts/minigames/game_mortton/scripts/mortton_shades.rs2 +++ b/scripts/minigames/game_mortton/scripts/mortton_shades.rs2 @@ -172,7 +172,7 @@ if (~check_protect_prayer(^melee_style) = true) { //OSRS moved this to inside the hit check at some point after ~2021? //In all old videos it always shows the hitsplat, even if the player does not actively start combat / retaliate because the attack missed. //https://youtu.be/Cgfa0ebrSac?si=zvUg4j1hTfAje3Bb&t=73 -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); if ($damage > 0) { spotanim_pl(shade_attack, 0, 0); diff --git a/scripts/minigames/game_trawler/scripts/trawler_sink.rs2 b/scripts/minigames/game_trawler/scripts/trawler_sink.rs2 index eaccfa3080..ad11b8f339 100644 --- a/scripts/minigames/game_trawler/scripts/trawler_sink.rs2 +++ b/scripts/minigames/game_trawler/scripts/trawler_sink.rs2 @@ -61,7 +61,7 @@ cam_reset; if_close; p_teleport(^trawler_escape); ~update_all(null); -queue(damage_player, 0, 2); +~queue_damage_player(0, 2); mes("You make it to the shore tired and weary."); // rs3 is mes. Also https://youtu.be/sl6i7lK_re0?t=78 diff --git a/scripts/npc/scripts/dragon.rs2 b/scripts/npc/scripts/dragon.rs2 index 66473a5677..2ee8de3a45 100644 --- a/scripts/npc/scripts/dragon.rs2 +++ b/scripts/npc/scripts/dragon.rs2 @@ -127,7 +127,7 @@ if (map_clock < %dragonresist) { } def_int $damage = randominc(max($maxhit, 0)); -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); %npc_action_delay = add(map_clock, 4); ~npc_set_attack_vars; diff --git a/scripts/player/scripts/consumption/nightshade.rs2 b/scripts/player/scripts/consumption/nightshade.rs2 index 3d1baddfb3..05b50bf15a 100644 --- a/scripts/player/scripts/consumption/nightshade.rs2 +++ b/scripts/player/scripts/consumption/nightshade.rs2 @@ -2,5 +2,5 @@ inv_delslot(inv, last_slot); mes("You eat the nightshade..."); mes("The nightshade was highly poisonous."); -queue(damage_player, 0, 15); +~queue_damage_player(0, 15); ~chatplayer("Ahhhh! What have I done!"); diff --git a/scripts/player/scripts/damage.rs2 b/scripts/player/scripts/damage.rs2 index cc8fb4a126..f5e6f1fb6c 100644 --- a/scripts/player/scripts/damage.rs2 +++ b/scripts/player/scripts/damage.rs2 @@ -20,6 +20,26 @@ if (stat(hitpoints) = 0){ [queue,damage_player](int $amount) ~damage_self($amount); +// Clamps an incoming hit to the target's current hitpoints at ENQUEUE time. +// This is what enables "tick eating": the damage is frozen to the victim's hp +// the moment the hit is rolled, so healing before it lands lets them survive. +// Must be called at the enqueue site (not inside the queue handler, which runs +// at land time). ~clamp_hit operates on the active player; ~.clamp_hit on the +// secondary (for player-vs-player and other .queue'd hits). +[proc,clamp_hit](int $damage)(int) +return(min($damage, stat(hitpoints))); + +[proc,.clamp_hit](int $damage)(int) +return(min($damage, .stat(hitpoints))); + +// Enqueue helpers for the generic self-damage queue, clamped at enqueue time. +// Prefer these over a raw queue(damage_player, ...) so the clamp can't be forgotten. +[proc,queue_damage_player](int $delay, int $amount) +queue(damage_player, $delay, ~clamp_hit($amount)); + +[proc,.queue_damage_player](int $delay, int $amount) +.queue(damage_player, $delay, ~.clamp_hit($amount)); + [proc,human_hit_sound] def_int $rand; def_synth $sound; diff --git a/scripts/quests/quest_ball/scripts/quest_ball.rs2 b/scripts/quests/quest_ball/scripts/quest_ball.rs2 index 43a1894eb7..5c2b253ae8 100644 --- a/scripts/quests/quest_ball/scripts/quest_ball.rs2 +++ b/scripts/quests/quest_ball/scripts/quest_ball.rs2 @@ -32,7 +32,7 @@ if($leaving ! true & (%ballquest < ^ball_started | %ballquest = ^ball_complete)) [oploc1,_ball_irongate] if(inv_total(worn, leather_gloves) = 0) { - queue(damage_player, 0, calc((stat(hitpoints) / 10) + 1)); + ~queue_damage_player(0, calc((stat(hitpoints) / 10) + 1)); ~mesbox("As your bare hands touch the gate you feel a shock."); return; } @@ -188,7 +188,7 @@ while (npc_findnext = true) { stat_sub(attack, 1, 5); stat_sub(defence, 1, 5); ~npc_retaliate(0); - queue(damage_player, 0, calc(1 + ((stat(hitpoints) * 5) / 100))); + ~queue_damage_player(0, calc(1 + ((stat(hitpoints) * 5) / 100))); return; } } diff --git a/scripts/quests/quest_chompybird/scripts/bloated_toad.rs2 b/scripts/quests/quest_chompybird/scripts/bloated_toad.rs2 index 055aaada7d..39c876bde4 100644 --- a/scripts/quests/quest_chompybird/scripts/bloated_toad.rs2 +++ b/scripts/quests/quest_chompybird/scripts/bloated_toad.rs2 @@ -126,5 +126,5 @@ while (.huntnext = true) { .sound_synth(toad_burst, 0, 20); // is damage random per-player or per-toad? - .queue(damage_player, calc(random(1) + 1), 0); + ~.queue_damage_player(calc(random(1) + 1), 0); } diff --git a/scripts/quests/quest_dragon/scripts/elvarg.rs2 b/scripts/quests/quest_dragon/scripts/elvarg.rs2 index 5b6efd205e..677b3c0c69 100644 --- a/scripts/quests/quest_dragon/scripts/elvarg.rs2 +++ b/scripts/quests/quest_dragon/scripts/elvarg.rs2 @@ -78,7 +78,7 @@ def_int $damage = randominc($maxhit); // not sure if this was a thing, but this video has it https://youtu.be/ucaYfz3ihWs?list=PLn23LiLYLb1aqrojPTi1_Np81LJku2Nd0&t=130 stat_drain(prayer, 0, 10); // 10% -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); ~npc_set_attack_vars; @@ -100,7 +100,7 @@ def_int $damage = randominc($maxhit); // not sure if this was a thing, but this video has it https://youtu.be/ucaYfz3ihWs?list=PLn23LiLYLb1aqrojPTi1_Np81LJku2Nd0&t=130 stat_drain(prayer, 0, 10); // 10% -queue(combat_damage_player, calc($duration / 30), $damage); +~queue_combat_damage_player(calc($duration / 30), $damage); queue*(playerhit_n_retaliate, calc($duration / 30))(npc_uid); ~npc_set_attack_vars; diff --git a/scripts/quests/quest_dragon/scripts/melzar_the_mad.rs2 b/scripts/quests/quest_dragon/scripts/melzar_the_mad.rs2 index 789eb5558f..bb001d46f4 100644 --- a/scripts/quests/quest_dragon/scripts/melzar_the_mad.rs2 +++ b/scripts/quests/quest_dragon/scripts/melzar_the_mad.rs2 @@ -88,7 +88,7 @@ if (~npc_player_hit_roll(^magic_style) = true & ~check_protect_prayer(^magic_sty $damage = randominc($maxhit); } if ($damage > 0) { - queue(combat_damage_player, 0, $damage); + ~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); } %npc_action_delay = add(map_clock, $attackspeed); diff --git a/scripts/quests/quest_druidspirit/scripts/ghast.rs2 b/scripts/quests/quest_druidspirit/scripts/ghast.rs2 index ddab1ea8fa..3be3cfd74d 100644 --- a/scripts/quests/quest_druidspirit/scripts/ghast.rs2 +++ b/scripts/quests/quest_druidspirit/scripts/ghast.rs2 @@ -28,7 +28,7 @@ if($rand < 3) { npc_say("Oouuaarrr!"); if(~ghast_check_food = false) { mes("A supernatural force draws energy from you."); - queue(damage_player, 0, ~random_range(1,3)); // this doesnt put you in combat + ~queue_damage_player(0, ~random_range(1,3)); // this doesnt put you in combat } } else { npc_say("OOooooohhh"); diff --git a/scripts/quests/quest_hero/scripts/objs/fire_feather.rs2 b/scripts/quests/quest_hero/scripts/objs/fire_feather.rs2 index 1d5afffd0a..822c95b5c3 100644 --- a/scripts/quests/quest_hero/scripts/objs/fire_feather.rs2 +++ b/scripts/quests/quest_hero/scripts/objs/fire_feather.rs2 @@ -4,7 +4,7 @@ if (%heroquest = ^hero_not_started) { return; } if (inv_total(worn, ice_gloves) = 0) { - queue(damage_player, 0, calc((stat(hitpoints) / 8) + 1)); // OSRS wiki says "about 1/8 of current hp damage" + ~queue_damage_player(0, calc((stat(hitpoints) / 8) + 1)); // OSRS wiki says "about 1/8 of current hp damage" p_delay(1); mes("It is too hot to take. You need something cold to pick it up with."); say("Ouch!"); diff --git a/scripts/quests/quest_horror/scripts/horror_dagannoth.rs2 b/scripts/quests/quest_horror/scripts/horror_dagannoth.rs2 index f168c0c24b..a44c0bd5ed 100644 --- a/scripts/quests/quest_horror/scripts/horror_dagannoth.rs2 +++ b/scripts/quests/quest_horror/scripts/horror_dagannoth.rs2 @@ -105,8 +105,8 @@ if (~check_protect_prayer(^ranged_style) = true) { $damage2 = 0; } anim(%com_defendanim, $duration); -queue(combat_damage_player, calc($duration / 30), $damage); -if($double_roll = ^true) queue(combat_damage_player, calc($duration / 30), $damage2); +~queue_combat_damage_player(calc($duration / 30), $damage); +if($double_roll = ^true) ~queue_combat_damage_player(calc($duration / 30), $damage2); queue*(playerhit_n_retaliate, calc($duration / 30))(npc_uid); ~npc_set_attack_vars; diff --git a/scripts/quests/quest_itwatchtower/scripts/ogre_shaman.rs2 b/scripts/quests/quest_itwatchtower/scripts/ogre_shaman.rs2 index d1bd9574f0..0452ae172a 100644 --- a/scripts/quests/quest_itwatchtower/scripts/ogre_shaman.rs2 +++ b/scripts/quests/quest_itwatchtower/scripts/ogre_shaman.rs2 @@ -1,7 +1,7 @@ [opnpc1,ogre_shaman] mes("A magic blast comes from the shaman."); mes("You are badly injured by the blast."); -queue(damage_player, 0, 20); // this is strongqueued on osrs for some reason +~queue_damage_player(0, 20); // this is strongqueued on osrs for some reason ~chatnpc("Grr! How dare you talk to us.|We will destroy you!"); [ai_queue2,ogre_shaman] diff --git a/scripts/quests/quest_itwatchtower/scripts/quest_itwatchtower.rs2 b/scripts/quests/quest_itwatchtower/scripts/quest_itwatchtower.rs2 index 9dcdf2ee7a..28f9436cc1 100644 --- a/scripts/quests/quest_itwatchtower/scripts/quest_itwatchtower.rs2 +++ b/scripts/quests/quest_itwatchtower/scripts/quest_itwatchtower.rs2 @@ -334,7 +334,7 @@ sound_synth(climb_wall, 0, 0); mes("You feel strangely heavier..."); inv_del(inv, rockcake, 1); // on OSRS if you have 5 HP or less it will do hp / 2 instead to prevent death -queue(damage_player, 0, 4); +~queue_damage_player(0, 4); ~chatplayer("Ow! I nearly broke a tooth!"); [oploc1,shuttanothchest1] diff --git a/scripts/quests/quest_legends/scripts/nezikchened.rs2 b/scripts/quests/quest_legends/scripts/nezikchened.rs2 index fbf9ee8ee0..f545bcc9a4 100644 --- a/scripts/quests/quest_legends/scripts/nezikchened.rs2 +++ b/scripts/quests/quest_legends/scripts/nezikchened.rs2 @@ -96,7 +96,7 @@ if(inzone(0_37_73_0_0, 0_37_73_63_63, coord) = true & %legendsquest = ^legends_r mes("But you neatly manage to dodge the attack."); } else { mes("The dagger hits you with an agonising blow."); - queue(damage_player, 0, random(19)); // TODO: how much damage can this do? + ~queue_damage_player(0, random(19)); // TODO: how much damage can this do? npc_say("Ha, ha, ha... feel my power!"); } %npc_int = 1; diff --git a/scripts/quests/quest_legends/scripts/quest_legends.rs2 b/scripts/quests/quest_legends/scripts/quest_legends.rs2 index 6c10fc0088..38ea6ad2a9 100644 --- a/scripts/quests/quest_legends/scripts/quest_legends.rs2 +++ b/scripts/quests/quest_legends/scripts/quest_legends.rs2 @@ -1603,7 +1603,7 @@ if(testbit(%legends_bits, ^legends_drank_bravery_potion) = ^true) { mes("You slip off the rope and fall..."); p_delay(1); say("Ahhhhhhhhhhhh!"); - queue(damage_player, 0, calc(stat_base(hitpoints) / 3)); + ~queue_damage_player(0, calc(stat_base(hitpoints) / 3)); } else { mes("And although fear stabs at your heart."); say("Gulp!"); diff --git a/scripts/quests/quest_regicide/scripts/quest_regicide.rs2 b/scripts/quests/quest_regicide/scripts/quest_regicide.rs2 index 6ec35fff40..f9976e2703 100644 --- a/scripts/quests/quest_regicide/scripts/quest_regicide.rs2 +++ b/scripts/quests/quest_regicide/scripts/quest_regicide.rs2 @@ -222,8 +222,8 @@ if(.loc_find($trap4, regicide_trap_arrowtrip) = true) { ~coord_projectile(.loc_coord, coord, iron_arrow_travel, 4, 35, 0, 45, 40, 0, 0); } sound_synth(tripwire_with_arrows, 0, 0); -queue(damage_player, 0, 5); -queue(damage_player, 0, 5); +~queue_damage_player(0, 5); +~queue_damage_player(0, 5); [oploc1,regicide_pitfall_corner] p_delay(0); diff --git a/scripts/quests/quest_scorpcatcher/scripts/quest_scorpcatcher.rs2 b/scripts/quests/quest_scorpcatcher/scripts/quest_scorpcatcher.rs2 index ba3f7939e0..e65a26131e 100644 --- a/scripts/quests/quest_scorpcatcher/scripts/quest_scorpcatcher.rs2 +++ b/scripts/quests/quest_scorpcatcher/scripts/quest_scorpcatcher.rs2 @@ -3,7 +3,7 @@ mes("You've already caught this scorpion"); [label,scorpion_sting] mes("The scorpion stings you!"); -queue(damage_player, 0, 3); +~queue_damage_player(0, 3); [label,catch_scorp](namedobj $next_cage) inv_del(inv, last_useitem, 1); diff --git a/scripts/quests/quest_upass/scripts/upass_obstacles.rs2 b/scripts/quests/quest_upass/scripts/upass_obstacles.rs2 index 85cfd4c13d..ea936b1b68 100644 --- a/scripts/quests/quest_upass/scripts/upass_obstacles.rs2 +++ b/scripts/quests/quest_upass/scripts/upass_obstacles.rs2 @@ -179,11 +179,11 @@ if(coordx(coord) > coordx(loc_coord)) { if (loc_find(coord, upass_speartrap) = true | loc_find(movecoord(coord, 0, 0, -1), upass_speartrap) = true) { loc_anim(speartrap_release); say("Ouch!"); - queue(damage_player, 0, calc(((stat(hitpoints) * 10) / 100) + 1)); + ~queue_damage_player(0, calc(((stat(hitpoints) * 10) / 100) + 1)); } else if (loc_find(coord, upass_double_springtrap_trigger) = true) { if(loc_find(movecoord(loc_coord, -1, 0, 0), upass_double_springtrap) = true | loc_find(movecoord(loc_coord, 0, 0, -1), upass_double_springtrap) = true) loc_anim(double_springtrap_release); say("Ouch!"); - queue(damage_player, 0, calc(((stat_base(hitpoints) * 8) / 100) + 1)); + ~queue_damage_player(0, calc(((stat_base(hitpoints) * 8) / 100) + 1)); world_delay(1); loc_anim(double_springtrap_reset); } diff --git a/scripts/quests/quest_viking/scripts/viking_reveller.rs2 b/scripts/quests/quest_viking/scripts/viking_reveller.rs2 index ec6c1d1750..dfc9e62b17 100644 --- a/scripts/quests/quest_viking/scripts/viking_reveller.rs2 +++ b/scripts/quests/quest_viking/scripts/viking_reveller.rs2 @@ -260,7 +260,7 @@ mes("The strange object you lit earlier explodes in your inventory!"); say("Ow!"); inv_del(inv, viking_firecracker_lit, $count); if($count > 1) inv_add(inv, viking_firecracker, sub($count, 1)); -queue(damage_player, 0, max(2, divide(stat(hitpoints), 25))); +~queue_damage_player(0, max(2, divide(stat(hitpoints), 25))); [oplocu,viking_pipe_end_longhall] if(last_useitem = viking_firecracker_lit) { diff --git a/scripts/quests/quest_viking/scripts/viking_thorvald.rs2 b/scripts/quests/quest_viking/scripts/viking_thorvald.rs2 index 6302b313cc..0f720289a9 100644 --- a/scripts/quests/quest_viking/scripts/viking_thorvald.rs2 +++ b/scripts/quests/quest_viking/scripts/viking_thorvald.rs2 @@ -375,7 +375,7 @@ if (npc_stat(hitpoints) = 0) { if ($check_protect_prayer = true & ~check_protect_prayer(^melee_style) = true) { $damage = 0; } -queue*(combat_viking_damage_player, 0)($damage, npc_uid); +queue*(combat_viking_damage_player, 0)(~clamp_hit($damage), npc_uid); queue*(playerhit_n_retaliate, 0)(npc_uid); // this should be strong queued. Some damage is queued, some isnt diff --git a/scripts/quests/quest_zombiequeen/scripts/quest_zombiequeen.rs2 b/scripts/quests/quest_zombiequeen/scripts/quest_zombiequeen.rs2 index fc846caf85..e5e32f0776 100644 --- a/scripts/quests/quest_zombiequeen/scripts/quest_zombiequeen.rs2 +++ b/scripts/quests/quest_zombiequeen/scripts/quest_zombiequeen.rs2 @@ -74,7 +74,7 @@ spotanim_map(shilomist, $mist_coord, 124, 3); huntall($mist_coord, 1, 0); while (huntnext = true) { if($counter = 0) mes("A green thick mist rises from the ground and starts choking you."); - queue(damage_player, 0, ~random_range(2,3)); + ~queue_damage_player(0, ~random_range(2,3)); } world_delay(3); // 4t, might be npc_queue on a zombie or something @zq_greenmist($mist_coord, calc($counter + 1)); @@ -848,7 +848,7 @@ def_int $choice = ~p_choice2("Yes, I'm quite sure.", 1, "No, I think I'll keep i if ($choice = 1) { ~mesbox("You start to slowly move the rocks to one side."); if(stat_random(agility, 75, 250) = false) { - queue(damage_player, 0, calc(((stat_base(hitpoints) * 10) / 100) + 1)); // assuming regular queue, strongqueue in OSRS + ~queue_damage_player(0, calc(((stat_base(hitpoints) * 10) / 100) + 1)); // assuming regular queue, strongqueue in OSRS ~mesbox("You accidentally knock some rocks and the ceiling starts to cave in.|Some rocks fall on you."); // this wont show up cause of damage in OSRS return; } @@ -1169,8 +1169,8 @@ switch_int(~p_choice2_header("Yes I am sure.", 1, "No, I've reconsidered, I'll k case 1 : inv_del(inv, zqcrystal, 1); // NOT STONGQUEUE - if(stat(hitpoints) < 15) queue(damage_player, 0, calc((stat(hitpoints) * 50) / 100)); - else queue(damage_player, 0, 10); + if(stat(hitpoints) < 15) ~queue_damage_player(0, calc((stat(hitpoints) * 50) / 100)); + else ~queue_damage_player(0, 10); ~objbox(zqcrystal, "As you drop the crystal, it hits a rock and explodes. You are lascerated by shards of glass.", 250, 0, 0); case 2 : ~objbox(zqcrystal, "You decide to keep the Locating Crystal tucked into your inventory safe and sound.", 250, 0, 0); } diff --git a/scripts/quests/quest_zombiequeen/scripts/rashiliyia.rs2 b/scripts/quests/quest_zombiequeen/scripts/rashiliyia.rs2 index 51e0fc8167..2d59c45115 100644 --- a/scripts/quests/quest_zombiequeen/scripts/rashiliyia.rs2 +++ b/scripts/quests/quest_zombiequeen/scripts/rashiliyia.rs2 @@ -10,7 +10,7 @@ npc_anim(ghost_attack, 0); npc_delay(2); if(finduid(%npc_attacking_uid) = true) { mes("You feel invisible hands starting to choke you..."); - queue(damage_player, 0, ~random_range(1, 3)); + ~queue_damage_player(0, ~random_range(1, 3)); say("* Gaaaa.... *"); } npc_delay(1); diff --git a/scripts/skill_combat/scripts/npc/npc_combat.rs2 b/scripts/skill_combat/scripts/npc/npc_combat.rs2 index c578ed857f..f10c781f59 100644 --- a/scripts/skill_combat/scripts/npc/npc_combat.rs2 +++ b/scripts/skill_combat/scripts/npc/npc_combat.rs2 @@ -342,6 +342,11 @@ switch_int ($style) { } error("style of not defined in switch for npc_combat_defencebonus"); +// Enqueue helper for npc->player combat damage, clamped to the player's hp at +// enqueue time (enables tick eating). Prefer this over a raw queue(combat_damage_player,..). +[proc,queue_combat_damage_player](int $delay, int $damage) +queue(combat_damage_player, $delay, ~clamp_hit($damage)); + // this should be strong queued. Some damage is queued, some isnt [queue,combat_damage_player](int $damage) if (inv_getobj(worn, ^wearpos_ring) = ring_of_recoil & map_members = ^true & npc_finduid(%aggressive_npc) = true & npc_hasop(2) = true & %npc_attacking_uid = uid & $damage > 0 & stat(hitpoints) > 0) { diff --git a/scripts/skill_combat/scripts/npc/npc_combat_magic.rs2 b/scripts/skill_combat/scripts/npc/npc_combat_magic.rs2 index cf56b60541..cd57887de3 100644 --- a/scripts/skill_combat/scripts/npc/npc_combat_magic.rs2 +++ b/scripts/skill_combat/scripts/npc/npc_combat_magic.rs2 @@ -111,7 +111,7 @@ sound_synth(db_getfield($spell_data, magic_spell_table:sound_success, 0), 0, 0); def_int $damage = randominc($maxhit); if ($maxhit ! null) { // npc vs player spells have no 1t extra damage delay. Whereas player vs npc spells do (osrs) - queue(combat_damage_player, calc($duration / 30), $damage); + ~queue_combat_damage_player(calc($duration / 30), $damage); // player anim for flinching doesnt exist, even in osrs // anim(~combat_defend_anim(inv_getobj(worn, ^wearpos_rhand)), $duration); } diff --git a/scripts/skill_combat/scripts/npc/npc_combat_melee.rs2 b/scripts/skill_combat/scripts/npc/npc_combat_melee.rs2 index e501b4a19e..046babc06a 100644 --- a/scripts/skill_combat/scripts/npc/npc_combat_melee.rs2 +++ b/scripts/skill_combat/scripts/npc/npc_combat_melee.rs2 @@ -44,5 +44,5 @@ if (npc_stat(hitpoints) = 0) { if ($check_protect_prayer = true & ~check_protect_prayer(^melee_style) = true) { $damage = 0; } -queue(combat_damage_player, 0, $damage); +~queue_combat_damage_player(0, $damage); queue*(playerhit_n_retaliate, 0)(npc_uid); diff --git a/scripts/skill_combat/scripts/npc/npc_combat_ranged.rs2 b/scripts/skill_combat/scripts/npc/npc_combat_ranged.rs2 index c4ddb26a20..717f63d8ad 100644 --- a/scripts/skill_combat/scripts/npc/npc_combat_ranged.rs2 +++ b/scripts/skill_combat/scripts/npc/npc_combat_ranged.rs2 @@ -50,7 +50,7 @@ if ($check_protect_prayer = true & ~check_protect_prayer(^ranged_style) = true) $damage = 0; } anim(%com_defendanim, $duration); -queue(combat_damage_player, calc($duration / 30), $damage); +~queue_combat_damage_player(calc($duration / 30), $damage); queue*(playerhit_n_retaliate, calc($duration / 30))(npc_uid); ~npc_set_attack_vars; if(npc_param(npc_ammo) ! null) { diff --git a/scripts/skill_combat/scripts/poison.rs2 b/scripts/skill_combat/scripts/poison.rs2 index cae25c231b..506fb5667a 100644 --- a/scripts/skill_combat/scripts/poison.rs2 +++ b/scripts/skill_combat/scripts/poison.rs2 @@ -26,7 +26,7 @@ else if(%poison < 0){ %poison = calc(%poison + 1); return; } -queue(poison_damage,0,calc((%poison + 4)/5)); +queue(poison_damage, 0, ~clamp_hit(calc((%poison + 4)/5))); %poison = calc(%poison - 1); [queue,poison_damage](int $damage) diff --git a/scripts/skill_combat/scripts/pvp/pvp_combat.rs2 b/scripts/skill_combat/scripts/pvp/pvp_combat.rs2 index f6e9dc3760..397f27820d 100644 --- a/scripts/skill_combat/scripts/pvp/pvp_combat.rs2 +++ b/scripts/skill_combat/scripts/pvp/pvp_combat.rs2 @@ -175,7 +175,7 @@ if (inv_getobj(worn, ^wearpos_ring) = ring_of_recoil & map_members = ^true & .fi // - "Recoil damage will now always target the entity that caused the initial damage, rather than the most recent entity to deal damage." // Having it here instead of the opplayer2 trigger will allow this bug to occur def_int $recoil_damage = add(scale(10, 100, $damage), 1); - $recoil_damage = min($recoil_damage, .stat(hitpoints)); + $recoil_damage = ~.clamp_hit($recoil_damage); .queue(recoil_damage, 0, $recoil_damage); ~ring_of_recoil_lose_charge($recoil_damage); } diff --git a/scripts/skill_combat/scripts/pvp/pvp_magic.rs2 b/scripts/skill_combat/scripts/pvp/pvp_magic.rs2 index 78d5339326..99e22947c3 100644 --- a/scripts/skill_combat/scripts/pvp/pvp_magic.rs2 +++ b/scripts/skill_combat/scripts/pvp/pvp_magic.rs2 @@ -183,7 +183,7 @@ if (~.check_protect_prayer(^magic_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } def_int $damage = randominc($maxhit); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt -$damage = min($damage, .stat(hitpoints)); +$damage = ~.clamp_hit($damage); ~.pvp_damage(calc($duration / 30 + 1), $damage); // delayed an extra tick: https://youtu.be/eEdE0mvglM4?t=62 // didnt have a flinch anim until sept 20 2006: https://oldschool.runescape.wiki/w/Update:Slug_Menace ~give_combat_experience_pvp($damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); diff --git a/scripts/skill_combat/scripts/pvp/pvp_melee.rs2 b/scripts/skill_combat/scripts/pvp/pvp_melee.rs2 index 3f60297abc..fd6b808c73 100644 --- a/scripts/skill_combat/scripts/pvp/pvp_melee.rs2 +++ b/scripts/skill_combat/scripts/pvp/pvp_melee.rs2 @@ -31,7 +31,7 @@ if (~pvp_hit_roll(%damagetype) = true) { if (~.check_protect_prayer(^melee_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/pvp_ranged.rs2 b/scripts/skill_combat/scripts/pvp/pvp_ranged.rs2 index 9254361204..f9fd3d3045 100644 --- a/scripts/skill_combat/scripts/pvp/pvp_ranged.rs2 +++ b/scripts/skill_combat/scripts/pvp/pvp_ranged.rs2 @@ -38,7 +38,7 @@ if (~pvp_hit_roll(%damagetype) = true) { if (~.check_protect_prayer(^ranged_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_dagger.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_dagger.rs2 index e53130c33d..b46d8cc579 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_dagger.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_dagger.rs2 @@ -25,7 +25,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { if (~.check_protect_prayer(^melee_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_halberd.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_halberd.rs2 index 73cd0b1731..2fcc1dd913 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_halberd.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_halberd.rs2 @@ -64,7 +64,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { if (~.check_protect_prayer(^melee_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_longsword.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_longsword.rs2 index c22bd18e48..dfe1f96c3f 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_longsword.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_longsword.rs2 @@ -9,7 +9,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { if (~.check_protect_prayer(^melee_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_mace.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_mace.rs2 index fe137876cf..f29cf4328a 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_mace.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_dragon_mace.rs2 @@ -9,7 +9,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { if (~.check_protect_prayer(^melee_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_longbow.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_longbow.rs2 index 8efd4c2163..e0867a26fb 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_longbow.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_longbow.rs2 @@ -22,7 +22,7 @@ def_int $maxhit = ~combat_maxhit($combat_stat); if (~.check_protect_prayer(^ranged_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } -def_int $damage = min(randominc($maxhit), .stat(hitpoints)); +def_int $damage = ~.clamp_hit(randominc($maxhit)); ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_shortbow.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_shortbow.rs2 index d8588b242c..aa027d1155 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_shortbow.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_magic_shortbow.rs2 @@ -41,7 +41,7 @@ if (randominc($attackroll) > randominc($defenceroll)) { if (~.check_protect_prayer(^ranged_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); + $damage = ~.clamp_hit(randominc($maxhit)); ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_claws.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_claws.rs2 index d8376d1b27..9d142a4312 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_claws.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_claws.rs2 @@ -7,7 +7,7 @@ if (~pvp_hit_roll(%damagetype) = true) { if (~.check_protect_prayer(^melee_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt + $damage = ~.clamp_hit(randominc($maxhit)); // tick eating existed! https://oldschool.runescape.wiki/w/Update:The_Wintertodt ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_thrownaxe.rs2 b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_thrownaxe.rs2 index ca172cc897..782ad5b363 100644 --- a/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_thrownaxe.rs2 +++ b/scripts/skill_combat/scripts/pvp/specs/scripts/pvp_rune_thrownaxe.rs2 @@ -89,7 +89,7 @@ if ($hit = true) { if (~.check_protect_prayer(^ranged_style) = true) { $maxhit = scale(6, 10, $maxhit); // reduction of 40% } - $damage = min(randominc($maxhit), .stat(hitpoints)); + $damage = ~.clamp_hit(randominc($maxhit)); ~give_combat_experience_pvp(%damagestyle, $damage, ~pvp_xp_multiplier(~.player_combat_level)); both_heropoints($damage); } diff --git a/scripts/skill_thieving/scripts/doors/locked_door.rs2 b/scripts/skill_thieving/scripts/doors/locked_door.rs2 index 31b6cb96fb..68099e4d36 100644 --- a/scripts/skill_thieving/scripts/doors/locked_door.rs2 +++ b/scripts/skill_thieving/scripts/doors/locked_door.rs2 @@ -146,7 +146,7 @@ if ($locked = true) { if(db_getfieldcount($data, locked_door:trap_successchance) > 0) { if (stat_random(thieving, db_getfield($data, locked_door:trap_successchance, 0)) = false) { mes("You have activated a trap on the lock."); - queue(damage_player, 0, divide(stat(hitpoints), 10)); + ~queue_damage_player(0, divide(stat(hitpoints), 10)); return; } } diff --git a/scripts/tutorial/scripts/npcs/tut_giant_rat.rs2 b/scripts/tutorial/scripts/npcs/tut_giant_rat.rs2 index 4e7727284d..6683dc8eeb 100644 --- a/scripts/tutorial/scripts/npcs/tut_giant_rat.rs2 +++ b/scripts/tutorial/scripts/npcs/tut_giant_rat.rs2 @@ -44,7 +44,7 @@ if (stat(hitpoints) = 1) { } else if (randominc($attack_roll) > randominc($defence_roll)) { $damage = randominc($maxhit); } -queue(combat_damage_player, 1, $damage); +~queue_combat_damage_player(1, $damage); queue*(playerhit_n_retaliate, 1)(npc_uid); ~npc_set_attack_vars;