mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-14 03:32:00 +00:00
## About The Pull Request I was failing to clear the input removal if we had no movement So you'd step, stop moving, and retain it Then whenever we rotate, we continue to hold onto that removal forever. Weird. Handles... part of? #81501 ## Changelog 🆑 fix:Blocking movement works properly again /🆑
45 lines
2.1 KiB
Plaintext
45 lines
2.1 KiB
Plaintext
// You might be wondering why this isn't client level. If focus is null, we don't want you to move.
|
|
// Only way to do that is to tie the behavior into the focus's keyLoop().
|
|
|
|
/atom/movable/keyLoop(client/user)
|
|
// Clients don't go null randomly. They do go null unexpectedly though, when they're poked in particular ways
|
|
// keyLoop is called by a for loop over mobs. We're guarenteed that all the mobs have clients at the START
|
|
// But the move of one mob might poke the client of another, so we do this
|
|
if(!user)
|
|
return FALSE
|
|
var/movement_dir = user.intended_direction | user.next_move_dir_add
|
|
// If we're not movin anywhere, we aren't movin anywhere
|
|
// Safe because nothing adds to movement_dir after this moment
|
|
if(!movement_dir)
|
|
// No input == our removal would have done nothing
|
|
// So we can safely forget about it
|
|
user.next_move_dir_sub = NONE
|
|
return FALSE
|
|
|
|
if(user.next_move_dir_sub)
|
|
movement_dir &= ~user.next_move_dir_sub
|
|
// Sanity checks in case you hold left and right and up to make sure you only go up
|
|
if((movement_dir & NORTH) && (movement_dir & SOUTH))
|
|
movement_dir &= ~(NORTH|SOUTH)
|
|
if((movement_dir & EAST) && (movement_dir & WEST))
|
|
movement_dir &= ~(EAST|WEST)
|
|
|
|
if(user.dir != NORTH && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise
|
|
movement_dir = turn(movement_dir, -dir2angle(user.dir)) //By doing this we ensure that our input direction is offset by the client (camera) direction
|
|
|
|
//turn without moving while using the movement lock key, unless something wants to ignore it and move anyway
|
|
if(user.movement_locked && !(SEND_SIGNAL(src, COMSIG_MOVABLE_KEYBIND_FACE_DIR, movement_dir) & COMSIG_IGNORE_MOVEMENT_LOCK))
|
|
keybind_face_direction(movement_dir)
|
|
// Null check cause of the signal above
|
|
else if(user)
|
|
user.Move(get_step(src, movement_dir), movement_dir)
|
|
return !!movement_dir //true if there was actually any player input
|
|
|
|
return FALSE
|
|
|
|
/client/proc/calculate_move_dir()
|
|
var/movement_dir = NONE
|
|
for(var/_key in keys_held)
|
|
movement_dir |= movement_keys[_key]
|
|
intended_direction = movement_dir
|