diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 9b9ad0b32b2..21c7cafb2e2 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -411,8 +411,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/engineering/engine/field_gen
name = "Field Generator crate"
- contains = list(/obj/machinery/field_generator,
- /obj/machinery/field_generator)
+ contains = list(/obj/machinery/field/generator,
+ /obj/machinery/field/generator)
cost = 10
containername = "field generator crate"
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index c3720275ee2..3c57249bb7c 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -115,7 +115,7 @@
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof.
if(!istype(A,/obj/machinery/power/emitter) && \
- !istype(A,/obj/machinery/field_generator) && \
+ !istype(A,/obj/machinery/field/generator) && \
prob(15))
explosion(src.loc, 4, 5, 6, 7, 0)
@@ -142,7 +142,7 @@
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof
if(!istype(A,/obj/machinery/power/emitter) && \
- !istype(A,/obj/machinery/field_generator))
+ !istype(A,/obj/machinery/field/generator))
if(--src.hits <= 0)
del(src) //Dont blow up singularity containment if we get stuck there.
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 2d43ac9982f..880180248b1 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1018,7 +1018,7 @@ var/global/list/g_fancy_list_of_safe_types = null
if(E.anchored)
E.active = 1
- for(var/obj/machinery/field_generator/F in world)
+ for(var/obj/machinery/field/generator/F in world)
if(F.anchored)
F.Varedit_start = 1
spawn(30)
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index e1fe9543dad..aeda5356dfa 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -87,7 +87,7 @@
if(ismob(A))
A.meteorhit(src)//This should work for now I guess
- else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round!
+ else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field/generator)) //Protect the singularity from getting released every round!
A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4
life--
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index a9ee6a25fcd..f488da64e29 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -1,6 +1,6 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-/obj/machinery/containment_field
+/obj/machinery/field/containment
name = "Containment Field"
desc = "An energy field."
icon = 'icons/obj/singularity.dmi'
@@ -10,18 +10,18 @@
unacidable = 1
use_power = 0
luminosity = 4
- var/obj/machinery/field_generator/FG1 = null
- var/obj/machinery/field_generator/FG2 = null
- var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
+ layer = OBJ_LAYER + 0.1
+ var/obj/machinery/field/generator/FG1 = null
+ var/obj/machinery/field/generator/FG2 = null
-/obj/machinery/containment_field/Del()
+/obj/machinery/field/containment/Del()
if(FG1 && !FG1.clean_up)
FG1.cleanup()
if(FG2 && !FG2.clean_up)
FG2.cleanup()
..()
-/obj/machinery/containment_field/attack_hand(mob/user as mob)
+/obj/machinery/field/containment/attack_hand(mob/user as mob)
if(get_dist(src, user) > 1)
return 0
else
@@ -29,81 +29,77 @@
return 1
-/obj/machinery/containment_field/blob_act()
+/obj/machinery/field/containment/blob_act()
return 0
-/obj/machinery/containment_field/ex_act(severity)
+/obj/machinery/field/containment/ex_act(severity)
return 0
-/obj/machinery/containment_field/meteorhit()
+/obj/machinery/field/containment/meteorhit()
return 0
-/obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj)
- if(istype(AM,/mob/living/silicon) && prob(40))
- shock(AM)
- return 1
- if(istype(AM,/mob/living/carbon) && prob(50))
- shock(AM)
- return 1
- return 0
+/obj/machinery/field/containment/Crossed(atom/movable/mover)
+ if(isliving(mover))
+ shock(mover)
-
-
-/obj/machinery/containment_field/proc/shock(mob/living/user as mob)
- if(hasShocked)
+/obj/machinery/field/containment/proc/set_master(var/master1,var/master2)
+ if(!master1 || !master2)
return 0
+ FG1 = master1
+ FG2 = master2
+ return 1
+
+/obj/machinery/field/containment/shock(mob/living/user as mob)
if(!FG1 || !FG2)
del(src)
return 0
- if(iscarbon(user))
+ ..()
+
+// Abstract Field Class
+// Used for overriding certain procs
+
+/obj/machinery/field
+ var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
+
+/obj/machinery/field/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(isliving(mover)) // Don't let mobs through
+ shock(mover)
+ return 0
+ return ..()
+
+/obj/machinery/field/proc/shock(mob/living/user as mob)
+ if(hasShocked)
+ return 0
+ if(isliving(user))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, user.loc)
s.start()
hasShocked = 1
var/shock_damage = min(rand(30,40),rand(30,40))
- user.burn_skin(shock_damage)
- user.updatehealth()
- user.visible_message("\red [user.name] was shocked by the [src.name]!", \
+
+ if(iscarbon(user))
+ var/stun = min(shock_damage, 15)
+ user.Stun(stun)
+ user.Weaken(10)
+ user.burn_skin(shock_damage)
+ user.visible_message("\red [user.name] was shocked by the [src.name]!", \
"\red You feel a powerful shock course through your body sending you flying!", \
"\red You hear a heavy electrical crack")
- var/stun = min(shock_damage, 15)
- user.Stun(stun)
- user.Weaken(10)
+ else if(issilicon(user))
+ if(prob(20))
+ user.Stun(2)
+ user.take_overall_damage(0, shock_damage)
+ user.visible_message("\red [user.name] was shocked by the [src.name]!", \
+ "\red Energy pulse detected, system damaged!", \
+ "\red You hear an electrical crack")
user.updatehealth()
var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
user.throw_at(target, 200, 4)
- sleep(20)
- hasShocked = 0
- return
-
- else if(issilicon(user))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, user.loc)
- s.start()
-
- hasShocked = 1
- var/shock_damage = rand(15,30)
- user.take_overall_damage(0,shock_damage)
- user.visible_message("\red [user.name] was shocked by the [src.name]!", \
- "\red Energy pulse detected, system damaged!", \
- "\red You hear an electrical crack")
- if(prob(20))
- user.Stun(2)
-
- sleep(20)
- hasShocked = 0
- return
-
- return
-
-/obj/machinery/containment_field/proc/set_master(var/master1,var/master2)
- if(!master1 || !master2)
- return 0
- FG1 = master1
- FG2 = master2
- return 1
+ spawn(5)
+ hasShocked = 0
+ return
\ No newline at end of file
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 046f904db6e..d843999c91a 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -87,7 +87,7 @@
src.use_power = 1 */
return 1
-/obj/machinery/containment_field/meteorhit()
+/obj/machinery/field/containment/meteorhit()
return 0
/obj/machinery/power/emitter/process()
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 88f1bc1f14a..dde99aa7164 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -13,7 +13,7 @@ field_generator power level display
*/
#define field_generator_max_power 250
-/obj/machinery/field_generator
+/obj/machinery/field/generator
name = "Field Generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
icon = 'icons/obj/machines/field_generator.dmi'
@@ -28,12 +28,12 @@ field_generator power level display
var/power = 20 // Current amount of power
var/state = 0
var/warming_up = 0
- var/list/obj/machinery/containment_field/fields
- var/list/obj/machinery/field_generator/connected_gens
+ var/list/obj/machinery/field/containment/fields
+ var/list/obj/machinery/field/generator/connected_gens
var/clean_up = 0
-/obj/machinery/field_generator/update_icon()
+/obj/machinery/field/generator/update_icon()
overlays.Cut()
if(warming_up)
overlays += "+a[warming_up]"
@@ -50,14 +50,14 @@ field_generator power level display
return
-/obj/machinery/field_generator/New()
+/obj/machinery/field/generator/New()
..()
fields = list()
connected_gens = list()
return
-/obj/machinery/field_generator/process()
+/obj/machinery/field/generator/process()
if(Varedit_start == 1)
if(active == 0)
active = 1
@@ -75,7 +75,7 @@ field_generator power level display
return
-/obj/machinery/field_generator/attack_hand(mob/user as mob)
+/obj/machinery/field/generator/attack_hand(mob/user as mob)
if(state == 2)
if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
if(src.active >= 1)
@@ -94,7 +94,7 @@ field_generator power level display
return
-/obj/machinery/field_generator/attackby(obj/item/W, mob/user)
+/obj/machinery/field/generator/attackby(obj/item/W, mob/user)
if(active)
user << "The [src] needs to be off."
return
@@ -152,33 +152,30 @@ field_generator power level display
return
-/obj/machinery/field_generator/emp_act()
+/obj/machinery/field/generator/emp_act()
return 0
-/obj/machinery/field_generator/blob_act()
+/obj/machinery/field/generator/blob_act()
if(active)
return 0
else
..()
-/obj/machinery/containment_field/meteorhit()
- return 0
-
-/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj)
+/obj/machinery/field/generator/bullet_act(var/obj/item/projectile/Proj)
if(Proj.flag != "bullet")
power += Proj.damage
update_icon()
return 0
-/obj/machinery/field_generator/Del()
+/obj/machinery/field/generator/Del()
src.cleanup()
..()
-/obj/machinery/field_generator/proc/turn_off()
+/obj/machinery/field/generator/proc/turn_off()
active = 0
spawn(1)
src.cleanup()
@@ -187,7 +184,7 @@ field_generator power level display
warming_up--
update_icon()
-/obj/machinery/field_generator/proc/turn_on()
+/obj/machinery/field/generator/proc/turn_on()
active = 1
spawn(1)
while (warming_up<3 && active)
@@ -198,7 +195,7 @@ field_generator power level display
start_fields()
-/obj/machinery/field_generator/proc/calc_power()
+/obj/machinery/field/generator/proc/calc_power()
if(Varpower)
return 1
@@ -207,7 +204,7 @@ field_generator power level display
src.power = field_generator_max_power
var/power_draw = 2
- for (var/obj/machinery/containment_field/F in fields)
+ for (var/obj/machinery/field/containment/F in fields)
if (isnull(F))
continue
power_draw++
@@ -222,7 +219,7 @@ field_generator power level display
return 0
//This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport
-/obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null)
+/obj/machinery/field/generator/proc/draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field/generator/G = null, var/obj/machinery/field/generator/last = null)
if(Varpower)
return 1
if((G && G == src) || (failsafe >= 8))//Loopin, set fail
@@ -235,7 +232,7 @@ field_generator power level display
else//Need more power
draw -= src.power
src.power = 0
- for(var/obj/machinery/field_generator/FG in connected_gens)
+ for(var/obj/machinery/field/generator/FG in connected_gens)
if(isnull(FG))
continue
if(FG == last)//We just asked you
@@ -252,7 +249,7 @@ field_generator power level display
return 0
-/obj/machinery/field_generator/proc/start_fields()
+/obj/machinery/field/generator/proc/start_fields()
if(!src.state == 2 || !anchored)
turn_off()
return
@@ -267,9 +264,9 @@ field_generator power level display
src.active = 2
-/obj/machinery/field_generator/proc/setup_field(var/NSEW)
+/obj/machinery/field/generator/proc/setup_field(var/NSEW)
var/turf/T = src.loc
- var/obj/machinery/field_generator/G
+ var/obj/machinery/field/generator/G
var/steps = 0
if(!NSEW)//Make sure its ran right
return
@@ -280,11 +277,11 @@ field_generator power level display
for(var/atom/A in T.contents)
if(ismob(A))
continue
- if(!istype(A,/obj/machinery/field_generator))
+ if(!istype(A,/obj/machinery/field/generator))
if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density))
return 0
steps += 1
- G = locate(/obj/machinery/field_generator) in T
+ G = locate(/obj/machinery/field/generator) in T
if(!isnull(G))
steps -= 1
if(!G.active)
@@ -296,15 +293,17 @@ field_generator power level display
for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
var/field_dir = get_dir(T,get_step(G.loc, NSEW))
T = get_step(T, NSEW)
- if(!locate(/obj/machinery/containment_field) in T)
- var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field()
+ if(!locate(/obj/machinery/field/containment) in T)
+ var/obj/machinery/field/containment/CF = new/obj/machinery/field/containment()
CF.set_master(src,G)
fields += CF
G.fields += CF
CF.loc = T
CF.dir = field_dir
+ for(var/mob/living/L in CF.loc)
+ CF.Crossed(L)
var/listcheck = 0
- for(var/obj/machinery/field_generator/FG in connected_gens)
+ for(var/obj/machinery/field/generator/FG in connected_gens)
if (isnull(FG))
continue
if(FG == G)
@@ -313,7 +312,7 @@ field_generator power level display
if(!listcheck)
connected_gens.Add(G)
listcheck = 0
- for(var/obj/machinery/field_generator/FG2 in G.connected_gens)
+ for(var/obj/machinery/field/generator/FG2 in G.connected_gens)
if (isnull(FG2))
continue
if(FG2 == src)
@@ -323,14 +322,14 @@ field_generator power level display
G.connected_gens.Add(src)
-/obj/machinery/field_generator/proc/cleanup()
+/obj/machinery/field/generator/proc/cleanup()
clean_up = 1
- for (var/obj/machinery/containment_field/F in fields)
+ for (var/obj/machinery/field/containment/F in fields)
if (isnull(F))
continue
del(F)
fields = list()
- for(var/obj/machinery/field_generator/FG in connected_gens)
+ for(var/obj/machinery/field/generator/FG in connected_gens)
if (isnull(FG))
continue
FG.connected_gens.Remove(src)
@@ -353,3 +352,7 @@ field_generator power level display
message_admins("A singulo exists and a containment field has failed.",1)
investigate_log("has failed whilst a singulo exists.","singulo")
O.last_warning = world.time
+
+/obj/machinery/field/generator/shock(mob/living/user as mob)
+ if(fields.len)
+ ..()
\ No newline at end of file
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 2b0b33757f9..65e206a3b41 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -104,7 +104,7 @@ var/global/list/uneatable = list(
/obj/machinery/singularity/proc/admin_investigate_setup()
last_warning = world.time
- var/count = locate(/obj/machinery/containment_field) in orange(30, src)
+ var/count = locate(/obj/machinery/field/containment) in orange(30, src)
if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1)
investigate_log("was created. [count?"":"No containment fields were active"]","singulo")
@@ -376,10 +376,10 @@ var/global/list/uneatable = list(
/obj/machinery/singularity/proc/can_move(var/turf/T)
if(!T)
return 0
- if((locate(/obj/machinery/containment_field) in T)||(locate(/obj/machinery/shieldwall) in T))
+ if((locate(/obj/machinery/field/containment) in T)||(locate(/obj/machinery/shieldwall) in T))
return 0
- else if(locate(/obj/machinery/field_generator) in T)
- var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T
+ else if(locate(/obj/machinery/field/generator) in T)
+ var/obj/machinery/field/generator/G = locate(/obj/machinery/field/generator) in T
if(G && G.active)
return 0
else if(locate(/obj/machinery/shieldwallgen) in T)
diff --git a/maps/tgstation.2.1.2.dmm b/maps/tgstation.2.1.2.dmm
index 38988deffba..0cf3a9270da 100644
--- a/maps/tgstation.2.1.2.dmm
+++ b/maps/tgstation.2.1.2.dmm
@@ -5438,7 +5438,7 @@
"caH" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
"caI" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
"caJ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft)
-"caK" = (/obj/machinery/field_generator,/turf/simulated/floor/plating,/area/engine/engineering)
+"caK" = (/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/engine/engineering)
"caL" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engine/engineering)
"caM" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"caN" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/module/power_control,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/engine/engineering)
@@ -5644,7 +5644,7 @@
"ceF" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ceG" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ceH" = (/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"ceI" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area)
+"ceI" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area)
"ceJ" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ceK" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ceL" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/engine/engineering)
@@ -6937,7 +6937,7 @@
"cDy" = (/obj/structure/window/reinforced,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
"cDz" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"cDA" = (/obj/machinery/power/emitter{dir = 1; icon_state = "emitter"},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
-"cDB" = (/obj/machinery/field_generator,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
+"cDB" = (/obj/machinery/field/generator,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cDC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced,/turf/simulated/floor,/area/derelict/bridge/access)
"cDD" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor,/area/derelict/bridge/access)
"cDE" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/bridge)