diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index c21e23280ef..483a18d7018 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -18,6 +18,7 @@ #define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN" #define MOVESPEED_ID_MOB_GRAB_STATE "MOB_GRAB_STATE" +#define MOVESPEED_ID_MOB_EQUIPMENT "MOB_EQUIPMENT" #define MOVESPEED_ID_CONFIG_SPEEDMOD "MOB_CONFIG_MODIFIER" #define MOVESPEED_ID_SLIME_REAGENTMOD "SLIME_REAGENT_MODIFIER" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0823b4cee05..fd1a5995df4 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -401,7 +401,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) if(!silent) playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE) - + user.update_equipment_speed_mods() // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -431,6 +431,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE) else if(slot == SLOT_HANDS) playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE) + user.update_equipment_speed_mods() //sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 53d32da1e01..8bba734b973 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,9 +1,3 @@ -/mob/living/carbon/movement_delay() - . = ..() - - if(!get_leg_ignore() && legcuffed) //ignore the fact we lack legs - . += legcuffed.slowdown - /mob/living/carbon/slip(knockdown_amount, obj/O, lube, paralyze, force_drop) if(movement_type & FLYING) return 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 6083f1b2407..d66ad44cde9 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -144,6 +144,12 @@ return not_handled //For future deeper overrides +/mob/living/carbon/human/equipped_speed_mods() + . = ..() + for(var/sloties in get_all_slots()) + var/obj/item/thing = sloties + . += thing?.slowdown + /mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) var/index = get_held_index_of_item(I) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index be6e36e7697..acc11aa831c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1153,24 +1153,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/movement_delay(mob/living/carbon/human/H) . = 0 //We start at 0. - var/gravity = 0 - gravity = H.has_gravity() - - if(!HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN) && gravity) - if(H.wear_suit) - . += H.wear_suit.slowdown - if(H.shoes) - . += H.shoes.slowdown - if(H.back) - . += H.back.slowdown - for(var/obj/item/I in H.held_items) - if(I.item_flags & SLOWS_WHILE_IN_HAND) - . += I.slowdown + var/gravity = H.has_gravity() + if(!HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN) && gravity > STANDARD_GRAVITY) //Moving in high gravity is very slow (Flying too) - if(gravity > STANDARD_GRAVITY) - var/grav_force = min(gravity - STANDARD_GRAVITY,3) - . += 1 + grav_force + var/grav_force = min(gravity - STANDARD_GRAVITY,3) + . += 1 + grav_force return . diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bd44e86f6c2..61cb07fa418 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1229,3 +1229,17 @@ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE) else add_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=grab_state*3, blacklisted_movetypes=FLOATING) + +/mob/proc/update_equipment_speed_mods() + var/speedies = equipped_speed_mods() + if(!speedies) + remove_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE) + else + add_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speedies, blacklisted_movetypes=FLOATING) + +/// Gets the combined speed modification of all worn items +/// Except base mob type doesnt really wear items +/mob/proc/equipped_speed_mods() + for(var/obj/item/I in held_items) + if(I.item_flags & SLOWS_WHILE_IN_HAND) + . += I.slowdown