From 6c0a9dd8cb34db86605af8cbbee63c82d7e8db09 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 5 Aug 2020 10:11:12 +0200 Subject: [PATCH] [MIRROR] Riders will now turn with their vehicle (#200) * Riders will now turn with their vehicle (#52612) * Riders will now turn with their vehicle * Remove new signal, refactor to accept a direction * Update code/datums/components/riding.dm Co-authored-by: Rohesie Co-authored-by: Rohesie * Riders will now turn with their vehicle Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com> Co-authored-by: Rohesie --- code/__DEFINES/dcs/signals.dm | 2 +- code/datums/components/riding.dm | 64 ++++++++++++++++---------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 828a381a7e6..fe16c12f57b 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -115,7 +115,7 @@ #define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0) ///from base of atom/set_light(): (l_range, l_power, l_color) #define COMSIG_ATOM_SET_LIGHT "atom_set_light" -///from base of atom/setDir(): (old_dir, new_dir) +///from base of atom/setDir(): (old_dir, new_dir). Called before the direction changes. #define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" ///from base of atom/handle_atom_del(): (atom/deleted) #define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 6eb7f8ff5f6..ea523c55975 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -28,6 +28,7 @@ /datum/component/riding/Initialize() if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/vehicle_turned) RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle) RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved) @@ -40,14 +41,15 @@ qdel(src) /datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) - handle_vehicle_offsets() + var/atom/movable/movable_parent = parent + handle_vehicle_offsets(movable_parent.dir) -/datum/component/riding/proc/handle_vehicle_layer() +/datum/component/riding/proc/handle_vehicle_layer(dir) var/atom/movable/AM = parent var/static/list/defaults = list(TEXT_NORTH = OBJ_LAYER, TEXT_SOUTH = ABOVE_MOB_LAYER, TEXT_EAST = ABOVE_MOB_LAYER, TEXT_WEST = ABOVE_MOB_LAYER) - . = defaults["[AM.dir]"] - if(directional_vehicle_layers["[AM.dir]"]) - . = directional_vehicle_layers["[AM.dir]"] + . = defaults["[dir]"] + if(directional_vehicle_layers["[dir]"]) + . = directional_vehicle_layers["[dir]"] if(isnull(.)) //you can set it to null to not change it. . = AM.layer AM.layer = . @@ -55,12 +57,17 @@ /datum/component/riding/proc/set_vehicle_dir_layer(dir, layer) directional_vehicle_layers["[dir]"] = layer -/datum/component/riding/proc/vehicle_moved(datum/source) - var/atom/movable/AM = parent - for(var/i in AM.buckled_mobs) - ride_check(i) - handle_vehicle_offsets() - handle_vehicle_layer() +/datum/component/riding/proc/vehicle_moved(datum/source, dir) + var/atom/movable/movable_parent = parent + if (isnull(dir)) + dir = movable_parent.dir + for (var/buckled_mob in movable_parent.buckled_mobs) + ride_check(buckled_mob) + handle_vehicle_offsets(dir) + handle_vehicle_layer(dir) + +/datum/component/riding/proc/vehicle_turned(datum/source, _old_dir, new_dir) + vehicle_moved(source, new_dir) /datum/component/riding/proc/ride_check(mob/living/M) var/atom/movable/AM = parent @@ -91,17 +98,16 @@ M.throw_at(target, 14, 5, AM, gentle = FALSE) M.Knockdown(3 SECONDS) -/datum/component/riding/proc/handle_vehicle_offsets() +/datum/component/riding/proc/handle_vehicle_offsets(dir) var/atom/movable/AM = parent - var/AM_dir = "[AM.dir]" + var/AM_dir = "[dir]" var/passindex = 0 if(AM.has_buckled_mobs()) for(var/m in AM.buckled_mobs) passindex++ var/mob/living/buckled_mob = m var/list/offsets = get_offsets(passindex) - var/rider_dir = get_rider_dir(passindex) - buckled_mob.setDir(rider_dir) + buckled_mob.setDir(dir) dir_loop: for(var/offsetdir in offsets) if(offsetdir == AM_dir) @@ -141,12 +147,6 @@ return FALSE riding_offsets["[index]"] = offsets -//Override this to set the passengers/riders dir based on which passenger they are. -//ie: rider facing the vehicle's dir, but passenger 2 facing backwards, etc. -/datum/component/riding/proc/get_rider_dir(pass_index) - var/atom/movable/AM = parent - return AM.dir - //KEYS /datum/component/riding/proc/keycheck(mob/user) return !keytype || user.is_holding_item_of_type(keytype) @@ -198,8 +198,8 @@ else last_move_diagonal = FALSE - handle_vehicle_layer() - handle_vehicle_offsets() + handle_vehicle_layer(AM.dir) + handle_vehicle_offsets(AM.dir) else to_chat(user, "You'll need a special item in one of your hands to [drive_verb] [AM].") @@ -242,18 +242,18 @@ if(H.a_intent == INTENT_DISARM && (target in H.buckled_mobs)) force_dismount(target) -/datum/component/riding/human/handle_vehicle_layer() +/datum/component/riding/human/handle_vehicle_layer(dir) var/atom/movable/AM = parent if(AM.buckled_mobs && AM.buckled_mobs.len) for(var/mob/M in AM.buckled_mobs) //ensure proper layering of piggyback and carry, sometimes weird offsets get applied M.layer = MOB_LAYER if(!AM.buckle_lying) - if(AM.dir == SOUTH) + if(dir == SOUTH) AM.layer = ABOVE_MOB_LAYER else AM.layer = OBJ_LAYER else - if(AM.dir == NORTH) + if(dir == NORTH) AM.layer = OBJ_LAYER else AM.layer = ABOVE_MOB_LAYER @@ -297,10 +297,10 @@ to_chat(user, "You can't grab onto [AM] with no hands!") return -/datum/component/riding/cyborg/handle_vehicle_layer() +/datum/component/riding/cyborg/handle_vehicle_layer(dir) var/atom/movable/AM = parent if(AM.buckled_mobs && AM.buckled_mobs.len) - if(AM.dir == SOUTH) + if(dir == SOUTH) AM.layer = ABOVE_MOB_LAYER else AM.layer = OBJ_LAYER @@ -310,16 +310,16 @@ /datum/component/riding/cyborg/get_offsets(pass_index) // list(dir = x, y, layer) return list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-6, 3), TEXT_WEST = list( 6, 3)) -/datum/component/riding/cyborg/handle_vehicle_offsets() +/datum/component/riding/cyborg/handle_vehicle_offsets(dir) var/atom/movable/AM = parent if(AM.has_buckled_mobs()) for(var/mob/living/M in AM.buckled_mobs) - M.setDir(AM.dir) + M.setDir(dir) if(iscyborg(AM)) var/mob/living/silicon/robot/R = AM if(istype(R.module)) - M.pixel_x = R.module.ride_offset_x[dir2text(AM.dir)] - M.pixel_y = R.module.ride_offset_y[dir2text(AM.dir)] + M.pixel_x = R.module.ride_offset_x[dir2text(dir)] + M.pixel_y = R.module.ride_offset_y[dir2text(dir)] else ..()