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()