From eb7974df7dbd0efd3bdaf884370da0cd1f5c6541 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 23 Jan 2018 09:09:15 +0100 Subject: [PATCH] Simple rotation component. (#34476) I'm going to port other rotations to it when i don't feel lazy. Closes #34064 --- code/datums/components/rotation.dm | 126 ++++++++++++++++++ code/game/machinery/doppler_array.dm | 27 +--- code/game/machinery/pipe/construction.dm | 32 +---- .../objects/structures/beds_chairs/chair.dm | 57 ++++---- code/game/objects/structures/electricchair.dm | 2 +- .../transit_tube_construction.dm | 47 +------ .../objects/structures/windoor_assembly.dm | 43 ++---- code/game/objects/structures/window.dm | 68 ++-------- code/modules/power/singularity/emitter.dm | 31 ++--- .../particle_accelerator.dm | 39 +----- .../recycling/disposal/construction.dm | 67 +++------- tgstation.dme | 1 + 12 files changed, 225 insertions(+), 315 deletions(-) create mode 100644 code/datums/components/rotation.dm diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm new file mode 100644 index 0000000000..b42c05afd6 --- /dev/null +++ b/code/datums/components/rotation.dm @@ -0,0 +1,126 @@ +#define ROTATION_ALTCLICK 1 +#define ROTATION_WRENCH 2 +#define ROTATION_VERBS 4 +#define ROTATION_COUNTERCLOCKWISE 8 +#define ROTATION_CLOCKWISE 16 +#define ROTATION_FLIP 32 + +/datum/component/simple_rotation + var/datum/callback/can_user_rotate //Checks if user can rotate + var/datum/callback/can_be_rotated //Check if object can be rotated at all + var/datum/callback/after_rotation //Additional stuff to do after rotation + + var/rotation_flags = NONE + var/default_rotation_direction = ROTATION_CLOCKWISE + +/datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation) + if(!ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + + //throw if no rotation direction is specificed ? + + src.rotation_flags = rotation_flags + + if(can_user_rotate) + src.can_user_rotate = can_user_rotate + else + src.can_user_rotate = CALLBACK(src,.proc/default_can_user_rotate) + + if(can_be_rotated) + src.can_be_rotated = can_be_rotated + else + src.can_be_rotated = CALLBACK(src,.proc/default_can_be_rotated) + + if(after_rotation) + src.after_rotation = after_rotation + else + src.after_rotation = CALLBACK(src,.proc/default_after_rotation) + + //Try Clockwise,counter,flip in order + if(src.rotation_flags & ROTATION_FLIP) + default_rotation_direction = ROTATION_FLIP + if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE) + default_rotation_direction = ROTATION_COUNTERCLOCKWISE + if(src.rotation_flags & ROTATION_CLOCKWISE) + default_rotation_direction = ROTATION_CLOCKWISE + + if(src.rotation_flags & ROTATION_ALTCLICK) + RegisterSignal(COMSIG_CLICK_ALT, .proc/HandRot) + RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/ExamineMessage) + if(src.rotation_flags & ROTATION_WRENCH) + RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/WrenchRot) + + if(src.rotation_flags & ROTATION_VERBS) + var/atom/movable/AM = parent + if(src.rotation_flags & ROTATION_FLIP) + AM.verbs += /atom/movable/proc/simple_rotate_flip + if(src.rotation_flags & ROTATION_CLOCKWISE) + AM.verbs += /atom/movable/proc/simple_rotate_clockwise + if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE) + AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise + +/datum/component/simple_rotation/proc/ExamineMessage(mob/user) + if(rotation_flags & ROTATION_ALTCLICK) + to_chat(user, "Alt-click to rotate it clockwise.") + +/datum/component/simple_rotation/proc/HandRot(mob/user, rotation) + if(!can_be_rotated.Invoke(user,default_rotation_direction) || !can_user_rotate.Invoke(user,default_rotation_direction)) + return + BaseRot(user,default_rotation_direction) + +/datum/component/simple_rotation/proc/WrenchRot(obj/item/I, mob/living/user) + if(!can_be_rotated.Invoke(user,default_rotation_direction) || !can_user_rotate.Invoke(user,default_rotation_direction)) + return + if(istype(I,/obj/item/wrench)) + BaseRot(user,default_rotation_direction) + return COMPONENT_NO_AFTERATTACK + +/datum/component/simple_rotation/proc/BaseRot(mob/user,rotation_type) + var/atom/movable/AM = parent + var/rot_degree + switch(rotation_type) + if(ROTATION_CLOCKWISE) + rot_degree = -90 + if(ROTATION_COUNTERCLOCKWISE) + rot_degree = 90 + if(ROTATION_FLIP) + rot_degree = 180 + AM.setDir(turn(AM.dir,rot_degree)) + after_rotation.Invoke(user,rotation_type) + +/datum/component/simple_rotation/proc/default_can_user_rotate(mob/living/user, rotation_type) + if(!istype(user) || !user.Adjacent(parent) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return FALSE + return TRUE + +/datum/component/simple_rotation/proc/default_can_be_rotated(mob/user, rotation_type) + var/atom/movable/AM = parent + return !AM.anchored + +/datum/component/simple_rotation/proc/default_after_rotation(mob/user, rotation_type) + to_chat(user,"You [rotation_type == ROTATION_FLIP ? "flip" : "rotate"] [parent].") + +/atom/movable/proc/simple_rotate_clockwise() + set name = "Rotate Clockwise" + set category = "Object" + set src in oview(1) + GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + if(rotcomp) + rotcomp.HandRot(usr,ROTATION_CLOCKWISE) + +/atom/movable/proc/simple_rotate_counterclockwise() + set name = "Rotate Counter-Clockwise" + set category = "Object" + set src in oview(1) + GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + if(rotcomp) + rotcomp.HandRot(usr,ROTATION_COUNTERCLOCKWISE) + +/atom/movable/proc/simple_rotate_flip() + set name = "Flip" + set category = "Object" + set src in oview(1) + GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + if(rotcomp) + rotcomp.HandRot(usr,ROTATION_FLIP) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index cdfb72a6ef..75e3414b59 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -2,7 +2,7 @@ GLOBAL_LIST_EMPTY(doppler_arrays) /obj/machinery/doppler_array name = "tachyon-doppler array" - desc = "A highly precise directional sensor array which measures the release of quants from decaying tachyons. The doppler shifting of the mirror-image formed by these quants can reveal the size, location and temporal affects of energetic disturbances within a large radius ahead of the array.\nAlt-click to rotate it clockwise." + desc = "A highly precise directional sensor array which measures the release of quants from decaying tachyons. The doppler shifting of the mirror-image formed by these quants can reveal the size, location and temporal affects of energetic disturbances within a large radius ahead of the array.\n" icon = 'icons/obj/machines/research.dmi' icon_state = "tdoppler" density = TRUE @@ -15,6 +15,9 @@ GLOBAL_LIST_EMPTY(doppler_arrays) . = ..() GLOB.doppler_arrays += src +/obj/machinery/doppler_array/ComponentInitialize() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE,null,null,CALLBACK(src,.proc/rot_message)) + /obj/machinery/doppler_array/Destroy() GLOB.doppler_arrays -= src return ..() @@ -40,28 +43,10 @@ GLOBAL_LIST_EMPTY(doppler_arrays) else return ..() -/obj/machinery/doppler_array/verb/rotate() - set name = "Rotate Tachyon-doppler Dish" - set category = "Object" - set src in oview(1) - - if(!usr || !isturf(usr.loc)) - return - if(usr.stat || usr.restrained() || !usr.canmove) - return - setDir(turn(dir, -90)) - to_chat(usr, "You adjust [src]'s dish to face to the [dir2text(dir)].") +/obj/machinery/doppler_array/proc/rot_message(mob/user) + to_chat(user, "You adjust [src]'s dish to face to the [dir2text(dir)].") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) -/obj/machinery/doppler_array/AltClick(mob/living/user) - if(!istype(user) || user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - rotate() - /obj/machinery/doppler_array/proc/sense_explosion(turf/epicenter,devastation_range,heavy_impact_range,light_impact_range, took,orig_dev_range,orig_heavy_range,orig_light_range) if(stat & NOPOWER) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 81546d2eac..d724770a7b 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -36,9 +36,9 @@ Buildable meters /obj/item/pipe/quaternary RPD_type = PIPE_ONEDIR -/obj/item/pipe/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") +/obj/item/pipe/ComponentInitialize() + //Flipping handled manually due to custom handling for trinary pipes + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE ,null,null, CALLBACK(src, .proc/fixdir)) /obj/item/pipe/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from) if(make_from) @@ -84,19 +84,6 @@ Buildable meters name = "[initial(fakeA.name)] fitting" icon_state = initial(fakeA.pipe_state) -// rotate the pipe item clockwise - -/obj/item/pipe/verb/rotate() - set category = "Object" - set name = "Rotate Pipe" - set src in view(1) - - if ( usr.stat || usr.restrained() || !usr.canmove ) - return - - setDir(turn(dir, -90)) - fixdir() - /obj/item/pipe/verb/flip() set category = "Object" set name = "Flip Pipe" @@ -115,16 +102,6 @@ Buildable meters setDir(turn(dir, flipped ? 45 : -45)) flipped = !flipped -/obj/item/pipe/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - rotate() - /obj/item/pipe/Move() var/old_dir = dir ..() @@ -145,7 +122,8 @@ Buildable meters setDir(turn(dir, 45)) /obj/item/pipe/attack_self(mob/user) - return rotate() + setDir(turn(dir,-90)) + fixdir() /obj/item/pipe/attackby(obj/item/W, mob/user, params) if (!istype(W, /obj/item/wrench)) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 2fb2d5253d..d2c0772c37 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -18,15 +18,33 @@ ..() to_chat(user, "It's held together by a couple of bolts.") if(!has_buckled_mobs()) - to_chat(user, "Drag your sprite to sit in it. Alt-click to rotate.") - else - to_chat(user, "Alt-click to rotate.") + to_chat(user, "Drag your sprite to sit in it.") /obj/structure/chair/Initialize() . = ..() if(!anchored) //why would you put these on the shuttle? addtimer(CALLBACK(src, .proc/RemoveFromLatejoin), 0) +/obj/structure/chair/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null) + +/obj/structure/chair/proc/can_be_rotated(mob/user) + return TRUE + +/obj/structure/chair/proc/can_user_rotate(mob/user) + var/mob/living/L = user + + if(istype(L)) + if(!user.Adjacent(src) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return FALSE + else + return TRUE + else if(isobserver(user) && CONFIG_GET(flag/ghost_interaction)) + return TRUE + return FALSE + /obj/structure/chair/Destroy() RemoveFromLatejoin() return ..() @@ -72,10 +90,10 @@ return ..() /obj/structure/chair/attack_tk(mob/user) - if(!anchored || has_buckled_mobs()) + if(!anchored || has_buckled_mobs() || !isturf(user.loc)) ..() else - rotate() + setDir(turn(dir,-90)) /obj/structure/chair/proc/handle_rotation(direction) handle_layer() @@ -98,37 +116,10 @@ . = ..() handle_layer() -/obj/structure/chair/proc/spin() - setDir(turn(dir, -90)) - /obj/structure/chair/setDir(newdir) ..() handle_rotation(newdir) -/obj/structure/chair/verb/rotate() - set name = "Rotate Chair" - set category = "Object" - set src in oview(1) - - if(CONFIG_GET(flag/ghost_interaction)) - spin() - else - if(!usr || !isturf(usr.loc)) - return - if(usr.stat || usr.restrained()) - return - spin() - -/obj/structure/chair/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - rotate() - // Chair types /obj/structure/chair/wood icon_state = "wooden_chair" @@ -375,7 +366,7 @@ . = ..() /obj/structure/chair/brass/process() - spin() + setDir(turn(dir,-90)) playsound(src, 'sound/effects/servostep.ogg', 50, FALSE) /obj/structure/chair/brass/ratvar_act() diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index f2b0efb6b7..da99839e92 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -1,6 +1,6 @@ /obj/structure/chair/e_chair name = "electric chair" - desc = "Looks absolutely SHOCKING!\nAlt-click to rotate it clockwise." + desc = "Looks absolutely SHOCKING!" icon_state = "echair0" var/obj/item/assembly/shock_kit/part = null var/last_time = 1 diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 62e46e49dd..7df9e104a4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -14,54 +14,21 @@ var/flipped_build_type var/base_icon -/obj/structure/c_transit_tube/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") -/obj/structure/c_transit_tube/proc/tube_rotate() - setDir(turn(dir, -90)) +/obj/structure/c_transit_tube/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_FLIP | ROTATION_VERBS,null,null,CALLBACK(src,.proc/after_rot)) -/obj/structure/c_transit_tube/proc/tube_flip() - if(flipped_build_type) +/obj/structure/c_transit_tube/proc/after_rot(mob/user,rotation_type) + if(flipped_build_type && rotation_type == ROTATION_FLIP) + setDir(turn(dir,-180)) //Turn back we don't actually flip flipped = !flipped var/cur_flip = initial(flipped) ? !flipped : flipped if(cur_flip) build_type = flipped_build_type else build_type = initial(build_type) - icon_state = "[base_icon][flipped]" - else - setDir(turn(dir, 180)) - -// disposals-style flip and rotate verbs -/obj/structure/c_transit_tube/verb/rotate() - set name = "Rotate Tube" - set category = "Object" - set src in view(1) - - if(usr.incapacitated()) - return - - tube_rotate() - -/obj/structure/c_transit_tube/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - tube_rotate() - -/obj/structure/c_transit_tube/verb/flip() - set name = "Flip" - set category = "Object" - set src in view(1) - - if(usr.incapacitated()) - return - tube_flip() - + icon_state = "[base_icon][flipped]" /obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 0949f540c7..23a1113665 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -29,10 +29,6 @@ var/state = "01" //How far the door assembly has progressed CanAtmosPass = ATMOS_PASS_PROC -/obj/structure/windoor_assembly/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") - /obj/structure/windoor_assembly/New(loc, set_dir) ..() if(set_dir) @@ -319,38 +315,25 @@ update_icon() -//Rotates the windoor assembly clockwise -/obj/structure/windoor_assembly/verb/revrotate() - set name = "Rotate Windoor Assembly" - set category = "Object" - set src in oview(1) - if(usr.stat || !usr.canmove || usr.restrained()) - return - if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") - return FALSE - var/target_dir = turn(dir, 270) +/obj/structure/windoor_assembly/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation)) + +/obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) + if(anchored) + to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") + return FALSE + var/target_dir = turn(dir, rotation_type == ROTATION_CLOCKWISE ? -90 : 90) if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") + to_chat(user, "[src] cannot be rotated in that direction!") return FALSE - - setDir(target_dir) - - ini_dir = dir - update_icon() return TRUE -/obj/structure/windoor_assembly/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - revrotate() +/obj/structure/windoor_assembly/proc/after_rotation(mob/user) + ini_dir = dir + update_icon() //Flips the windoor assembly, determines whather the door opens to the left or the right /obj/structure/windoor_assembly/verb/flip() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 821faeb812..3326a2a0a8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -26,6 +26,7 @@ var/real_explosion_block //ignore this, just use explosion_block var/breaksound = "shatter" var/hitsound = 'sound/effects/Glasshit.ogg' + var/rad_insulation = RAD_VERY_LIGHT_INSULATION /obj/structure/window/examine(mob/user) ..() @@ -44,9 +45,6 @@ else to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") - if(!anchored) - to_chat(user, "Alt-click to rotate it clockwise.") - /obj/structure/window/Initialize(mapload, direct) . = ..() if(direct) @@ -80,7 +78,8 @@ /obj/structure/window/ComponentInitialize() . = ..() - AddComponent(/datum/component/rad_insulation, RAD_VERY_LIGHT_INSULATION, TRUE, FALSE) + AddComponent(/datum/component/rad_insulation, rad_insulation, TRUE, FALSE) + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation)) /obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) @@ -291,62 +290,23 @@ qdel(src) update_nearby_icons() -/obj/structure/window/verb/rotate() - set name = "Rotate Window Counter-Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || !usr.canmove || usr.restrained()) - return +/obj/structure/window/proc/can_be_rotated(mob/user,rotation_type) if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") + to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") return FALSE - var/target_dir = turn(dir, 90) + var/target_dir = turn(dir, rotation_type == ROTATION_CLOCKWISE ? -90 : 90) if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") + to_chat(user, "[src] cannot be rotated in that direction!") return FALSE + return TRUE - setDir(target_dir) +/obj/structure/window/proc/after_rotation(mob/user,rotation_type) air_update_turf(1) ini_dir = dir - add_fingerprint(usr) - return TRUE - -/obj/structure/window/verb/revrotate() - set name = "Rotate Window Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || !usr.canmove || usr.restrained()) - return - - if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") - return FALSE - - var/target_dir = turn(dir, 270) - - if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") - return FALSE - - setDir(target_dir) - ini_dir = dir - add_fingerprint(usr) - return TRUE - -/obj/structure/window/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - revrotate() + add_fingerprint(user) /obj/structure/window/Destroy() density = FALSE @@ -432,9 +392,7 @@ max_integrity = 50 explosion_block = 1 glass_type = /obj/item/stack/sheet/rglass - -/obj/structure/window/reinforced/ComponentInitialize() - AddComponent(/datum/component/rad_insulation, RAD_HEAVY_INSULATION, TRUE, FALSE) + rad_insulation = RAD_HEAVY_INSULATION /obj/structure/window/reinforced/spawner/east dir = EAST @@ -458,9 +416,7 @@ max_integrity = 150 explosion_block = 1 glass_type = /obj/item/stack/sheet/plasmaglass - -/obj/structure/window/plasma/ComponentInitialize() - AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE) + rad_insulation = RAD_NO_INSULATION /obj/structure/window/plasma/spawner/east dir = EAST diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 1c5f0a3375..74bc0551e0 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -1,6 +1,6 @@ /obj/machinery/power/emitter name = "emitter" - desc = "A heavy-duty industrial laser, often used in containment fields and power generation.\nAlt-click to rotate it clockwise." + desc = "A heavy-duty industrial laser, often used in containment fields and power generation." icon = 'icons/obj/singularity.dmi' icon_state = "emitter" @@ -75,28 +75,15 @@ power_usage -= 50 * M.rating active_power_usage = power_usage -/obj/machinery/power/emitter/verb/rotate() - set name = "Rotate" - set category = "Object" - set src in oview(1) +/obj/machinery/power/emitter/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_FLIP ,null,CALLBACK(src, .proc/can_be_rotated)) - if(usr.stat || !usr.canmove || usr.restrained()) - return - if (src.anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - src.setDir(turn(src.dir, 270)) - return 1 - -/obj/machinery/power/emitter/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - rotate() +/obj/machinery/power/emitter/proc/can_be_rotated(mob/user,rotation_type) + if (anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + return TRUE /obj/machinery/power/emitter/Destroy() if(SSticker.IsRoundInProgress()) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 33c8a19982..3658be4522 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -46,8 +46,6 @@ if(PA_CONSTRUCTION_PANEL_OPEN) to_chat(user, "The panel is open.") - to_chat(user, "Alt-click to rotate it clockwise.") - /obj/structure/particle_accelerator/Destroy() construction_state = PA_CONSTRUCTION_UNSECURED if(master) @@ -56,41 +54,10 @@ master = null return ..() -/obj/structure/particle_accelerator/verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) +/obj/structure/particle_accelerator/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) - if(usr.stat || !usr.canmove || usr.restrained()) - return - if (anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - setDir(turn(dir, -90)) - return 1 - -/obj/structure/particle_accelerator/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - rotate() - -/obj/structure/particle_accelerator/verb/rotateccw() - set name = "Rotate Counter Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || !usr.canmove || usr.restrained()) - return - if (anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - setDir(turn(dir, -90)) - return 1 /obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params) var/did_something = FALSE diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 87400958fc..783e4da714 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -14,13 +14,8 @@ var/obj/pipe_type = /obj/structure/disposalpipe/segment var/pipename - -/obj/structure/disposalconstruct/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") - -/obj/structure/disposalconstruct/New(loc, _pipe_type, _dir = SOUTH, flip = FALSE, obj/make_from) - ..() +/obj/structure/disposalconstruct/Initialize(loc, _pipe_type, _dir = SOUTH, flip = FALSE, obj/make_from) + . = ..() if(make_from) pipe_type = make_from.type setDir(make_from.dir) @@ -34,7 +29,8 @@ pipename = initial(pipe_type.name) if(flip) - flip() + GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + rotcomp.BaseRot(null,ROTATION_FLIP) update_icon() @@ -91,51 +87,24 @@ dpdir |= turn(dir, 180) return dpdir -// flip and rotate verbs -/obj/structure/disposalconstruct/verb/rotate() - set name = "Rotate Pipe" - set category = "Object" - set src in view(1) +/obj/structure/disposalconstruct/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_FLIP | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated), CALLBACK(src, .proc/after_rot)) - if(usr.incapacitated()) - return - - if(anchored) - to_chat(usr, "You must unfasten the pipe before rotating it!") - return - - setDir(turn(dir, -90)) +/obj/structure/disposalconstruct/proc/after_rot(mob/user,rotation_type) + if(rotation_type == ROTATION_FLIP) + var/obj/structure/disposalpipe/temp = pipe_type + if(initial(temp.flip_type)) + if(dir in GLOB.diagonals) // Fix RPD-induced diagonal turning + setDir(turn(dir, 45)) + pipe_type = initial(temp.flip_type) update_icon() -/obj/structure/disposalconstruct/AltClick(mob/user) - ..() - if(!in_range(src, user)) - return - else - rotate() - -/obj/structure/disposalconstruct/verb/flip() - set name = "Flip Pipe" - set category = "Object" - set src in view(1) - - if(usr.incapacitated()) - return - +/obj/structure/disposalconstruct/proc/can_be_rotated(mob/user,rotation_type) if(anchored) - to_chat(usr, "You must unfasten the pipe before flipping it!") - return - - setDir(turn(dir, 180)) - - var/obj/structure/disposalpipe/temp = pipe_type - if(initial(temp.flip_type)) - if(dir in GLOB.diagonals) // Fix RPD-induced diagonal turning - setDir(turn(dir, 45)) - pipe_type = initial(temp.flip_type) - - update_icon() - + to_chat(user, "You must unfasten the pipe before rotating it!") + return FALSE + return TRUE // attackby item // wrench: (un)anchor diff --git a/tgstation.dme b/tgstation.dme index fa513af6fe..78407474cf 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -366,6 +366,7 @@ #include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" #include "code\datums\components\riding.dm" +#include "code\datums\components\rotation.dm" #include "code\datums\components\signal_redirect.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\spooky.dm"