/mob/living/Moved() . = ..() update_turf_movespeed(loc) if(is_shifted) is_shifted = FALSE pixel_x = get_standard_pixel_x_offset(lying) pixel_y = get_standard_pixel_y_offset(lying) /mob/living/CanPass(atom/movable/mover, turf/target) if((mover.pass_flags & PASSMOB)) return TRUE if(istype(mover, /obj/item/projectile)) var/obj/item/projectile/P = mover return !P.can_hit_target(src, P.permutated, src == P.original, TRUE) if(mover.throwing) return (!density || lying) if(buckled == mover) return TRUE if(!ismob(mover)) if(mover.throwing?.thrower == src) return TRUE if(ismob(mover)) if(mover in buckled_mobs) return TRUE var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density)) /mob/living/toggle_move_intent() . = ..() update_move_intent_slowdown() /mob/living/update_config_movespeed() update_move_intent_slowdown() return ..() /// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc. /mob/living/proc/can_move_under_living(mob/living/other) return !density /mob/living/proc/update_move_intent_slowdown() var/mod = 0 if(m_intent == MOVE_INTENT_WALK) mod = CONFIG_GET(number/movedelay/walk_delay) else mod = CONFIG_GET(number/movedelay/run_delay) if(!isnum(mod)) mod = 1 add_movespeed_modifier(MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED, TRUE, 100, override = TRUE, multiplicative_slowdown = mod) /mob/living/proc/update_turf_movespeed(turf/open/T) if(isopenturf(T) && !is_flying()) add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown) else remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD) /mob/living/proc/update_pull_movespeed() if(pulling && isliving(pulling)) var/mob/living/L = pulling if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE) add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) return remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) /mob/living/canZMove(dir, turf/target) return can_zTravel(target, dir) && (movement_type & FLYING) /mob/living/Move(atom/newloc, direct) if (buckled && buckled.loc != newloc) //not updating position if (!buckled.anchored) return buckled.Move(newloc, direct) else return 0 var/old_direction = dir var/turf/T = loc if(pulling) update_pull_movespeed() . = ..() if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE))) active_storage.close(src) if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) /mob/living/forceMove(atom/destination) stop_pulling() if(buckled) buckled.unbuckle_mob(src, force = TRUE) if(has_buckled_mobs()) unbuckle_all_mobs(force = TRUE) . = ..() if(.) if(client) reset_perspective() update_mobility() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall. /mob/living/proc/update_z(new_z) // 1+ to register, null to unregister if(isnull(new_z) && audiovisual_redirect) return if (registered_z != new_z) if (registered_z) SSmobs.clients_by_zlevel[registered_z] -= src if (client || audiovisual_redirect) if (new_z) SSmobs.clients_by_zlevel[new_z] += src for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] if (SA) SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs else SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA registered_z = new_z else registered_z = null /mob/living/onTransitZ(old_z,new_z) ..() update_z(new_z) /mob/living/canface() if(!CHECK_MOBILITY(src, MOBILITY_MOVE)) return FALSE return ..()