From a7179d97bf14a9926792c53dca3e166b2249c299 Mon Sep 17 00:00:00 2001 From: Farie82 Date: Sat, 15 Oct 2022 12:40:32 +0200 Subject: [PATCH] Makes wormhole projector portals spawn effects once every 0.5 seconds max (#19398) * Refactor the parameters and starting the teleport * Adds arguments and moves the default effect generation up to do_teleport * Typo in arguments * portals now only create sparks every 0.5 second when things pass through * Comment fix --- code/datums/helper_datums/teleport.dm | 43 ++++++++++++------- code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/objects/effects/portals.dm | 25 +++++++++-- .../hostile/megafauna/ancient_robot.dm | 2 +- code/modules/research/experimentor.dm | 2 +- code/modules/telesci/bscrystal.dm | 2 +- 6 files changed, 52 insertions(+), 24 deletions(-) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index c91ec0f039c..cedd0cfa2d9 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -1,7 +1,28 @@ -//wrapper -/proc/do_teleport(ateleatom, adestination, aprecision = 0, afteleport = 1, aeffectin = null, aeffectout = null, asoundin = null, asoundout = null, bypass_area_flag = FALSE, safe_turf_pick = FALSE) - var/datum/teleport/instant/science/D = new - if(D.start(arglist(args))) +/** + * Will teleport the given atom to the given destination using the other parameters + * + * Arguments: + * - atom_to_teleport - Atom to teleport + * - destination - Where to teleport the atom to + * - variance_range - With what precision to do the teleport. 0 means on target. Higher means that many turfs around it + * - force_teleport - Whether to use forceMove instead of Move to move the atom to the destination + * - effect_in - The effect started at the starting turf. If set to NONE then no effect is used + * - effect_out - The effect started at the destination turf. If set to NONE then no effect is used + * - sound_in - The sound played at the starting turf + * - sound_out - The sound played at the destination turf + * - bypass_area_flag - Whether is_teleport_allowed is skipped or not + * - safe_turf_pick - Whether the chosen random turf from the variance is prefered to be a safe turf or not + */ +/proc/do_teleport(atom_to_teleport, destination, variance_range = 0, force_teleport = TRUE, datum/effect_system/effect_in = null, datum/effect_system/effect_out = null, sound_in = null, sound_out = null, bypass_area_flag = FALSE, safe_turf_pick = FALSE) + var/datum/teleport/instant/science/D = new // default here + if(isnull(effect_in) || isnull(effect_out)) // Set default effects + var/datum/effect_system/spark_spread/effect = new + effect.set_up(5, 1, atom_to_teleport) + if(isnull(effect_in)) + effect_in = effect + if(isnull(effect_out)) + effect_out = effect + if(D.start(atom_to_teleport, destination, variance_range, force_teleport, effect_in, effect_out, sound_in, sound_out, bypass_area_flag, safe_turf_pick)) return 1 return 0 @@ -159,7 +180,7 @@ return doTeleport() return 0 -/datum/teleport/instant/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/datum/teleport/instant/start(ateleatom, adestination, aprecision = 0, afteleport = 1, aeffectin = null, aeffectout = null, asoundin = null, asoundout = null, bypass_area_flag = FALSE, safe_turf_pick = FALSE) if(..()) if(teleport()) return 1 @@ -168,16 +189,6 @@ /datum/teleport/instant/science -/datum/teleport/instant/science/setEffects(datum/effect_system/aeffectin,datum/effect_system/aeffectout) - if(aeffectin==null || aeffectout==null) - var/datum/effect_system/spark_spread/aeffect = new - aeffect.set_up(5, 1, teleatom) - effectin = effectin || aeffect - effectout = effectout || aeffect - return 1 - else - return ..() - /datum/teleport/instant/science/setPrecision(aprecision) ..() if(!is_admin_level(destination.z)) @@ -190,7 +201,7 @@ safe_turf_first = FALSE else precision = max(rand(1, 100) * length(bagholding), 100) - + if(isliving(teleatom)) var/mob/living/MM = teleatom to_chat(MM, "The bluespace interface on your bag of holding interferes with the teleport!") diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 15d24fb14f5..00e04a0a31a 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -732,7 +732,7 @@ M.Confused(20 SECONDS) M.flash_eyes(override_blindness_check = TRUE) M.EyeBlind(20 SECONDS) - do_teleport(M, get_turf(M), 5, asoundin = 'sound/magic/cult_spell.ogg') + do_teleport(M, get_turf(M), 5, sound_in = 'sound/magic/cult_spell.ogg') qdel(src) return diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index c7f1301689b..e86469b58b7 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -1,3 +1,5 @@ +#define EFFECT_COOLDOWN 0.5 SECONDS + /obj/effect/portal name = "portal" desc = "Looks unstable. Best to test it with the clown." @@ -17,6 +19,8 @@ var/can_multitool_to_remove = FALSE var/ignore_tele_proof_area_setting = FALSE var/one_use = FALSE // Does this portal go away after one teleport? + /// The time after which the effects should play again. Too many effects can lag the server + var/effect_cooldown = 0 /obj/effect/portal/New(loc, turf/_target, obj/creation_object = null, lifespan = 300, mob/creation_mob = null) ..() @@ -112,15 +116,26 @@ icon_state = fail_icon var/list/target_z = levels_by_trait(SPAWN_RUINS) target_z -= M.z - if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), pick(target_z)), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. - invalid_teleport() + if(!attempt_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), pick(target_z)), 0, FALSE)) // Try to send them to deep space. return FALSE else - if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target. - invalid_teleport() + if(!attempt_teleport(M, target, precision)) // Try to send them to a turf adjacent to target. return FALSE if(one_use) qdel(src) + + return TRUE + +/obj/effect/portal/proc/attempt_teleport(atom/movable/victim, turf/destination, variance = 0, force_teleport = TRUE) + var/use_effects = world.time >= effect_cooldown + var/effect = null // Will result in the default effect being used + if(!use_effects) + effect = NONE // No effect + + if(!do_teleport(victim, destination, variance, force_teleport, effect, effect, bypass_area_flag = ignore_tele_proof_area_setting)) + invalid_teleport() + return FALSE + effect_cooldown = world.time + EFFECT_COOLDOWN return TRUE /obj/effect/portal/proc/invalid_teleport() @@ -135,3 +150,5 @@ failchance = 0 precision = 0 ignore_tele_proof_area_setting = TRUE + +#undef EFFECT_COOLDOWN diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm index d69402d348c..2c47c99fddd 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm @@ -204,7 +204,7 @@ Difficulty: Hard if(mode == BLUESPACE) new /obj/effect/temp_visual/bsg_kaboom(get_turf(src)) src.visible_message("[src] teleports somewhere nearby!") - do_teleport(src, target, 7, asoundin = 'sound/effects/phasein.ogg', safe_turf_pick = TRUE) //Teleport within 7 tiles of the target + do_teleport(src, target, 7, sound_in = 'sound/effects/phasein.ogg', safe_turf_pick = TRUE) //Teleport within 7 tiles of the target new /obj/effect/temp_visual/bsg_kaboom(get_turf(src)) TR.health_and_snap_check(FALSE)// We want the legs to instantly teleport with it, without regening diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index be69f133baa..25f61a8816f 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -722,7 +722,7 @@ if(loc == user && is_teleport_allowed(userturf.z)) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you! visible_message("[src] twists and bends, relocating itself!") throwSmoke(userturf) - do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg') + do_teleport(user, userturf, 8, sound_in = 'sound/effects/phasein.ogg') throwSmoke(get_turf(user)) warn_admins(user, "Teleport", 0) diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 4963c73dd78..ae8cd095e6a 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -29,7 +29,7 @@ src.visible_message("[src]'s fragments begin rapidly vibrating and blink out of existence.") qdel(src) return - do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') + do_teleport(L, get_turf(L), blink_range, sound_in = 'sound/effects/phasein.ogg') L.apply_status_effect(STATUS_EFFECT_TELEPORTSICK) /obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom)