Files
Bubberstation/code/modules/power/tracker.dm
LemonInTheDark dba14c87f8 Fixes solar tracker issues, and multiz emissives (#73288)
## About The Pull Request

Fixes solar trackers not showing up (they didn't have the right subtype
so they weren't inheriting their parents icon)
Fixes solars not blocking emissives on multiz (They didn't pass a loc
into their overlays, so the overlays were drawing their emissive
blockers to the wrong plane)

## Why It's Good For The Game
## Changelog
🆑
fix: Solar trackers actually uh, look right again
fix: Solar panels and trackers will now properly block space lighting on
multiz maps
/🆑
2023-02-09 23:19:18 -07:00

160 lines
4.8 KiB
Plaintext

#define TRACKER_Z_OFFSET 13
#define TRACKER_EDGE_Z_OFFSET (TRACKER_Z_OFFSET - 2)
//Solar tracker
//Machine that tracks the sun and reports its direction to the solar controllers
//As long as this is working, solar panels on same powernet will track automatically
/obj/machinery/power/tracker
name = "solar tracker"
desc = "A solar directional tracker."
icon = 'icons/obj/solar.dmi'
icon_state = "tracker_base"
density = TRUE
use_power = NO_POWER_USE
max_integrity = 250
integrity_failure = 0.2
var/id = 0
var/obj/machinery/power/solar_control/control
var/obj/effect/overlay/tracker_dish
var/obj/effect/overlay/tracker_dish_edge
var/azimuth_current
/obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S)
. = ..()
tracker_dish_edge = add_panel_overlay("tracker_edge", TRACKER_EDGE_Z_OFFSET)
tracker_dish = add_panel_overlay("tracker", TRACKER_Z_OFFSET)
Make(S)
connect_to_network()
RegisterSignal(SSsun, COMSIG_SUN_MOVED, PROC_REF(sun_update))
/obj/machinery/power/tracker/Destroy()
unset_control() //remove from control computer
return ..()
/obj/machinery/power/tracker/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
. = ..()
if(same_z_layer)
return
SET_PLANE(tracker_dish_edge, PLANE_TO_TRUE(tracker_dish_edge.plane), new_turf)
SET_PLANE(tracker_dish, PLANE_TO_TRUE(tracker_dish.plane), new_turf)
/obj/effect/overlay/tracker
vis_flags = VIS_INHERIT_ID | VIS_INHERIT_ICON
appearance_flags = TILE_BOUND
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
layer = FLY_LAYER
/obj/machinery/power/tracker/proc/add_panel_overlay(icon_state, z_offset)
var/obj/effect/overlay/tracker/overlay = new(src)
overlay.icon_state = icon_state
SET_PLANE_EXPLICIT(overlay, ABOVE_GAME_PLANE, src)
overlay.pixel_z = z_offset
vis_contents += overlay
return overlay
/obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC)
unset_control()
control = SC
SC.connected_tracker = src
//set the control of the tracker to null and removes it from the previous control computer if needed
/obj/machinery/power/tracker/proc/unset_control()
if(control)
if(control.track == SOLAR_TRACK_AUTO)
control.track = SOLAR_TRACK_OFF
control.connected_tracker = null
control = null
/**
* Get the 2.5D transform for the tracker, given an angle
* Arguments:
* * angle - the angle the panel is facing
*/
/obj/machinery/power/tracker/proc/get_tracker_transform(angle)
// 2.5D solar tracker works by using a magic combination of transforms
var/matrix/turner = matrix()
// Rotate towards sun
turner.Turn(angle)
// Make it skinny on the floor plane
turner.Scale(1, 0.5)
return turner
/obj/machinery/power/tracker/proc/visually_turn_part(part, angle)
var/mid_azimuth = (azimuth_current + angle) / 2
// actually flip to other direction?
if(abs(angle - azimuth_current) > 180)
mid_azimuth = (mid_azimuth + 180) % 360
// Split into 2 parts so it doesn't distort on large changes
animate(part,
transform = get_tracker_transform(mid_azimuth),
time = 2.5 SECONDS, easing = CUBIC_EASING|EASE_IN
)
animate(
transform = get_tracker_transform(angle),
time = 2.5 SECONDS, easing = CUBIC_EASING|EASE_OUT
)
///Tell the controller to turn the solar panels
/obj/machinery/power/tracker/proc/sun_update(datum/source, azimuth)
SIGNAL_HANDLER
visually_turn_part(tracker_dish, azimuth)
visually_turn_part(tracker_dish_edge, azimuth)
azimuth_current = azimuth
if(control && control.track == SOLAR_TRACK_AUTO)
control.set_panels(azimuth)
/obj/machinery/power/tracker/proc/Make(obj/item/solar_assembly/S)
if(!S)
S = new /obj/item/solar_assembly(src)
S.glass_type = /obj/item/stack/sheet/glass
S.tracker = 1
S.update_appearance()
S.set_anchored(TRUE)
S.forceMove(src)
/obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I)
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
user.visible_message(span_notice("[user] begins to take the glass off [src]."), span_notice("You begin to take the glass off [src]..."))
if(I.use_tool(src, user, 50))
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
user.visible_message(span_notice("[user] takes the glass off [src]."), span_notice("You take the glass off [src]."))
deconstruct(TRUE)
return TRUE
/obj/machinery/power/tracker/atom_break(damage_flag)
. = ..()
if(.)
playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE)
unset_control()
/obj/machinery/power/tracker/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(disassembled)
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.forceMove(loc)
S.give_glass(machine_stat & BROKEN)
else
playsound(src, SFX_SHATTER, 70, TRUE)
new /obj/item/shard(src.loc)
new /obj/item/shard(src.loc)
qdel(src)
// Tracker Electronic
/obj/item/electronics/tracker
name = "tracker electronics"
#undef TRACKER_Z_OFFSET
#undef TRACKER_EDGE_Z_OFFSET