From 1287f7eb709d2c77f3b59bf7ccbe5d20cee2f26a Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 26 Feb 2016 19:03:13 -0500 Subject: [PATCH] Fixes infrared assemblies --- code/modules/assembly/infrared.dm | 72 ++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 370f0270f58..ee7fc835ddc 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -11,6 +11,16 @@ var/visible = 0 var/obj/effect/beam/i_beam/first = null var/obj/effect/beam/i_beam/last = null + var/max_nesting_level = 10 + var/turf/fire_location + +/obj/item/device/assembly/infra/Destroy() + if(first) + qdel(first) + first = null + last = null + fire_location = null + return ..() /obj/item/device/assembly/infra/describe() return "The infrared trigger is [on?"on":"off"]." @@ -41,10 +51,28 @@ if(holder) holder.update_icon() - return + +/obj/item/device/assembly/infra/proc/get_valid_loc(atom/A, atom/prev, level = 0) + if(!A) + A = loc + if(!prev) + prev = src + if(level > max_nesting_level) + return null + else if(isturf(A)) + return A + else if(isobj(A)) + var/obj/O = A + if(isassembly(A) || O.IsAssemblyHolder() || istype(A, /obj/item/device/onetankbomb)) + return .(A.loc, A, level + 1) + else if(ismob(A)) + var/mob/user = A + if(user.get_active_hand() == prev || user.get_inactive_hand() == prev) + return .(A.loc, A, level + 1) + return null /obj/item/device/assembly/infra/process() - if(!on) + if(!on || fire_location != get_turf(loc)) if(first) qdel(first) return @@ -53,12 +81,14 @@ if(first && last) last.process() return - var/turf/T = get_turf(src) + var/turf/T = get_valid_loc() if(T) + fire_location = T var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T) I.master = src I.density = 1 I.dir = dir + I.update_icon() first = I step(I, I.dir) if(first) @@ -70,40 +100,47 @@ /obj/item/device/assembly/infra/attack_hand() qdel(first) ..() - return /obj/item/device/assembly/infra/Move() var/t = dir ..() dir = t qdel(first) - return /obj/item/device/assembly/infra/holder_movement() if(!holder) return 0 -// dir = holder.dir qdel(first) return 1 +/obj/item/device/assembly/infra/equipped(var/mob/user, var/slot) + qdel(first) + return ..() + +/obj/item/device/assembly/infra/pickup(mob/user) + qdel(first) + return ..() + /obj/item/device/assembly/infra/proc/trigger_beam() - if((!secured)||(!on)||(cooldown > 0)) + if(!secured || !on || cooldown > 0) return 0 pulse(0) audible_message("\icon[src] *beep* *beep*", null, 3) cooldown = 2 spawn(10) process_cooldown() - return /obj/item/device/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel if(!secured) return user.set_machine(src) - var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n
", (on ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src))) - dat += "

Refresh" - dat += "

Close" + var/dat = {"Infrared Laser + Status: [on ? "On" : "Off"]
+ Visibility: [visible ? "Visible" : "Invisible"]
+ Current Direction: [capitalize(dir2text(dir))]
+
+

Refresh +

Close"} user << browse(dat, "window=infra") onclose(user, "infra") - return /obj/item/device/assembly/infra/Topic(href, href_list) ..() @@ -118,6 +155,8 @@ visible = !(visible) if(first) first.vis_spread(visible) + if(href_list["rotate"]) + rotate() if(href_list["close"]) usr << browse(null, "window=infra") return @@ -133,7 +172,9 @@ return dir = turn(dir, 90) - return + + if(usr.machine == src) + interact(usr) @@ -157,13 +198,14 @@ if(master) master.trigger_beam() qdel(src) - return /obj/effect/beam/i_beam/proc/vis_spread(v) visible = v if(next) next.vis_spread(v) +/obj/effect/beam/i_beam/update_icon() + transform = turn(matrix(), dir2angle(dir)) /obj/effect/beam/i_beam/process() if((loc.density || !(master))) @@ -184,6 +226,7 @@ I.master = master I.density = 1 I.dir = dir + I.update_icon() I.previous = src next = I step(I, I.dir) @@ -196,7 +239,6 @@ /obj/effect/beam/i_beam/Bump() qdel(src) - return /obj/effect/beam/i_beam/Bumped() hit()