Merge pull request #8503 from Kyep/frikin_laser_beams

Fixes #6229 - tripwire mines not working / brings back frikin' laser beams
This commit is contained in:
tigercat2000
2018-04-01 18:47:31 -07:00
committed by GitHub
2 changed files with 126 additions and 67 deletions
+51 -28
View File
@@ -7,12 +7,16 @@
bomb_name = "tripwire mine"
secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
dir = EAST
var/on = 0
var/visible = 0
var/visible = 1
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
var/emission_cycles = 0
var/emission_cap = 20
/obj/item/device/assembly/infra/Destroy()
if(first)
@@ -22,7 +26,11 @@
return ..()
/obj/item/device/assembly/infra/describe()
return "The infrared trigger is [on?"on":"off"]."
return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]."
/obj/item/device/assembly/infra/examine(mob/user)
..()
to_chat(user, describe())
/obj/item/device/assembly/infra/activate()
if(!..()) return 0//Cooldown check
@@ -36,11 +44,22 @@
processing_objects.Add(src)
else
on = 0
if(first) qdel(first)
if(first)
qdel(first)
processing_objects.Remove(src)
update_icon()
return secured
/obj/item/device/assembly/infra/New()
..()
if(!secured)
toggle_secure()
/obj/item/device/assembly/infra/proc/arm() // Forces the device to arm no matter its current state.
if(!secured) // Checked because arm() might be called sometime after the object is spawned.
toggle_secure()
on = 1
/obj/item/device/assembly/infra/update_icon()
overlays.Cut()
attached_overlays = list()
@@ -51,38 +70,22 @@
if(holder)
holder.update_icon()
/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 || fire_location != get_turf(loc))
if(first)
qdel(first)
return
var/turf/T = get_turf(src)
if(first && (!on || !fire_location || fire_location != T || emission_cycles >= emission_cap))
qdel(first)
return
if(!on)
return
if(!secured)
return
if(first && last)
last.process()
emission_cycles++
return
var/turf/T = get_valid_loc()
if(T)
fire_location = T
emission_cycles = 0
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T)
I.master = src
I.density = 1
@@ -124,6 +127,8 @@
return 0
pulse(0)
audible_message("[bicon(src)] *beep* *beep*", null, 3)
if(first)
qdel(first)
cooldown = 2
spawn(10)
process_cooldown()
@@ -177,6 +182,21 @@
if(usr.machine == src)
interact(usr)
if(first)
qdel(first)
/obj/item/device/assembly/infra/armed/New()
..()
spawn(3)
if(holder)
if(holder.master)
dir = holder.master.dir
arm()
/obj/item/device/assembly/infra/armed/stealth
visible = 0
/***************************IBeam*********************************/
@@ -191,6 +211,8 @@
var/limit = null
var/visible = 0.0
var/left = null
var/life_cycles = 0
var/life_cap = 20
anchored = 1.0
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -209,7 +231,8 @@
transform = turn(matrix(), dir2angle(dir))
/obj/effect/beam/i_beam/process()
if((loc.density || !(master)))
life_cycles++
if(loc.density || !master || life_cycles >= life_cap)
qdel(src)
return
if(left > 0)