From 930c5e635e9b1bca58655a84b160fdc182fd6758 Mon Sep 17 00:00:00 2001 From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Date: Tue, 6 Sep 2022 03:17:17 -0700 Subject: [PATCH] Moves "catch this var/flag" code from obj/init and datum/new into the types that use it (#69634) * Optimizes away /obj/Initialize We were spending like 0.15 seconds just checking for blueprints, obj flags and network ids All these things can just be applied where they're wanted, saves time Oh and I replaced object flags with an emag injector. I'll give it a sprite and name later I promise * Requires a GenerateTag() call to set DF_USE_TAG, rather then doing a check in atom New This is technically harder to use, but I don't really want people using tags, and it saves 0.15 seconds * Moves generatetag to /datum * I am dumb * Saves 0.5 seconds, makes init emissive blockers actually work Ok so background. If an overlay is added with add_overlay, and not "managed" somehow, it will effectively never be removed, because nothing's tracking it. Update_overlays uses the managed_overlays list/var (one of those) to do this. I'm gonna piggyback off this to make emissive overlays actually like, respect overlay updates. Oh and uh, I've saved maybe 0.5 seconds by caching the new emissive, and not using add_overlay. There's a chance this will lead to overlay corruption, but since we never readd the flattened, I think we'll be safe * Fixes plane not being set right, changes color logic too, since alpha will override past color sets * Makes it actually work. also makes rand posters update appearance to clear away the overlay, since it shows on right click and looks bad * Fixes blockers showing as emissives. It turns out alpha sets override the color list we use. Not sure why we pretend to support them * Makes the injector support traits, adds an amazing sprite --- .../LavaRuins/lavaland_biodome_beach.dmm | 6 ++- .../LavaRuins/lavaland_surface_greed.dmm | 6 ++- _maps/RandomRuins/SpaceRuins/crashedship.dmm | 19 ++++++-- _maps/RandomZLevels/moonoutpost19.dmm | 42 ++++++++++++----- code/__DEFINES/obj_flags.dm | 15 +++--- code/__HELPERS/lighting.dm | 2 + code/_globalvars/bitfields.dm | 1 - code/datums/armor.dm | 9 ++-- code/datums/datum.dm | 8 ++++ code/game/atoms.dm | 8 ---- code/game/atoms_movable.dm | 43 +++++++++++++++--- code/game/machinery/doors/airlock.dm | 3 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/objects/effects/contraband.dm | 1 + code/game/objects/items/control_wand.dm | 2 +- code/game/objects/objs.dm | 42 +++++------------ .../atmospherics/machinery/atmosmachinery.dm | 3 +- code/modules/mapping/mapping_helpers.dm | 11 +++++ code/modules/mob/mob.dm | 5 ++ code/modules/mob/mob_defines.dm | 1 - .../hardware/network_card.dm | 4 +- code/modules/power/cable.dm | 6 ++- code/modules/power/pipecleaners.dm | 5 +- code/modules/power/power.dm | 8 +++- code/modules/recycling/disposal/pipe.dm | 5 +- .../wiremod/components/ntnet/ntnet_receive.dm | 6 ++- .../wiremod/components/ntnet/ntnet_send.dm | 6 ++- icons/effects/mapping_helpers.dmi | Bin 19712 -> 19963 bytes 28 files changed, 176 insertions(+), 93 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 8d9f2c13f0b..de106c87bb8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -32,8 +32,10 @@ /turf/open/floor/carpet/orange, /area/ruin/powered/beach) "aF" = ( -/obj/machinery/vending/boozeomat{ - set_obj_flags = "EMAGGED" +/obj/machinery/vending/boozeomat, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/vending/boozeomat }, /turf/open/floor/wood, /area/ruin/powered/beach) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index f21ffaedf9b..27e36df29f7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -38,8 +38,10 @@ /turf/open/floor/carpet, /area/ruin/powered/greed) "k" = ( -/obj/machinery/computer/arcade/battle{ - set_obj_flags = "EMAGGED" +/obj/machinery/computer/arcade/battle, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/computer/arcade/battle }, /turf/open/floor/engine/cult, /area/ruin/powered/greed) diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 301a3f63a8f..ab70914a43d 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -383,7 +383,10 @@ /obj/machinery/porta_turret{ dir = 8; installation = /obj/item/gun/energy/lasercannon; - set_obj_flags = "EMAGGED" + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/porta_turret }, /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 1 @@ -484,8 +487,11 @@ /obj/effect/turf_decal/trimline/brown/line, /obj/machinery/porta_turret{ dir = 8; - installation = /obj/item/gun/energy/lasercannon; - set_obj_flags = "EMAGGED" + installation = /obj/item/gun/energy/lasercannon + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/porta_turret }, /turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) @@ -1065,8 +1071,11 @@ }, /obj/machinery/porta_turret{ dir = 8; - installation = /obj/item/gun/energy/lasercannon; - set_obj_flags = "EMAGGED" + installation = /obj/item/gun/energy/lasercannon + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/porta_turret }, /turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 42230fbd2b9..6eb9c054b3c 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -753,8 +753,11 @@ /obj/machinery/door/airlock/public/glass{ density = 0; icon_state = "open"; - name = "Dormitories"; - set_obj_flags = "EMAGGED" + name = "Dormitories" + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/door/airlock }, /obj/item/stack/rods, /obj/item/shard{ @@ -1048,8 +1051,11 @@ icon_state = "open"; id_tag = "awaydorm4"; name = "Dorm 1"; - opacity = 0; - set_obj_flags = "EMAGGED" + opacity = 0 + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/door/airlock }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ @@ -1311,8 +1317,11 @@ /obj/machinery/door/airlock/external/ruin{ density = 0; icon_state = "open"; - opacity = 0; - set_obj_flags = "EMAGGED" + opacity = 0 + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/door/airlock }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -1400,8 +1409,11 @@ /obj/machinery/door/airlock/external/ruin{ density = 0; icon_state = "open"; - opacity = 0; - set_obj_flags = "EMAGGED" + opacity = 0 + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/door/airlock }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -1926,8 +1938,11 @@ density = 0; icon_state = "open"; name = "Xenobiology Lab"; - opacity = 0; - set_obj_flags = "EMAGGED" + opacity = 0 + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/door/airlock }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /obj/structure/cable, @@ -2892,8 +2907,11 @@ density = 0; icon_state = "open"; name = "Research Director's Office"; - opacity = 0; - set_obj_flags = "EMAGGED" + opacity = 0 + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/door/airlock }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /turf/open/floor/iron/cafeteria{ diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index d98e0c4c116..9d05ece7d6b 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -6,14 +6,13 @@ #define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? #define BEING_SHOCKED (1<<3) // Whether this thing is currently (already) being shocked by a tesla #define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no -#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? -#define UNIQUE_RENAME (1<<6) // can you customize the description/name of the thing? -#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. -#define BLOCK_Z_OUT_DOWN (1<<8) // Should this object block z falling from loc? -#define BLOCK_Z_OUT_UP (1<<9) // Should this object block z uprise from loc? -#define BLOCK_Z_IN_DOWN (1<<10) // Should this object block z falling from above? -#define BLOCK_Z_IN_UP (1<<11) // Should this object block z uprise from below? -#define NO_BUILD (1<<12) // Can we build on this object? +#define UNIQUE_RENAME (1<<5) // can you customize the description/name of the thing? +#define USES_TGUI (1<<6) //put on things that use tgui on ui_interact instead of custom/old UI. +#define BLOCK_Z_OUT_DOWN (1<<7) // Should this object block z falling from loc? +#define BLOCK_Z_OUT_UP (1<<8) // Should this object block z uprise from loc? +#define BLOCK_Z_IN_DOWN (1<<9) // Should this object block z falling from above? +#define BLOCK_Z_IN_UP (1<<10) // Should this object block z uprise from below? +#define NO_BUILD (1<<11) // Can we build on this object? // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 08c360849b5..0a000b99a83 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -6,6 +6,8 @@ /// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EM_BLOCK_COLOR]. /proc/emissive_blocker(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) + // Note: alpha doesn't "do" anything, since it's overriden by the color set shortly after + // Consider removing it someday? var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags | EMISSIVE_APPEARANCE_FLAGS) appearance.color = GLOB.em_block_color return appearance diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 35116eb6ba1..6c11494ced5 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -279,7 +279,6 @@ DEFINE_BITFIELD(obj_flags, list( "EMAGGED" = EMAGGED, "IN_USE" = IN_USE, "NO_BUILD" = NO_BUILD, - "ON_BLUEPRINTS" = ON_BLUEPRINTS, "UNIQUE_RENAME" = UNIQUE_RENAME, "USES_TGUI" = USES_TGUI, )) diff --git a/code/datums/armor.dm b/code/datums/armor.dm index b3e379f73b7..ff0a11071a9 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -6,7 +6,6 @@ . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, fire, acid, wound, consume) /datum/armor - datum_flags = DF_USE_TAG var/melee var/bullet var/laser @@ -29,7 +28,7 @@ src.acid = acid src.wound = wound src.consume = consume - tag = ARMORID + GenerateTag() /datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0, wound = 0, consume = 0) return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.fire+fire, src.acid+acid, src.wound+wound, src.consume+consume) @@ -61,10 +60,14 @@ /datum/armor/proc/detachArmor(datum/armor/AA) return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, fire-AA.fire, acid-AA.acid, wound-AA.wound, consume-AA.consume) +/datum/armor/GenerateTag() + . = ..() + tag = ARMORID + /datum/armor/vv_edit_var(var_name, var_value) if (var_name == NAMEOF(src, tag)) return FALSE . = ..() - tag = ARMORID // update tag in case armor values were edited + GenerateTag() #undef ARMORID diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 8dfeb56a523..8cc88b9dc53 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -265,3 +265,11 @@ return SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index)) TIMER_COOLDOWN_END(source, index) + +///Generate a tag for this /datum, if it implements one +///Should be called as early as possible, best would be in New, to avoid weakref mistargets +///Really just don't use this, you don't need it, global lists will do just fine MOST of the time +///We really only use it for mobs to make id'ing people easier +/datum/proc/GenerateTag() + datum_flags |= DF_USE_TAG + diff --git a/code/game/atoms.dm b/code/game/atoms.dm index bb3db2c57bc..05d1b1bc14d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -173,16 +173,12 @@ * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate * result is that the Intialize proc is called. * - * We also generate a tag here if the DF_USE_TAG flag is set on the atom */ /atom/New(loc, ...) //atom creation method that preloads variables at creation if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() world.preloader_load(src) - if(datum_flags & DF_USE_TAG) - GenerateTag() - var/do_initialize = SSatoms.initialized if(do_initialize != INITIALIZATION_INSSATOMS) args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD @@ -1572,10 +1568,6 @@ /atom/proc/analyzer_act_secondary(mob/living/user, obj/item/tool) return -///Generate a tag for this atom -/atom/proc/GenerateTag() - return - ///Connect this atom to a shuttle /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a01d50ac396..5d995248ce2 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -94,19 +94,49 @@ /// The degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1 var/contents_pressure_protection = 0 +/mutable_appearance/emissive_blocker + +/mutable_appearance/emissive_blocker/New() + . = ..() + // Need to do this here because it's overriden by the parent call + plane = EMISSIVE_PLANE + color = EM_BLOCK_COLOR + appearance_flags = EMISSIVE_APPEARANCE_FLAGS + /atom/movable/Initialize(mapload) . = ..() switch(blocks_emissive) if(EMISSIVE_BLOCK_GENERIC) - var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) - gen_emissive_blocker.color = GLOB.em_block_color - gen_emissive_blocker.dir = dir - gen_emissive_blocker.appearance_flags |= appearance_flags - add_overlay(list(gen_emissive_blocker)) + var/static/mutable_appearance/emissive_blocker/blocker = new() + blocker.icon = icon + blocker.icon_state = icon_state + blocker.dir = dir + blocker.appearance_flags |= appearance_flags + // Ok so this is really cursed, but I want to set with this blocker cheaply while + // Still allowing it to be removed from the overlays list later + // So I'm gonna flatten it, then insert the flattened overlay into overlays AND the managed overlays list, directly + // I'm sorry + var/mutable_appearance/flat = blocker.appearance + overlays += flat + if(managed_overlays) + if(islist(managed_overlays)) + managed_overlays += flat + else + managed_overlays = list(managed_overlays, flat) + else + managed_overlays = flat if(EMISSIVE_BLOCK_UNIQUE) render_target = ref(src) em_block = new(src, render_target) - add_overlay(list(em_block)) + overlays += em_block + if(managed_overlays) + if(islist(managed_overlays)) + managed_overlays += em_block + else + managed_overlays = list(managed_overlays, em_block) + else + managed_overlays = em_block + if(opacity) AddElement(/datum/element/light_blocking) switch(light_system) @@ -115,7 +145,6 @@ if(MOVABLE_LIGHT_DIRECTIONAL) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) - /atom/movable/Destroy(force) QDEL_NULL(language_holder) QDEL_NULL(em_block) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e691a0af0d2..a8bf5a3517e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -149,10 +149,9 @@ flags_1 = HTML_USE_INITAL_ICON_1 rad_insulation = RAD_MEDIUM_INSULATION - network_id = NETWORK_DOOR_AIRLOCKS - /obj/machinery/door/airlock/Initialize(mapload) . = ..() + init_network_id(NETWORK_DOOR_AIRLOCKS) wires = set_wires() if(frequency) set_frequency(frequency) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 26ebb3e7307..ee57f51cc5c 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -16,7 +16,6 @@ pass_flags_self = PASSGLASS can_atmos_pass = ATMOS_PASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - network_id = NETWORK_DOOR_AIRLOCKS set_dir_on_move = FALSE var/obj/item/electronics/airlock/electronics = null var/reinf = 0 @@ -27,6 +26,7 @@ /obj/machinery/door/window/Initialize(mapload, set_dir, unres_sides) . = ..() + init_network_id(NETWORK_DOOR_AIRLOCKS) flags_1 &= ~PREVENT_CLICK_UNDER_1 if(set_dir) setDir(set_dir) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 520db51c460..7532a9b17cb 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -139,6 +139,7 @@ poster_item_desc = initial(selected.poster_item_desc) poster_item_icon_state = initial(selected.poster_item_icon_state) ruined = initial(selected.ruined) + update_appearance() /obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 7fac85e903c..c80cee27215 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -14,10 +14,10 @@ var/mode = WAND_OPEN var/region_access = REGION_GENERAL var/list/access_list - network_id = NETWORK_DOOR_REMOTES /obj/item/door_remote/Initialize(mapload) . = ..() + init_network_id(NETWORK_DOOR_REMOTES) access_list = SSid_access.get_region_access_list(list(region_access)) RegisterSignal(src, COMSIG_COMPONENT_NTNET_NAK, .proc/bad_signal) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4c5ebe084db..57f7d825089 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -3,7 +3,6 @@ animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT var/obj_flags = CAN_BE_HIT - var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. var/damtype = BRUTE var/force = 0 @@ -48,35 +47,18 @@ return FALSE return ..() -/obj/Initialize(mapload) - . = ..() - - if (set_obj_flags) - var/flagslist = splittext(set_obj_flags,";") - var/list/string_to_objflag = GLOB.bitfields["obj_flags"] - for (var/flag in flagslist) - if(flag[1] == "!") - flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial ! - obj_flags &= ~string_to_objflag[flag] - else - obj_flags |= string_to_objflag[flag] - - if((obj_flags & ON_BLUEPRINTS) && isturf(loc)) - var/turf/T = loc - T.add_blueprints_preround(src) - - if(network_id) - var/area/A = get_area(src) - if(A) - if(!A.network_root_id) - log_telecomms("Area '[A.name]([REF(A)])' has no network network_root_id, force assigning in object [src]([REF(src)])") - SSnetworks.lookup_area_root_id(A) - network_id = NETWORK_NAME_COMBINE(A.network_root_id, network_id) // I regret nothing!! - else - log_telecomms("Created [src]([REF(src)] in nullspace, assuming network to be in station") - network_id = NETWORK_NAME_COMBINE(STATION_NETWORK_ROOT, network_id) // I regret nothing!! - AddComponent(/datum/component/ntnet_interface, network_id, id_tag) - +// Call this if you want to add your object to a network +/obj/proc/init_network_id(network_id) + var/area/A = get_area(src) + if(A) + if(!A.network_root_id) + log_telecomms("Area '[A.name]([REF(A)])' has no network network_root_id, force assigning in object [src]([REF(src)])") + SSnetworks.lookup_area_root_id(A) + network_id = NETWORK_NAME_COMBINE(A.network_root_id, network_id) // I regret nothing!! + else + log_telecomms("Created [src]([REF(src)] in nullspace, assuming network to be in station") + network_id = NETWORK_NAME_COMBINE(STATION_NETWORK_ROOT, network_id) // I regret nothing!! + AddComponent(/datum/component/ntnet_interface, network_id, id_tag) /obj/Destroy(force) if(!ismachinery(src)) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 76263b9a5c7..32dbb954164 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -19,7 +19,7 @@ layer = GAS_PIPE_HIDDEN_LAYER //under wires resistance_flags = FIRE_PROOF max_integrity = 200 - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT ///Check if the object can be unwrenched var/can_unwrench = FALSE ///Bitflag of the initialized directions (NORTH | SOUTH | EAST | WEST) @@ -92,6 +92,7 @@ var/turf/turf_loc = null if(isturf(loc)) turf_loc = loc + turf_loc.add_blueprints_preround(src) SSspatial_grid.add_grid_awareness(src, SPATIAL_GRID_CONTENTS_TYPE_ATMOS) SSspatial_grid.add_grid_membership(src, turf_loc, SPATIAL_GRID_CONTENTS_TYPE_ATMOS) return ..() diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 52e72bcbdfe..c0e2b63bbb3 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -283,6 +283,17 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/atom_injector/proc/generate_stack_trace() . = "[name] found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name]" +/obj/effect/mapping_helpers/atom_injector/obj_flag + name = "Obj Flag Injector" + icon_state = "objflag_helper" + var/inject_flags = NONE + +/obj/effect/mapping_helpers/atom_injector/obj_flag/inject(atom/target) + if(!isobj(target)) + return + var/obj/obj_target = target + obj_target.obj_flags |= inject_flags + ///This helper applies components to things on the map directly. /obj/effect/mapping_helpers/atom_injector/component_injector name = "Component Injector" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bdbae02ead7..4b80fc7750e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -50,6 +50,10 @@ return ..() +/mob/New() + // This needs to happen IMMEDIATELY. I'm sorry :( + GenerateTag() + return ..() /** * Intialize a mob @@ -97,6 +101,7 @@ * This is simply "mob_"+ a global incrementing counter that goes up for every mob */ /mob/GenerateTag() + . = ..() tag = "mob_[next_mob_id++]" /** diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 96fd9b0e214..c901e969c94 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -7,7 +7,6 @@ * Has a lot of the creature game world logic, such as health etc */ /mob - datum_flags = DF_USE_TAG density = TRUE layer = MOB_LAYER plane = GAME_PLANE_FOV_HIDDEN diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index ea711dddfe1..b542c4550ca 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -3,7 +3,6 @@ desc = "A basic wireless network card for usage with standard NTNet frequencies." power_usage = 50 icon_state = "radio_mini" - network_id = NETWORK_CARDS // Network we are on var/hardware_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user. var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user. var/long_range = 0 @@ -11,6 +10,9 @@ malfunction_probability = 1 device_type = MC_NET +/obj/item/computer_hardware/network_card/Initialize(mapload) + . = ..() + init_network_id(NETWORK_CARDS) /obj/item/computer_hardware/network_card/diagnostics(mob/user) ..() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 8cca10f28b9..600655e9acf 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri color = "yellow" layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT var/linked_dirs = 0 //bitflag var/node = FALSE //used for sprites display var/cable_layer = CABLE_LAYER_2 //bitflag @@ -47,6 +47,10 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri Connect_cable() AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) RegisterSignal(src, COMSIG_RAT_INTERACT, .proc/on_rat_eat) + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) + /obj/structure/cable/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) SIGNAL_HANDLER diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index 573e3025c9e..4130b687649 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -41,7 +41,7 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "0-1" layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT color = COLOR_RED /// Pipe_cleaner direction 1 (see above) var/d1 = 0 @@ -91,6 +91,9 @@ By design, d1 is the smallest direction and d2 is the highest var/random_color = pick(pipe_cleaner_colors) color = pipe_cleaner_colors[random_color] update_appearance() + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) /obj/structure/pipe_cleaner/Destroy() // called when a pipe_cleaner is deleted //If we have a stored item at this point, lets just delete it, since that should be diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 60ae485aff3..a8f844c76b5 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -10,13 +10,19 @@ name = null icon = 'icons/obj/power.dmi' anchored = TRUE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT var/datum/powernet/powernet = null use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 var/machinery_layer = MACHINERY_LAYER_1 //cable layer to which the machine is connected +/obj/machinery/power/Initialize(mapload) + . = ..() + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) + /obj/machinery/power/Destroy() disconnect_from_network() addtimer(CALLBACK(GLOBAL_PROC, .proc/update_cable_icons_on_turf, get_turf(src)), 3) diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 1b11630e67a..b06b8444aa0 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/disposal.dmi' anchored = TRUE density = FALSE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT dir = NONE // dir will contain dominant direction for junction pipes max_integrity = 200 armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 90, ACID = 30) @@ -42,6 +42,9 @@ dpdir |= turn(dir, 180) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) // pipe is deleted // ensure if holder is present, it is expelled diff --git a/code/modules/wiremod/components/ntnet/ntnet_receive.dm b/code/modules/wiremod/components/ntnet/ntnet_receive.dm index dae0c668682..1fe5d40b847 100644 --- a/code/modules/wiremod/components/ntnet/ntnet_receive.dm +++ b/code/modules/wiremod/components/ntnet/ntnet_receive.dm @@ -10,8 +10,6 @@ circuit_flags = CIRCUIT_FLAG_OUTPUT_SIGNAL //trigger_output - network_id = __NETWORK_CIRCUITS - /// The list type var/datum/port/input/option/list_options @@ -21,6 +19,10 @@ /// Encryption key var/datum/port/input/enc_key +/obj/item/circuit_component/ntnet_receive/Initialize(mapload) + . = ..() + init_network_id(__NETWORK_CIRCUITS) + /obj/item/circuit_component/ntnet_receive/populate_options() list_options = add_option_port("List Type", GLOB.wiremod_basic_types) diff --git a/code/modules/wiremod/components/ntnet/ntnet_send.dm b/code/modules/wiremod/components/ntnet/ntnet_send.dm index f5f544c767f..0cad7f11e4a 100644 --- a/code/modules/wiremod/components/ntnet/ntnet_send.dm +++ b/code/modules/wiremod/components/ntnet/ntnet_send.dm @@ -11,8 +11,6 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL - network_id = __NETWORK_CIRCUITS - /// The list type var/datum/port/input/option/list_options @@ -22,6 +20,10 @@ /// Encryption key var/datum/port/input/enc_key +/obj/item/circuit_component/ntnet_send/Initialize(mapload) + . = ..() + init_network_id(__NETWORK_CIRCUITS) + /obj/item/circuit_component/ntnet_send/populate_options() list_options = add_option_port("List Type", GLOB.wiremod_basic_types) diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 0f52777704eb400fcbbc1cf955f771d0a6a58a0b..8eabf729bbd85f65af2f8d3a09228286823c2229 100644 GIT binary patch literal 19963 zcma%jWn5IzyY3KD(nvQ*NlAA|OM`SvcQ*{7bax{if-ut3T>{cw(j_7>#K6Ga{LeY} z+>iIep82t7?G^8O*ZV%tv)3Y8T~!_ngA4-%0%5&ZkkJHz5NLo4goXm#A>gcT2L71# z*V6NpvGTBRw{!Khb8!ZNeDl&X)Lio3;to#!WBIn5qq9DtBjy&(Uv-@n_=0z-;cf4i zcg^}T5@4L8Zsv90AE8$P9RfuCI}4(sK@wuQJF{QA%#>d{l6l-dl+_Zs`@M~C-CUdx znZvn*GFpw;l6iQ1&`mJsj$fXi7n15(Jdpq?oope>Vl(^KSvcsPOcNxYh6MH9>iXX5 z9S$ZOZhXb?=8;!^QEi`;$2eNf)!x7UxVj$v1<8XbB1CqFr^u(Kgw^@J&HeBrU;Hxs zWY({4C!)0w$-D0`1|#yfu-nOQ?;A`sK`(5bJs}s#U|E~dAG9xb>W4}jzvEYgfd}|f zKU|K8aaFm!tjmn^p1Pnb!S^z6u=Vi7<*5%Em;7d(%CM`<;$U-C|2>6rA7sU^kjbd$ zncV+6&Imh}>T|>xUZrw!`US;%YYxsMocxk9TbmaG(_saFy_QTODLt1|Bf;}GgL$Du zF?*a4Pfi=0&SqNou+eDq)gUJHhDp!PuG-Gm51*>aP#m~AA#bqOQDkvCv|lS35?(fH zgs!5FXYu?RcvZZ#8_H@EnP%uZxJWI(PJU3)?=;=aennKj0Qmi-vp6%APiXwKPl;Z z_9k_^jk`B@Lx8onwGY9sgEn_7AMgD&9+CE&pvjvKbnHkZieK|Tvm`d27;|9zbQeqZ zph$$Y)+bP5#7dJ~kYn!$m&G4rhehh1IN`%Af4eb@_5aPS^1wTgKYU+39Yfef(4&1i za~0etEhDhjdPkw!Ui#IA0|Ue8DKrkmY(2s&o!*gLd?K;7FD)j3=`5L7ojYPt&1H>Q zi8kVhJ;p0dWP{}TK@3E5R_?#(QL=?Hr&{>NnQqF{(1tDVI6kXSqx?x7=SdE zKOgt^pIFj4Dqal^DGDpyTH)rRw#UuBK*-`7x#7{iG zRi^xCF4neOkx#)DL)Zv^-xSR>OJ?r9Om{P?x{dLSlb#8gXuk-Bx=Oy6cL@>JNIY#<047LQ(d{+62q>7$Zz2y2eUlHICa*r+>=+ zm38{+^pv9{uXj5*tAA_BX6>j^wkF5wii_fjX2?zOgs1d|6to4`*-3Kwz(XtCEejJ$ z=H6XJ#6uvp!VaCXg@kn=Ago}9=c@gqLD{Bo!ywKh{D0T<`SzoX zVOvkVh`z8+SA5H@7sZNfi`9xkN0YVNB|4Som3wL3Tz}xJ=C5^qZ30O0WJ+ZVVr5Pp zgOHsm4otLvPEu=upHw#lq{Vy7T_i3lg-2WbVoemND*&fhx;mA=wH{##Sq*#DoQ=Xa z3o3Bxv3%gCXFn-&f1fr(4QDg~SHGjEL1u36j! zPx04LWX74M<~e(O@K-E#WKQ2ppP%EuvH>S-?=VEIq@w(rKBP#neuxSA2^)^G9y3p9gznNxpY#*!BDz zl_WuN>Mz!w)G5jgq95hiMKI*^pm!*<9GFo}1!{%LQA|Z5;@gD3$0BM-m`pw=)4kP1 z4q_|^o&Jt27h_-E1^VXL=*^88f`0zmbJ%8Z+O%zTa zQZ)ShCb)5ndgt&ST>M2RV4@Oy)infd?b3jWB7PcUW8^>0xom>U$^m57-Y=PMpS|?~o_^MSflq4D$sn+2c$8MV9zC0)fbA(d1A zIq6=3#&ka%x>85_*P`cTN!$=moZXuEX%gv|!_ z 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 literal 19712 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 R642QU