From cfcd3257781194cf37b380da5bf107f35c2a15a9 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 1 Oct 2019 23:13:08 +0200 Subject: [PATCH] reworking the shoving people action. --- code/game/atoms.dm | 3 ++ code/game/objects/structures/tables_racks.dm | 11 ++++++ code/game/turfs/turf.dm | 6 +++ .../mob/living/carbon/human/species.dm | 38 +++---------------- code/modules/recycling/disposal/bin.dm | 33 +++++++++++----- 5 files changed, 49 insertions(+), 42 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6665e4d59b..09f32c215d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -235,6 +235,9 @@ SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) . = P.on_hit(src, 0, def_zone) +/atom/proc/shove_act(mob/living/target, mob/living/user) + return FALSE + /atom/proc/in_contents_of(container)//can take class or object instance as argument if(ispath(container)) if(istype(src.loc, container)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index cd9b595f0a..3ec6f783be 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -136,6 +136,17 @@ var/mob/living/carbon/human/H = pushed_mob SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) +/obj/structure/table/shove_act(mob/living/target, mob/living/user) + if(target.Adjacent(src)) + if(!target.resting) + target.Knockdown(SHOVE_KNOCKDOWN_TABLE) + user.visible_message("[user.name] shoves [target.name] onto \the [src]!", + "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE) + target.throw_at(target_table, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check + log_combat(user, target, "shoved", "onto [src] (table)") + return TRUE + return FALSE + /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver) && deconstruction_ready) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7110ff4405..e1835a2b1e 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -382,6 +382,12 @@ if(ismob(A) || .) A.ratvar_act() +/turf/proc/shove_act(mob/living/target, mob/living/user) + for(var/obj/O in contents) + if(O.shove_act(target, user)) + return TRUE + return FALSE + /turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) underlay_appearance.icon = icon underlay_appearance.icon_state = icon_state diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c91d4b1fca..2a6333832c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1828,60 +1828,32 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/shove_dir = get_dir(user.loc, target_oldturf) var/turf/target_shove_turf = get_step(target.loc, shove_dir) var/mob/living/carbon/human/target_collateral_human - var/obj/structure/table/target_table - var/obj/machinery/disposal/bin/target_disposal_bin var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied //Thank you based whoneedsspace target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents - if(target_collateral_human) + if(target_collateral_human && target_collateral_human.resting) shove_blocked = TRUE else + target_collateral_human = null target.Move(target_shove_turf, shove_dir) if(get_turf(target) == target_oldturf) - target_table = locate(/obj/structure/table) in target_shove_turf.contents - target_disposal_bin = locate(/obj/machinery/disposal/bin) in target_shove_turf.contents shove_blocked = TRUE if(shove_blocked && !target.buckled) - var/directional_blocked = FALSE - if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that - var/target_turf = get_turf(target) - for(var/obj/O in target_turf) - if(O.flags_1 & ON_BORDER_1 && O.dir == shove_dir && O.density) - directional_blocked = TRUE - break - if(target_turf != target_shove_turf) //Make sure that we don't run the exact same check twice on the same tile - for(var/obj/O in target_shove_turf) - if(O.flags_1 & ON_BORDER_1 && O.dir == turn(shove_dir, 180) && O.density) - directional_blocked = TRUE - break + var/directional_blocked = !target.Adjacent(target_shove_turf) var/targetatrest = target.resting - if(((!target_table && !(target_disposal_bin && target.Adjacent(target_disposal_bin)) && !target_collateral_human) || directional_blocked) && !targetatrest) + if((directional_blocked || (!target_collateral_human && !target_turf.shove_act(target, user))) && !targetatrest) target.Knockdown(SHOVE_KNOCKDOWN_SOLID) user.visible_message("[user.name] shoves [target.name], knocking them down!", "You shove [target.name], knocking them down!", null, COMBAT_MESSAGE_RANGE) log_combat(user, target, "shoved", "knocking them down") - else if(target_table) - if(!targetatrest) - target.Knockdown(SHOVE_KNOCKDOWN_TABLE) - user.visible_message("[user.name] shoves [target.name] onto \the [target_table]!", - "You shove [target.name] onto \the [target_table]!", null, COMBAT_MESSAGE_RANGE) - target.throw_at(target_table, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check - log_combat(user, target, "shoved", "onto [target_table] (table)") else if(target_collateral_human && !targetatrest) target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) - if(!target_collateral_human.resting) - target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) + target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) user.visible_message("[user.name] shoves [target.name] into [target_collateral_human.name]!", "You shove [target.name] into [target_collateral_human.name]!", null, COMBAT_MESSAGE_RANGE) log_combat(user, target, "shoved", "into [target_collateral_human.name]") - else if(target_disposal_bin) - target.Knockdown(SHOVE_KNOCKDOWN_SOLID) - target.forceMove(target_disposal_bin) - user.visible_message("[user.name] shoves [target.name] into \the [target_disposal_bin]!", - "You shove [target.name] into \the [target_disposal_bin]!", null, COMBAT_MESSAGE_RANGE) - log_combat(user, target, "shoved", "into [target_disposal_bin] (disposal bin)") else user.visible_message("[user.name] shoves [target.name]!", diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 082b1a7d11..fb638d3825 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -111,14 +111,7 @@ stuff_mob_in(target, user) /obj/machinery/disposal/proc/stuff_mob_in(mob/living/target, mob/living/user) - if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves. - return - if(!isturf(user.loc)) //No magically doing it from inside closets - return - if(target.buckled || target.has_buckled_mobs()) - return - if(target.mob_size > MOB_SIZE_HUMAN) - to_chat(user, "[target] doesn't fit inside [src]!") + if(!can_stuff_mob_in(target, user)) return add_fingerprint(user) if(user == target) @@ -137,6 +130,28 @@ target.LAssailant = user update_icon() +/obj/machinery/disposal/proc/can_stuff_mob_in(mob/living/target, mob/living/user, pushing = FALSE) + if(!pushing && !iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves. + return FALSE + if(!isturf(user.loc)) //No magically doing it from inside closets + return FALSE + if(target.buckled || target.has_buckled_mobs()) + return FALSE + if(target.mob_size > MOB_SIZE_HUMAN) + if(!pushing) + to_chat(user, "[target] doesn't fit inside [src]!") + return FALSE + +/obj/machinery/disposal/bin/shove_act(mob/living/target, mob/living/user) + if(target.Adjacent(src) && can_stuff_mob_in(target, user, TRUE)) + target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + target.forceMove(src) + user.visible_message("[user.name] shoves [target.name] into \the [src]!", + "You shove [target.name] into \the [src]!", null, COMBAT_MESSAGE_RANGE) + log_combat(user, target, "shoved", "into [src] (disposal bin)") + return TRUE + return FALSE + /obj/machinery/disposal/relaymove(mob/user) attempt_escape(user) @@ -305,7 +320,7 @@ if(Adjacent(user)) return TRUE return ..() - + /obj/machinery/disposal/bin/oui_data(mob/user) var/list/data = list()