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)