From c4c36e9add9a6f6675a34125f963b2cbdbf2be7b Mon Sep 17 00:00:00 2001 From: Ghilker <42839747+Ghilker@users.noreply.github.com> Date: Mon, 12 Oct 2020 18:58:56 +0200 Subject: [PATCH] holosign little refractor (#54287) --- code/game/objects/items/holosign_creator.dm | 88 ++++++++++----------- code/game/objects/structures/holosign.dm | 13 ++- 2 files changed, 46 insertions(+), 55 deletions(-) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 49a1aba9931..048657b2621 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -12,49 +12,51 @@ throw_speed = 3 throw_range = 7 item_flags = NOBLUDGEON - var/list/signs = list() + var/list/signs var/max_signs = 10 var/creation_time = 0 //time to create a holosign in deciseconds. var/holosign_type = /obj/structure/holosign/wetsign var/holocreator_busy = FALSE //to prevent placing multiple holo barriers at once -/obj/item/holosign_creator/afterattack(atom/target, mob/user, flag) +/obj/item/holosign_creator/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(flag) - if(!check_allowed_items(target, 1)) + if(!proximity_flag) + return + if(!check_allowed_items(target, not_inside = TRUE)) + return + var/turf/target_turf = get_turf(target) + var/obj/structure/holosign/target_holosign = locate(holosign_type) in target_turf + if(target_holosign) + to_chat(user, "You use [src] to deactivate [target_holosign].") + qdel(target_holosign) + return + if(target_turf.is_blocked_turf(TRUE)) //can't put holograms on a tile that has dense stuff + return + if(holocreator_busy) + to_chat(user, "[src] is busy creating a hologram.") + return + if(LAZYLEN(signs) >= max_signs) + to_chat(user, "[src] is projecting at max capacity!") + return + playsound(loc, 'sound/machines/click.ogg', 20, TRUE) + if(creation_time) + holocreator_busy = TRUE + if(!do_after(user, creation_time, target = target)) + holocreator_busy = FALSE return - var/turf/T = get_turf(target) - var/obj/structure/holosign/H = locate(holosign_type) in T - if(H) - to_chat(user, "You use [src] to deactivate [H].") - qdel(H) - else - if(!T.is_blocked_turf(TRUE)) //can't put holograms on a tile that has dense stuff - if(holocreator_busy) - to_chat(user, "[src] is busy creating a hologram.") - return - if(signs.len < max_signs) - playsound(src.loc, 'sound/machines/click.ogg', 20, TRUE) - if(creation_time) - holocreator_busy = TRUE - if(!do_after(user, creation_time, target = target)) - holocreator_busy = FALSE - return - holocreator_busy = FALSE - if(signs.len >= max_signs) - return - if(T.is_blocked_turf(TRUE)) //don't try to sneak dense stuff on our tile during the wait. - return - H = new holosign_type(get_turf(target), src) - to_chat(user, "You create \a [H] with [src].") - else - to_chat(user, "[src] is projecting at max capacity!") + holocreator_busy = FALSE + if(LAZYLEN(signs) >= max_signs) + return + if(target_turf.is_blocked_turf(TRUE)) //don't try to sneak dense stuff on our tile during the wait. + return + target_holosign = new holosign_type(get_turf(target), src) + to_chat(user, "You create \a [target_holosign] with [src].") /obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return /obj/item/holosign_creator/attack_self(mob/user) - if(signs.len) + if(LAZYLEN(signs)) for(var/H in signs) qdel(H) to_chat(user, "You clear all active holograms.") @@ -114,26 +116,18 @@ to_chat(user, "You clear all active holograms, and reset your projector to normal.") holosign_type = /obj/structure/holosign/barrier/cyborg creation_time = 5 - if(signs.len) - for(var/H in signs) - qdel(H) + for(var/sign in signs) + qdel(sign) shock = 0 return - else if(R.emagged&&!shock) + if(R.emagged&&!shock) to_chat(user, "You clear all active holograms, and overload your energy projector!") holosign_type = /obj/structure/holosign/barrier/cyborg/hacked creation_time = 30 - if(signs.len) - for(var/H in signs) - qdel(H) + for(var/sign in signs) + qdel(sign) shock = 1 return - else - if(signs.len) - for(var/H in signs) - qdel(H) - to_chat(user, "You clear all active holograms.") - if(signs.len) - for(var/H in signs) - qdel(H) - to_chat(user, "You clear all active holograms.") + for(var/sign in signs) + qdel(sign) + to_chat(user, "You clear all active holograms.") diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 7946facf6a4..9030b525114 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -9,20 +9,17 @@ armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 20) var/obj/item/holosign_creator/projector -/obj/structure/holosign/New(loc, source_projector) - if(source_projector) - projector = source_projector - projector.signs += src - ..() - -/obj/structure/holosign/Initialize() +/obj/structure/holosign/Initialize(loc, source_projector) . = ..() alpha = 0 SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + if(source_projector) + projector = source_projector + LAZYADD(projector.signs, src) /obj/structure/holosign/Destroy() if(projector) - projector.signs -= src + LAZYREMOVE(projector.signs, src) projector = null return ..()