The Great Lasertag Update (#18691)

* Save~

* Fixes launch_many_projectiles having 100% miss chance

Adds laser landmines.
Makes it so portable turrets don't do janky BS for lasertag.
Gives portable lasertag turrets a fun emag/EMP effect

* emag and equipment

* cargo

* tur et

* milsim rp

* clarify

* PLEASE I HAVE A FAMILY

* cries

* signal drop

* no spawn
This commit is contained in:
Cameron Lennox
2025-11-08 03:13:33 +01:00
committed by GitHub
parent 7b656d712c
commit ee47237aa7
25 changed files with 553 additions and 229 deletions
+74 -24
View File
@@ -145,9 +145,7 @@
M.UpdateAppearance()
visible_message("\The [src.name] flashes violently before disintegrating!")
SSmotiontracker.ping(src,100)
spawn(0)
qdel(s)
qdel(src)
qdel(src)
/obj/effect/mine/stun
mineitemtype = /obj/item/mine/stun
@@ -163,9 +161,7 @@
M.Stun(30)
visible_message("\The [src.name] flashes violently before disintegrating!")
SSmotiontracker.ping(src,100)
spawn(0)
qdel(s)
qdel(src)
qdel(src)
/obj/effect/mine/n2o
mineitemtype = /obj/item/mine/n2o
@@ -179,8 +175,7 @@
target.assume_gas(GAS_N2O, 30)
visible_message("\The [src.name] detonates!")
SSmotiontracker.ping(src,100)
spawn(0)
qdel(src)
qdel(src)
/obj/effect/mine/phoron
mineitemtype = /obj/item/mine/phoron
@@ -195,8 +190,7 @@
target.hotspot_expose(1000, CELL_VOLUME)
visible_message("\The [src.name] detonates!")
SSmotiontracker.ping(src,100)
spawn(0)
qdel(src)
qdel(src)
/obj/effect/mine/kick
mineitemtype = /obj/item/mine/kick
@@ -213,9 +207,7 @@
M = E.occupant
if(istype(M))
qdel(M.client)
spawn(0)
qdel(s)
qdel(src)
qdel(src)
/obj/effect/mine/frag
mineitemtype = /obj/item/mine/frag
@@ -237,9 +229,7 @@
src.fragmentate(O, num_fragments, spread_range, fragment_types) //only 20 weak fragments because you're stepping directly on it
visible_message("\The [src.name] detonates!")
SSmotiontracker.ping(src,100)
spawn(0)
qdel(s)
qdel(src)
qdel(src)
/obj/effect/mine/training //Name and Desc commented out so it's possible to trick people with the training mines
// name = "training mine"
@@ -252,8 +242,9 @@
triggered = TRUE
visible_message("\The [src.name]'s light flashes rapidly as it 'explodes'.")
new src.mineitemtype(get_turf(src))
spawn(0)
qdel(src)
for(var/wire_color in wires.colors)
wires.detach_assembly(wire_color) //Kick all the signallers off!
qdel(src)
/obj/effect/mine/emp
mineitemtype = /obj/item/mine/emp
@@ -268,8 +259,7 @@
visible_message("\The [src.name] flashes violently before disintegrating!")
SSmotiontracker.ping(src,100)
empulse(loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
spawn(0)
qdel(src)
qdel(src)
/obj/effect/mine/emp/camo
camo_net = TRUE
@@ -289,8 +279,7 @@
M.fire_act()
visible_message("\The [src.name] bursts into flames!")
SSmotiontracker.ping(src,100)
spawn(0)
qdel(src)
qdel(src)
/obj/effect/mine/gadget
mineitemtype = /obj/item/mine/gadget
@@ -377,8 +366,7 @@
R.trap.forceMove(R)
if(explode_now)
R.explode(user)
spawn(0)
qdel(src)
qdel(src)
/obj/item/mine/dnascramble
name = "radiation mine"
@@ -436,3 +424,65 @@
if(!(L.hovering || L.flying || L.is_incorporeal() || L.mob_size <= MOB_TINY))
return FALSE
return ..()
//Lasertag mines
/obj/effect/mine/lasertag
mineitemtype = /obj/item/mine/lasertag
var/beam_types = list(/obj/item/projectile/bullet/foam_dart_riot) // you fool, you baffoon, you used these, you absolute ignoramous, why did you not read this!
var/spread_range = 3
/obj/effect/mine/lasertag/explode(var/mob/living/M)
if(triggered) // Prevents circular mine explosions from two mines detonating eachother
return
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
triggered = 1
s.set_up(3, 1, src)
s.start()
var/turf/O = get_turf(src)
if(!O)
return
launch_many_projectiles(O, spread_range, beam_types)
visible_message("\The [src.name] detonates!")
qdel(src)
/obj/effect/mine/lasertag/red
mineitemtype = /obj/item/mine/lasertag/red
beam_types = list(/obj/item/projectile/beam/lasertag/red)
/obj/effect/mine/lasertag/blue
mineitemtype = /obj/item/mine/lasertag/blue
beam_types = list(/obj/item/projectile/beam/lasertag/blue)
/obj/effect/mine/lasertag/omni
mineitemtype = /obj/item/mine/lasertag/omni
beam_types = list(/obj/item/projectile/beam/lasertag/omni)
/obj/effect/mine/lasertag/all
mineitemtype = /obj/item/mine/lasertag/all
beam_types = list(/obj/item/projectile/beam/lasertag/red,/obj/item/projectile/beam/lasertag/blue,/obj/item/projectile/beam/lasertag/omni)
/obj/item/mine/lasertag
name = "lasertag mine"
desc = "A small mine with 'BOOM' written on top, and an optical hazard warning on the side."
minetype = /obj/effect/mine/lasertag
/obj/item/mine/lasertag/red
name = "red lasertag mine"
desc = "A small red mine with 'BOOM' written on top, and an optical hazard warning on the side."
minetype = /obj/effect/mine/lasertag/red
/obj/item/mine/lasertag/blue
name = "blue lasertag mine"
desc = "A small blue mine with 'BOOM' written on top, and an optical hazard warning on the side."
minetype = /obj/effect/mine/lasertag/blue
/obj/item/mine/lasertag/omni
name = "purple lasertag mine"
desc = "A small purple mine with 'BOOM' written on top, and an optical hazard warning on the side."
minetype = /obj/effect/mine/lasertag/omni
/obj/item/mine/lasertag/all
name = "chaos lasertag mine"
desc = "A small grey mine with 'BOOM' written on top, and an optical hazard warning on the side."
minetype = /obj/effect/mine/lasertag/all
+1 -1
View File
@@ -401,7 +401,7 @@
else
return 0
/obj/item/throw_impact(atom/hit_atom)
/obj/item/throw_impact(atom/hit_atom, var/speed)
..()
if(isliving(hit_atom) && !hit_atom.is_incorporeal()) //Living mobs handle hit sounds differently.
var/volume = get_volume_by_throwforce_and_or_w_class()
@@ -73,4 +73,4 @@
else if(!M.lying && src.loc != get_turf(src)) //if it's not on the turf, it must be in the mob!
P.attack_mob(M, 0, 25) //you're holding a grenade, dude!
else
P.attack_mob(M, 0, 100) //otherwise, allow a decent amount of fragments to pass
P.attack_mob(M, 0, 75) //otherwise, allow a decent amount of fragments to pass
@@ -78,7 +78,10 @@
starts_with = list(
/obj/item/gun/energy/lasertag/red = 5,
/obj/item/clothing/suit/redtag = 5)
/obj/item/clothing/suit/lasertag/redtag = 5,
/obj/item/lasertagknife/red = 5,
/obj/item/mine/lasertag/all = 5,
/obj/item/mine/lasertag/red = 5)
/obj/structure/closet/lasertag/blue
@@ -88,7 +91,22 @@
starts_with = list(
/obj/item/gun/energy/lasertag/blue = 5,
/obj/item/clothing/suit/bluetag = 5)
/obj/item/clothing/suit/lasertag/bluetag = 5,
/obj/item/lasertagknife/blue = 5,
/obj/item/mine/lasertag/all = 5,
/obj/item/mine/lasertag/blue = 5)
/obj/structure/closet/lasertag/omni
name = "unniversal laser tag equipment"
desc = "It's a storage unit for laser tag equipment."
closet_appearance = /decl/closet_appearance/wardrobe/purple
starts_with = list(
/obj/item/gun/energy/lasertag/omni = 5,
/obj/item/clothing/suit/lasertag/omni = 5,
/obj/item/lasertagknife = 5,
/obj/item/mine/lasertag/all = 5,
/obj/item/mine/lasertag/omni = 5)
/obj/structure/closet/lasertag/red/laserdome
name = "red team laserdome equipment"
@@ -101,7 +119,8 @@
/obj/item/clothing/under/color/red = 3,
/obj/item/gun/energy/lasertag/red = 3,
/obj/item/clothing/head/redtag = 3,
/obj/item/clothing/suit/redtag = 3)
/obj/item/clothing/suit/lasertag/redtag = 3,
/obj/item/lasertagknife/red = 3)
/obj/structure/closet/lasertag/blue/laserdome
name = "blue team laserdome equipment"
@@ -114,4 +133,5 @@
/obj/item/clothing/under/color/blue = 3,
/obj/item/gun/energy/lasertag/blue = 3,
/obj/item/clothing/head/bluetag = 3,
/obj/item/clothing/suit/bluetag = 3)
/obj/item/clothing/suit/lasertag/bluetag = 3,
/obj/item/lasertagknife/blue = 3)
@@ -70,6 +70,11 @@
desc = "A hefty wooden crate displaying the logo of Donk-Soft. It's rather heavy."
starts_with = list(/obj/machinery/vending/donksoft)
/obj/structure/largecrate/lasertag_turrets
name = "lasertag turret crate"
desc = "A hefty wooden crate displaying the logo of Laz-co. It's rather heavy."
starts_with = list(/obj/machinery/porta_turret/lasertag/blue, /obj/machinery/porta_turret/lasertag/red, /obj/machinery/porta_turret/lasertag/omni)
/obj/structure/largecrate/vehicle
name = "vehicle crate"
desc = "Wulf Aeronautics says it comes in a box for the consumer's sake... How is this so light?"