From 85fa3c0beef525e0e4a024cf755289b3294f249f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 12 Jul 2017 07:24:50 -0500 Subject: [PATCH] [MIRROR] Refactors flightsuit code to hopefully be less dumb (#1975) * Refactors flightsuit code to hopefully be less dumb * Update flightsuit.dm * Delete flightsuit.dm.rej * Delete objs.dm.rej * Delete mob_movement.dm.rej * Delete carbon_movement.dm.rej * Update mob_movement.dm * Update flightsuit.dm * Update mob_movement.dm * fix --- code/game/objects/objs.dm | 3 + .../modules/clothing/spacesuits/flightsuit.dm | 393 +++++++++--------- code/modules/mob/mob_defines.dm | 1 + code/modules/mob/mob_movement.dm | 48 ++- 4 files changed, 232 insertions(+), 213 deletions(-) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 850ff47687..42eb03a18e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -191,6 +191,9 @@ /obj/proc/on_mob_turn(dir, mob) return +/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc) + return + /obj/vv_get_dropdown() . = ..() .["Delete all of type"] = "?_src_=vars;delall=\ref[src]" diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index f9a07ab648..7287cee2c6 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -92,6 +92,8 @@ var/crash_disabled = FALSE var/crash_dampening = 0 + var/requires_suit = TRUE + var/datum/effect_system/trail_follow/ion/flight/ion_trail var/assembled = FALSE @@ -102,8 +104,16 @@ var/obj/item/weapon/stock_parts/matter_bin/part_bin = null var/crashing = FALSE //Are we currently getting wrecked? - var/atom/movable/dragging_through = FALSE + var/atom/movable/cached_pull + var/turf/old_pull_turf +/obj/item/device/flightpack/proc/changeWearer(mob/changeto) + if(wearer) + LAZYREMOVE(wearer.user_movement_hooks, src) + wearer = null + if(istype(changeto)) + wearer = changeto + LAZYADD(wearer.user_movement_hooks, src) //Start/Stop processing the item to use momentum and flight mechanics. /obj/item/device/flightpack/Initialize() @@ -120,9 +130,18 @@ part_cap = new /obj/item/weapon/stock_parts/capacitor/super(src) part_laser = new /obj/item/weapon/stock_parts/micro_laser/ultra(src) part_bin = new /obj/item/weapon/stock_parts/matter_bin/super(src) - assembled = TRUE ..() +/obj/item/device/flightpack/proc/usermessage(message, span = "boldnotice", mob/mob_override = null) + var/mob/targ = wearer + if(ismob(loc)) + targ = loc + if(istype(mob_override)) + targ = mob_override + if(!istype(targ)) + return + to_chat(targ, "[bicon(src)]|[message]") + /obj/item/device/flightpack/proc/sync_processing(datum/controller/subsystem/processing/flightpacks/FPS) processing_mode = FPS.flightsuit_processing if(processing_mode == FLIGHTSUIT_PROCESSING_NONE) @@ -156,48 +175,39 @@ laser = part_laser.rating bin = part_bin.rating assembled = TRUE - boost_chargerate *= cap - boost_drain -= manip - powersetting_high = Clamp(laser, 0, 3) - emp_disable_threshold = bin*1.25 - crash_disable_threshold = bin*2 - stabilizer_decay_amount = scan*3.5 - airbrake_decay_amount = manip*8 - crash_dampening = bin + boost_chargerate *= cap + boost_drain -= manip + powersetting_high = Clamp(laser, 0, 3) + emp_disable_threshold = bin*1.25 + crash_disable_threshold = bin*2 + stabilizer_decay_amount = scan*3.5 + airbrake_decay_amount = manip*8 + crash_dampening = bin /obj/item/device/flightpack/Destroy() if(suit) delink_suit() - qdel(part_manip) - qdel(part_scan) - qdel(part_cap) - qdel(part_laser) - qdel(part_bin) + changeWearer() + disable_flight(TRUE) + QDEL_NULL(part_manip) + QDEL_NULL(part_scan) + QDEL_NULL(part_cap) + QDEL_NULL(part_laser) + QDEL_NULL(part_bin) + QDEL_NULL(ion_trail) STOP_PROCESSING(SSflightpacks, src) - part_manip = null - part_scan = null - part_cap = null - part_laser = null - part_bin = null - ..() + . = ..() /obj/item/device/flightpack/emp_act(severity) - var/damage = 0 - if(severity == 1) - damage = emp_strong_damage - else - damage = emp_weak_damage + var/damage = severity == 1 ? emp_strong_damage : emp_weak_damage if(emp_damage <= (emp_disable_threshold * 1.5)) emp_damage += damage - to_chat(wearer, "Flightpack: BZZZZZZZZZZZT") - to_chat(wearer, "Flightpack: WARNING: Class [severity] EMP detected! Circuit damage at [(100/emp_disable_threshold)*emp_damage]!") + usermessage("WARNING: Class [severity] EMP detected! Circuit damage at [(emp_damage/emp_disable_threshold)*100]%!", "boldwarning") //action BUTTON CODE /obj/item/device/flightpack/ui_action_click(owner, action) - if(wearer != owner) - wearer = owner - if(!suit) - usermessage("The flightpack will not work without being attached to a suit first!") + if(!suit && requires_suit) + usermessage("The flightpack will not work without being attached to a suit first!", "boldwarning") return FALSE if(istype(action, /datum/action/item_action/flightpack/toggle_flight)) if(!flight) @@ -237,10 +247,24 @@ momentum_y = Clamp(momentum_y + amounty, -momentum_max, momentum_max) calculate_momentum_speed() -//Called by the pair of shoes the wearer is required to wear to detect movement. -/obj/item/device/flightpack/proc/wearer_movement(dir) +/obj/item/device/flightpack/proc/update_cached_pull() + if(!wearer) + return + if(!QDELETED(wearer.pulling)) + cached_pull = wearer.pulling + if(istype(cached_pull)) + old_pull_turf = get_turf(cached_pull) + else if(old_pull_turf) + old_pull_turf = null + +/obj/item/device/flightpack/proc/handle_linked_movement(turf/oldTurf, turf/newTurf) + if(!QDELETED(cached_pull)) + cached_pull.forceMove(oldTurf) + +/obj/item/device/flightpack/intercept_user_move(dir, mob, newLoc, oldLoc) if(!flight) return + update_cached_pull() var/momentum_increment = momentum_gain if(boost) momentum_increment = boost_power @@ -257,15 +281,14 @@ adjust_momentum(momentum_increment, 0) if(WEST) adjust_momentum(-momentum_increment, 0) + handle_linked_movement(oldLoc, get_turf(wearer)) //The wearer has momentum left. Move them and take some away, while negating the momentum that moving the wearer would gain. Or force the wearer to lose control if they are incapacitated. /obj/item/device/flightpack/proc/momentum_drift() - if(!flight) + if(!flight || !wearer) return FALSE - if(wearer.pulling) - dragging_through = wearer.pulling - else if(dragging_through) - dragging_through = null + else if(!wearer.canmove) + losecontrol() var/drift_dir_x = 0 var/drift_dir_y = 0 if(momentum_x > 0) @@ -278,21 +301,17 @@ drift_dir_y = SOUTH if(momentum_speed == 0) return FALSE - if(suit) - if(wearer) - if(!wearer.canmove) - losecontrol() - momentum_decay() - for(var/i in 1 to momentum_speed) - var/turf/oldturf = get_turf(wearer) - if(momentum_speed_x >= i) - step(wearer, drift_dir_x) - if(momentum_speed_y >= i) - step(wearer, drift_dir_y) - if(dragging_through && oldturf) - dragging_through.forceMove(oldturf) - wearer.pulling = dragging_through - sleep(1) + momentum_decay() + for(var/i in 1 to momentum_speed) + var/turf/oldturf = get_turf(wearer) + update_cached_pull() + if(momentum_speed_x >= i) + if(step(wearer, drift_dir_x)) + handle_linked_movement(oldturf, get_turf(wearer)) + if(momentum_speed_y >= i) + if(step(wearer, drift_dir_y)) + handle_linked_movement(oldturf, get_turf(wearer)) + sleep(1) //Make the wearer lose some momentum. /obj/item/device/flightpack/proc/momentum_decay() @@ -308,19 +327,18 @@ //Check for gravity, air pressure, and whether this is still linked to a suit. Also, resync the flightpack/flight suit every minute. /obj/item/device/flightpack/proc/check_conditions() - if(suit) - if(wearer) - if(wearer.has_gravity()) - gravity = 1 - else - gravity = 0 - var/turf/T = get_turf(wearer) - var/datum/gas_mixture/gas = T.return_air() - var/envpressure = gas.return_pressure() - if(envpressure >= pressure_threshold) - pressure = 1 - else - pressure = 0 + if(wearer) + if(wearer.has_gravity()) + gravity = 1 + else + gravity = 0 + var/turf/T = get_turf(wearer) + var/datum/gas_mixture/gas = T.return_air() + var/envpressure = gas.return_pressure() + if(envpressure >= pressure_threshold) + pressure = 1 + else + pressure = 0 if(flight) if(!assembled) disable_flight(1) @@ -330,22 +348,22 @@ disable_flight(1) if(!pressure && brake) brake = FALSE - usermessage("Airbrakes deactivated due to lack of pressure!", 2) - if(!suit.deployedshoes) - if(brake || stabilizer) - brake = FALSE - stabilizer = FALSE - usermessage("Warning: Sensor data is not being received from flight shoes. Stabilizers and airbrake modules OFFLINE!", 2) + usermessage("Airbrakes deactivated due to lack of pressure!", "boldwarning") + if(suit) + if(!suit.deployedshoes) + if(brake || stabilizer) + brake = FALSE + stabilizer = FALSE + usermessage("Warning: Sensor data is not being recieved from flight shoes. Stabilizers and airbrake modules OFFLINE!", "boldwarning") /obj/item/device/flightpack/proc/update_slowdown() if(!flight) - suit.slowdown = slowdown_ground - return + slowdown = slowdown_ground else - suit.slowdown = slowdown_air + slowdown = slowdown_air /obj/item/device/flightpack/process() - if(!suit || (processing_mode == FLIGHTSUIT_PROCESSING_NONE)) + if((!suit && requires_suit) || (processing_mode == FLIGHTSUIT_PROCESSING_NONE)) return FALSE check_conditions() calculate_momentum_speed() @@ -373,12 +391,12 @@ disabled = crash_disabled + emp_disabled if(disabled) if(crash_disabled && (!crash_disable_message)) - usermessage("Internal gyroscopes scrambled from excessive impacts.", 2) - usermessage("Deactivating to recalibrate flight systems!", 2) + usermessage("Internal gyroscopes scrambled from excessive impacts.", "boldwarning") + usermessage("Deactivating to recalibrate flight systems!", "boldwarning") crash_disable_message = TRUE if(emp_disabled && (!emp_disable_message)) - usermessage("Electromagnetic deflectors overloaded. Short circuit detected in internal systems!", 1) - usermessage("Deactivating to prevent fatal power overload!", 2) + usermessage("Electromagnetic deflectors overloaded. Short circuit detected in internal systems!", "boldwarning") + usermessage("Deactivating to prevent fatal power overload!", "boldwarning") emp_disable_message = TRUE if(flight) disable_flight(TRUE) @@ -396,7 +414,6 @@ if(wearer) wearer.update_inv_wear_suit() wearer.update_inv_back() - ..() /obj/item/device/flightpack/proc/handle_boost() if(boost) @@ -432,7 +449,7 @@ else crashmessagesrc += "but luckily [wearer]'s impact was absorbed by their suit's stabilizers!" wearer.adjustBruteLoss(userdamage) - usermessage("WARNING: Stabilizers taking damage!", 2) + usermessage("WARNING: Stabilizers taking damage!", "boldwarning") wearer.visible_message(crashmessagesrc) crash_damage = Clamp(crash_damage + crash_damage_high, 0, crash_disable_threshold*1.5) @@ -477,7 +494,7 @@ wearer.forceMove(get_turf(L)) crashing = FALSE return FALSE - suit.user.forceMove(get_turf(unmovablevictim)) + wearer.forceMove(get_turf(unmovablevictim)) crashing = FALSE mobknockback(L, crashpower, crashdir) damage = FALSE @@ -531,10 +548,11 @@ /obj/item/device/flightpack/proc/door_hit(obj/structure/mineral_door/door) spawn() door.Open() - wearer.forceMove(get_turf(door)) - if(dragging_through) - dragging_through.forceMove(get_turf(door)) - wearer.pulling = dragging_through + update_cached_pull() + var/turf/old = get_turf(wearer) + var/turf/T = get_turf(door) + wearer.forceMove(T) + handle_linked_movement(old, T) wearer.visible_message("[wearer] rolls to their sides and slips past [door]!") /obj/item/device/flightpack/proc/crash_grille(obj/structure/grille/target) @@ -560,19 +578,23 @@ A.open() wearer.visible_message("[wearer] rolls sideways and slips past [A]") var/turf/target = get_turf(A) + var/turf/old = get_turf(wearer) if(istype(A, /obj/machinery/door/window) && (get_turf(wearer) == get_turf(A))) target = get_step(A, A.dir) + update_cached_pull() wearer.forceMove(target) - if(dragging_through) - dragging_through.forceMove(target) - wearer.pulling = dragging_through + handle_linked_movement(old, target) return pass /obj/item/device/flightpack/proc/mobknockback(mob/living/victim, power, direction) if(!ismob(victim)) return FALSE - wearer.forceMove(get_turf(victim)) + update_cached_pull() + var/turf/old = get_turf(wearer) + var/turf/T = get_turf(victim) + wearer.forceMove(T) + handle_linked_movement(old, T) wearer.visible_message("[wearer] flies over [victim]!") /obj/item/device/flightpack/proc/victimknockback(atom/movable/victim, power, direction) @@ -610,7 +632,7 @@ momentum_x = 0 momentum_y = 0 calculate_momentum_speed() - usermessage("Warning: Control system not responding. Deactivating!", 3) + usermessage("Warning: Control system not responding. Deactivating!", "boldwarning") wearer.visible_message("[wearer]'s flight suit abruptly shuts off and they lose control!") if(wearer) if(move) @@ -628,10 +650,16 @@ disable_flight(FALSE) /obj/item/device/flightpack/proc/enable_flight(forced = FALSE) - if(!suit) - usermessage("Warning: Flightpack not linked to compatible flight-suit mount!", 2) - if(disabled) - usermessage("Internal systems recalibrating. Unable to safely proceed.", 2) + if(!forced) + if(disabled) + usermessage("Internal systems recalibrating. Unable to safely proceed.", "boldwarning") + return FALSE + if(suit) + if(suit.shoes) + suit.shoes.toggle(TRUE) + else if(!requires_suit) + usermessage("Warning: Flightpack not linked to compatible flight-suit mount!", "boldwarning") + return FALSE wearer.movement_type |= FLYING wearer.pass_flags |= flight_passflags usermessage("ENGAGING FLIGHT ENGINES.") @@ -640,8 +668,6 @@ wearer.visible_message("[wearer]'s flight engines activate as they lift into the air!") //I DONT HAVE SOUND EFFECTS YET playsound( flight = TRUE - if(suit.shoes) - suit.shoes.toggle(TRUE) update_icon() ion_trail.start() @@ -661,7 +687,7 @@ wearer.movement_type &= ~FLYING wearer.pass_flags &= ~flight_passflags flight = FALSE - if(suit.shoes) + if(suit && suit.shoes) suit.shoes.toggle(FALSE) if(isturf(wearer.loc)) var/turf/T = wearer.loc @@ -670,7 +696,7 @@ if(override_safe) disable_flight(TRUE) return TRUE - usermessage("Warning: Velocity too high to safely disengage. Retry to confirm emergency shutoff.", 2) + usermessage("Warning: Velocity too high to safely disengage. Retry to confirm emergency shutoff.", "boldwarning") override_safe = TRUE addtimer(CALLBACK(src, .proc/enable_safe), 50) return FALSE @@ -681,6 +707,7 @@ override_safe = FALSE /obj/item/device/flightpack/dropped(mob/wearer) + changeWearer() ..() /obj/item/device/flightpack/item_action_slot_check(slot) @@ -689,7 +716,7 @@ /obj/item/device/flightpack/equipped(mob/user, slot) if(ishuman(user)) - wearer = user + changeWearer(user) ..() /obj/item/device/flightpack/proc/calculate_momentum_speed() @@ -716,25 +743,29 @@ return TRUE /obj/item/device/flightpack/proc/enable_stabilizers() + if(requires_suit) + if(suit && !suit.deployedshoes) + usermessage("Stabilizers requires flight shoes to be attached and deployed!", "boldwarning") + return FALSE usermessage("Activating automatic stabilization controller and enabling maneuvering assistance.") stabilizer = TRUE + return TRUE /obj/item/device/flightpack/proc/disable_stabilizers() if(wearer) if(brake) disable_airbrake() - usermessage("Deactivating stabilization controllers!", 2) + usermessage("Deactivating stabilization controllers!", "boldwarning") stabilizer = FALSE /obj/item/device/flightpack/proc/activate_booster() if(!flight) - usermessage("Error: Engines offline!", 2) + usermessage("Error: Engines offline!", "boldwarning") return FALSE if(boost_charge < 5) - usermessage("Insufficient charge in boost capacitors to engage.", 2) + usermessage("Insufficient charge in boost capacitors to engage.", "boldwarning") return FALSE usermessage("Boosters engaged!") - wearer.visible_message("[wearer.name]'s flightpack engines flare in intensity as they are rocketed forward by the immense thrust!") boost = TRUE update_slowdown() update_icon() @@ -747,22 +778,19 @@ /obj/item/device/flightpack/proc/enable_airbrake() if(wearer) - if(!stabilizer) - enable_stabilizers() - usermessage("Stabilizers activated!") + if(!stabilizer && !enable_stabilizers()) + usermessage("Airbrake deployment: Stabilizer Errored.", "boldwarning") + return FALSE usermessage("Airbrakes extended!") brake = TRUE update_slowdown() /obj/item/device/flightpack/proc/disable_airbrake() if(wearer) - usermessage("Airbrakes retracted!") + usermessage("Airbrakes retracted!", "boldwarning") brake = FALSE update_slowdown() -/obj/item/device/flightpack/on_mob_move(dir, mob) - wearer_movement(dir) - /obj/item/device/flightpack/proc/relink_suit(obj/item/clothing/suit/space/hardsuit/flightsuit/F) if(suit && suit == F) return FALSE @@ -780,57 +808,47 @@ suit.pack = null suit = null -/obj/item/device/flightpack/proc/usermessage(message, urgency = 0) - if(urgency == 0) - to_chat(wearer, "[bicon(src)]|[message]") - if(urgency == 1) - to_chat(wearer, "[bicon(src)]|[message]") - if(urgency == 2) - to_chat(wearer, "[bicon(src)]|[message]") - if(urgency == 3) - to_chat(wearer, "[bicon(src)]|[message]") - /obj/item/device/flightpack/attackby(obj/item/I, mob/user, params) - if(ishuman(user) && !ishuman(src.loc)) - wearer = user + var/changed = FALSE if(istype(I, /obj/item/weapon/stock_parts)) var/obj/item/weapon/stock_parts/S = I if(istype(S, /obj/item/weapon/stock_parts/manipulator)) - usermessage("[I] has been sucessfully installed into systems.") + usermessage("[I] has been sucessfully installed into systems.", mob_override = user) if(user.transferItemToLoc(I, src)) if(part_manip) part_manip.forceMove(get_turf(src)) - part_manip = null part_manip = I + changed = TRUE if(istype(S, /obj/item/weapon/stock_parts/scanning_module)) - usermessage("[I] has been sucessfully installed into systems.") + usermessage("[I] has been sucessfully installed into systems.", mob_override = user) if(user.transferItemToLoc(I, src)) if(part_scan) part_scan.forceMove(get_turf(src)) - part_scan = null part_scan = I + changed = TRUE if(istype(S, /obj/item/weapon/stock_parts/micro_laser)) - usermessage("[I] has been sucessfully installed into systems.") + usermessage("[I] has been sucessfully installed into systems.", mob_override = user) if(user.transferItemToLoc(I, src)) if(part_laser) part_laser.forceMove(get_turf(src)) - part_laser = null part_laser = I + changed = TRUE if(istype(S, /obj/item/weapon/stock_parts/matter_bin)) - usermessage("[I] has been sucessfully installed into systems.") + usermessage("[I] has been sucessfully installed into systems.", mob_override = user) if(user.transferItemToLoc(I, src)) if(part_bin) part_bin.forceMove(get_turf(src)) - part_bin = null part_bin = I + changed = TRUE if(istype(S, /obj/item/weapon/stock_parts/capacitor)) - usermessage("[I] has been sucessfully installed into systems.") + usermessage("[I] has been sucessfully installed into systems.", mob_override = user) if(user.transferItemToLoc(I, src)) if(part_cap) part_cap.forceMove(get_turf(src)) - part_cap = null part_cap = I - update_parts() + changed = TRUE + if(changed) + update_parts() ..() //MOB MOVEMENT STUFF---------------------------------------------------------------------------------------------------------------------------------------------- @@ -863,9 +881,10 @@ resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/shoes/flightshoes/Destroy() - if(suit) - suit.shoes = null - return ..() + pack = null + wearer = null + suit = null + . = ..() /obj/item/clothing/shoes/flightshoes/proc/toggle(toggle) if(suit) @@ -875,9 +894,6 @@ if(!active) src.flags &= ~NOSLIP -/obj/item/clothing/shoes/flightshoes/dropped(mob/wearer) - ..() - /obj/item/clothing/shoes/flightshoes/item_action_slot_check(slot) if(slot == slot_shoes) return TRUE @@ -927,19 +943,19 @@ var/maint_panel = FALSE max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT -/obj/item/clothing/suit/space/hardsuit/flightsuit/full/New() - ..() +/obj/item/clothing/suit/space/hardsuit/flightsuit/full/Initialize() + . = ..() makepack() makeshoes() resync() -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/usermessage(message, urgency = 0) - if(!urgency) - to_chat(user, "[bicon(src)]|[message]") - else if(urgency == 1) - to_chat(user, "[bicon(src)]|[message]") - else if(urgency == 2) - to_chat(user, "[bicon(src)]|[message]") +/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/usermessage(message, span = "boldnotice") + var/mob/targ = user + if(ismob(loc)) + targ = loc + if(!istype(targ)) + return + to_chat(targ, "[bicon(src)]|[message]") /obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user) ..() @@ -949,26 +965,21 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/Destroy() dropped() - if(pack) - pack.delink_suit() - qdel(pack) - if(shoes) - shoes.pack = null - shoes.suit = null - qdel(shoes) - ..() + QDEL_NULL(pack) + QDEL_NULL(shoes) + . = ..() /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/resync() if(pack) pack.relink_suit(src) if(user) if(pack) - pack.wearer = user + pack.changeWearer(user) if(shoes) shoes.wearer = user else if(pack) - pack.wearer = null + pack.changeWearer(null) if(shoes) shoes.wearer = null if(shoes) @@ -978,7 +989,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user if(src == H.wear_suit && locked) - usermessage("You can not take a locked hardsuit off! Unlock it first!", 1) + usermessage("You can not take a locked hardsuit off! Unlock it first!", "boldwarning") return ..() @@ -1015,7 +1026,7 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/ToggleHelmet() if(!suittoggled) if(!locked) - usermessage("You must lock your suit before engaging the helmet!", 1) + usermessage("You must lock your suit before engaging the helmet!", "boldwarning") return FALSE ..() @@ -1030,16 +1041,16 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/unlock_suit(mob/wearer) if(suittoggled) - usermessage("You must retract the helmet before unlocking your suit!", 1) + usermessage("You must retract the helmet before unlocking your suit!", "boldwarning") return FALSE if(pack && pack.flight) - usermessage("You must shut off the flight-pack before unlocking your suit!", 1) + usermessage("You must shut off the flight-pack before unlocking your suit!", "boldwarning") return FALSE if(deployedpack) - usermessage("Your flightpack must be fully retracted first!", 1) + usermessage("Your flightpack must be fully retracted first!", "boldwarning") return FALSE if(deployedshoes) - usermessage("Your flight shoes must be fully retracted first!", 1) + usermessage("Your flight shoes must be fully retracted first!", "boldwarning") return FALSE if(wearer) user.visible_message("[wearer]'s flight suit detaches from their body, becoming nothing more then a bulky metal skeleton.") @@ -1051,16 +1062,16 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/extend_flightpack(forced = FALSE) if(!pack) - usermessage("There is no attached flightpack!", 1) + usermessage("There is no attached flightpack!", "boldwarning") return FALSE if(deployedpack) retract_flightpack() if(!locked) - usermessage("You must lock your flight suit first before deploying anything!", 1) + usermessage("You must lock your flight suit first before deploying anything!", "boldwarning") return FALSE if(ishuman(user)) if(user.back) - usermessage("You're already wearing something on your back!", 1) + usermessage("You're already wearing something on your back!", "boldwarning") return FALSE user.equip_to_slot_if_possible(pack,slot_back,0,0,1) pack.flags |= NODROP @@ -1073,7 +1084,7 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightpack(forced = FALSE) if(ishuman(user)) if(pack.flight && !forced) - usermessage("You must disable the engines before retracting the flightpack!", 1) + usermessage("You must disable the engines before retracting the flightpack!", "boldwarning") return FALSE if(pack.flight && forced) pack.disable_flight(1) @@ -1089,16 +1100,16 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/extend_flightshoes(forced = FALSE) if(!shoes) - usermessage("Flight shoes are not installed!", 1) + usermessage("Flight shoes are not installed", "boldwarning") return FALSE if(deployedshoes) retract_flightshoes() if(!locked) - usermessage("You must lock your flight suit first before deploying anything!", 1) + usermessage("You must lock your flight suit first before deploying anything!", "boldwarning") return FALSE if(ishuman(user)) if(user.shoes) - usermessage("You're already wearing something on your feet!", 1) + usermessage("You're already wearing something on your feet!", "boldwarning") return FALSE user.equip_to_slot_if_possible(shoes,slot_shoes,0,0,1) shoes.flags |= NODROP @@ -1167,47 +1178,47 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/attackby(obj/item/I, mob/wearer, params) user = wearer if(src == user.get_item_by_slot(slot_wear_suit)) - usermessage("You can not perform any service without taking the suit off!", 1) + usermessage("You can not perform any service without taking the suit off!", "boldwarning") return FALSE - if(locked) - usermessage("You can not perform any service while the suit is locked!", 1) + else if(locked) + usermessage("You can not perform any service while the suit is locked!", "boldwarning") return FALSE - if(istype(I, /obj/item/weapon/screwdriver)) + else if(istype(I, /obj/item/weapon/screwdriver)) if(!maint_panel) maint_panel = TRUE else maint_panel = FALSE usermessage("You [maint_panel? "open" : "close"] the maintainence panel.") - if(!maint_panel) - usermessage("The maintainence panel is closed!", 1) + else if(!maint_panel) + usermessage("The maintainence panel is closed!", "boldwarning") return FALSE - if(istype(I, /obj/item/weapon/crowbar)) + else if(istype(I, /obj/item/weapon/crowbar)) var/list/inputlist = list() if(pack) inputlist += "Pack" if(shoes) inputlist += "Shoes" if(!inputlist.len) - usermessage("There is nothing inside the flightsuit to remove!", 1) + usermessage("There is nothing inside the flightsuit to remove!", "boldwarning") return FALSE var/input = input(user, "What to remove?", "Removing module") as null|anything in list("Pack", "Shoes") if(pack && input == "Pack") if(pack.flight) - usermessage("You can not pry off an active flightpack!", 1) + usermessage("You can not pry off an active flightpack!", "boldwarning") return FALSE if(deployedpack) - usermessage("Disengage the flightpack first!", 1) + usermessage("Disengage the flightpack first!", "boldwarning") return FALSE detach_pack() if(shoes && input == "Shoes") if(deployedshoes) - usermessage("Disengage the shoes first!", 1) + usermessage("Disengage the shoes first!", "boldwarning") return FALSE detach_shoes() - if(istype(I, /obj/item/device/flightpack)) + else if(istype(I, /obj/item/device/flightpack)) var/obj/item/device/flightpack/F = I if(pack) - usermessage("[src] already has a flightpack installed!", 1) + usermessage("[src] already has a flightpack installed!", "boldwarning") return FALSE if(!F.assembled) var/addmsg = " It is missing a " @@ -1223,18 +1234,18 @@ if(!F.part_bin) addmsglist += "matter bin" addmsg += english_list(addmsglist) - usermessage("The flightpack you are trying to install is not fully assembled and operational![addmsg].", 1) + usermessage("The flightpack you are trying to install is not fully assembled and operational![addmsg].", "boldwarning") return FALSE if(user.temporarilyRemoveItemFromInventory(F)) attach_pack(F) - if(istype(I, /obj/item/clothing/shoes/flightshoes)) + else if(istype(I, /obj/item/clothing/shoes/flightshoes)) var/obj/item/clothing/shoes/flightshoes/S = I if(shoes) - usermessage("There are already shoes installed!", 1) + usermessage("There are already shoes installed!", "boldwarning") return FALSE if(user.temporarilyRemoveItemFromInventory(S)) attach_shoes(S) - ..() + . = ..() //FLIGHT HELMET---------------------------------------------------------------------------------------------------------------------------------------------------- /obj/item/clothing/head/helmet/space/hardsuit/flightsuit diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 53293fcf5e..053cba123a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -104,6 +104,7 @@ //The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition) var/mob/living/carbon/LAssailant = null + var/list/obj/user_movement_hooks //Passes movement in client/Move() to these! var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 1886d2b667..da4618ff96 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,15 +1,15 @@ /mob/CanPass(atom/movable/mover, turf/target, height=0) if(height==0) - return 1 + return TRUE if(istype(mover, /obj/item/projectile) || mover.throwing) return (!density || lying) if(mover.checkpass(PASSMOB)) - return 1 + return TRUE if(buckled == mover) - return 1 + return TRUE if(ismob(mover)) if (mover in buckled_mobs) - return 1 + return TRUE return (!mover.density || !density || lying) @@ -113,29 +113,30 @@ #define MOVEMENT_DELAY_BUFFER_DELTA 1.25 /client/Move(n, direct) if(world.time < move_delay) - return 0 + return FALSE var/old_move_delay = move_delay move_delay = world.time+world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!mob || !mob.loc) - return 0 + return FALSE + var/oldloc = mob.loc if(mob.notransform) - return 0 //This is sota the goto stop mobs from moving var + return FALSE //This is sota the goto stop mobs from moving var if(mob.control_object) return Move_object(direct) if(!isliving(mob)) return mob.Move(n,direct) if(mob.stat == DEAD) mob.ghostize() - return 0 + return FALSE if(moving) - return 0 + return FALSE if(mob.force_moving) - return 0 + return FALSE if(isliving(mob)) var/mob/living/L = mob if(L.incorporeal_move) //Move though walls Process_Incorpmove(direct) - return 0 + return FALSE if(mob.remote_control) //we're controlling something, our movement is relayed to it return mob.remote_control.relaymove(mob, direct) @@ -150,14 +151,14 @@ return mob.buckled.relaymove(mob, direct) if(!mob.canmove) - return 0 + return FALSE if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved var/atom/O = mob.loc return O.relaymove(mob, direct) if(!mob.Process_Spacemove(direct)) - return 0 + return FALSE //We are now going to move moving = 1 @@ -184,6 +185,10 @@ if(mob.throwing) mob.throwing.finalize(FALSE) + if(LAZYLEN(mob.user_movement_hooks)) + for(var/obj/O in mob.user_movement_hooks) + O.intercept_user_move(direct, mob, n, oldloc) + return . /mob/Moved(oldLoc, dir) @@ -204,15 +209,14 @@ if(mob.pulledby) if(mob.incapacitated(ignore_restraints = 1)) move_delay = world.time + 10 - return 1 + return TRUE else if(mob.restrained(ignore_grab = 1)) move_delay = world.time + 10 to_chat(src, "You're restrained! You can't move!") - return 1 + return TRUE else return mob.resist_grab(1) - ///Process_Incorpmove ///Called by client/Move() ///Allows mobs to run though walls @@ -277,23 +281,23 @@ else L.loc = get_step(L, direct) L.setDir(direct) - return 1 + return TRUE ///Process_Spacemove ///Called by /client/Move() ///For moving in space -///Return 1 for movement 0 for none +///return TRUE for movement 0 for none /mob/Process_Spacemove(movement_dir = 0) if(..()) - return 1 + return TRUE var/atom/movable/backup = get_spacemove_backup() if(backup) if(istype(backup) && movement_dir && !backup.anchored) if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves to_chat(src, "You push off of [backup] to propel yourself.") - return 1 - return 0 + return TRUE + return FALSE /mob/get_spacemove_backup() for(var/A in orange(1, get_turf(src))) @@ -325,7 +329,7 @@ return has_gravity() /mob/proc/mob_negates_gravity() - return 0 + return FALSE //moves the mob/object we're pulling /mob/proc/Move_Pulled(atom/A)