From f365aa4e988853e782869fa952822a5edf52bf45 Mon Sep 17 00:00:00 2001
From: Meghan-Rossi <56671765+Meghan-Rossi@users.noreply.github.com>
Date: Sat, 17 Oct 2020 07:03:03 +0100
Subject: [PATCH] Fix solar trackers sometimes vanishing when deconstructed
(#7710)
Fix solar trackers sometimes vanishing, without leaving an assembly behind, when deconstructed. Also refactor solar code a little.
---
code/modules/power/solar.dm | 45 ++++++++++-------------------------
code/modules/power/tracker.dm | 25 +++++++------------
2 files changed, 22 insertions(+), 48 deletions(-)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 5eadfb7d07..615376f85d 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -24,13 +24,16 @@ GLOBAL_LIST_EMPTY(solars_list)
var/ndir = SOUTH // target dir
var/turn_angle = 0
var/obj/machinery/power/solar_control/control = null
+ var/glass_type = /obj/item/stack/material/glass
/obj/machinery/power/solar/drain_power()
return -1
-/obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S)
+/obj/machinery/power/solar/Initialize(mapload, glass_type)
. = ..()
- Make(S)
+ if(glass_type == /obj/item/stack/material/glass/reinforced) //if the panel is in reinforced glass
+ health *= 2
+ update_icon()
connect_to_network()
/obj/machinery/power/solar/Destroy()
@@ -50,28 +53,16 @@ GLOBAL_LIST_EMPTY(solars_list)
control.connected_panels.Remove(src)
control = null
-/obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S)
- if(!S)
- S = new /obj/item/solar_assembly(src)
- S.glass_type = /obj/item/stack/material/glass
- S.anchored = TRUE
- S.loc = src
- if(S.glass_type == /obj/item/stack/material/glass/reinforced) //if the panel is in reinforced glass
- health *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to
- update_icon()
-
-
-
/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user)
if(W.is_crowbar())
playsound(src, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar panel.")
if(do_after(user, 50))
- var/obj/item/solar_assembly/S = locate() in src
- if(S)
- S.loc = src.loc
- S.give_glass()
+ var/obj/item/solar_assembly/S = new(loc)
+ S.anchored = TRUE
+ var/obj/item/stack/glass = new glass_type(loc)
+ glass.amount = 2
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the solar panel.")
qdel(src)
@@ -169,8 +160,8 @@ GLOBAL_LIST_EMPTY(solars_list)
return
-/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
- ..(loc, S, 0)
+/obj/machinery/power/solar/fake/New(var/turf/loc, var/glass_type)
+ ..(loc, glass_type, 0)
/obj/machinery/power/solar/fake/process()
. = PROCESS_KILL
@@ -213,20 +204,11 @@ GLOBAL_LIST_EMPTY(solars_list)
w_class = ITEMSIZE_LARGE // Pretty big!
anchored = 0
var/tracker = 0
- var/glass_type = null
/obj/item/solar_assembly/attack_hand(var/mob/user)
if(!anchored || !isturf(loc)) // You can't pick it up
..()
-// Give back the glass type we were supplied with
-/obj/item/solar_assembly/proc/give_glass()
- if(glass_type)
- var/obj/item/stack/material/S = new glass_type(src.loc)
- S.amount = 2
- glass_type = null
-
-
/obj/item/solar_assembly/attackby(var/obj/item/weapon/W, var/mob/user)
if (!isturf(loc))
return 0
@@ -246,13 +228,12 @@ GLOBAL_LIST_EMPTY(solars_list)
if(istype(W, /obj/item/stack/material) && (W.get_material_name() == "glass" || W.get_material_name() == "rglass"))
var/obj/item/stack/material/S = W
if(S.use(2))
- glass_type = W.type
playsound(src, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] places the glass on the solar assembly.")
if(tracker)
- new /obj/machinery/power/tracker(get_turf(src), src)
+ new /obj/machinery/power/tracker(get_turf(src), W.type)
else
- new /obj/machinery/power/solar(get_turf(src), src)
+ new /obj/machinery/power/solar(get_turf(src), W.type)
qdel(src)
else
to_chat(user, "You need two sheets of glass to put them into a solar panel.")
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 0e2cc7cbf8..c03d7db3b6 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -11,14 +11,15 @@
anchored = 1
density = 1
use_power = USE_POWER_OFF
+ var/glass_type = /obj/item/stack/material/glass
var/id = 0
var/sun_angle = 0 // sun angle as set by sun datum
var/obj/machinery/power/solar_control/control = null
-/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S)
- ..(loc)
- Make(S)
+/obj/machinery/power/tracker/Initialize(mapload, glass_type)
+ . = ..()
+ update_icon()
connect_to_network()
/obj/machinery/power/tracker/Destroy()
@@ -38,15 +39,6 @@
control.connected_tracker = null
control = null
-/obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S)
- if(!S)
- S = new /obj/item/solar_assembly(src)
- S.glass_type = /obj/item/stack/material/glass
- S.tracker = 1
- S.anchored = 1
- S.loc = src
- update_icon()
-
//updates the tracker icon and the facing angle for the control computer
/obj/machinery/power/tracker/proc/set_angle(var/angle)
sun_angle = angle
@@ -63,10 +55,11 @@
playsound(src, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar tracker.")
if(do_after(user, 50))
- var/obj/item/solar_assembly/S = locate() in src
- if(S)
- S.loc = src.loc
- S.give_glass()
+ var/obj/item/solar_assembly/S = new(loc)
+ S.tracker = TRUE
+ S.anchored = TRUE
+ var/obj/item/stack/glass = new glass_type(loc)
+ glass.amount = 2
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the tracker.")
qdel(src)