mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Restore pass-through of direction keys (#11924)
This moves relevant code into the PlayerControl class and gets rid of separate keyPressed variable.
This commit is contained in:
parent
76dbd0d2d0
commit
5eb45e1ea0
11 changed files with 165 additions and 98 deletions
|
@ -230,13 +230,15 @@ int LuaLocalPlayer::l_get_control(lua_State *L)
|
|||
set("dig", c.dig);
|
||||
set("place", c.place);
|
||||
// Player movement in polar coordinates and non-binary speed
|
||||
set("movement_speed", c.movement_speed);
|
||||
set("movement_direction", c.movement_direction);
|
||||
lua_pushnumber(L, c.movement_speed);
|
||||
lua_setfield(L, -2, "movement_speed");
|
||||
lua_pushnumber(L, c.movement_direction);
|
||||
lua_setfield(L, -2, "movement_direction");
|
||||
// Provide direction keys to ensure compatibility
|
||||
set("up", player->keyPressed & (1 << 0)); // Up, down, left, and right were removed in favor of
|
||||
set("down", player->keyPressed & (1 << 1)); // analog direction indicators and are therefore not
|
||||
set("left", player->keyPressed & (1 << 2)); // available as booleans anymore. The corresponding values
|
||||
set("right", player->keyPressed & (1 << 3)); // can still be read from the keyPressed bits though.
|
||||
set("up", c.direction_keys & (1 << 0));
|
||||
set("down", c.direction_keys & (1 << 1));
|
||||
set("left", c.direction_keys & (1 << 2));
|
||||
set("right", c.direction_keys & (1 << 3));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -1367,20 +1367,18 @@ int ObjectRef::l_get_player_control(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
ObjectRef *ref = checkobject(L, 1);
|
||||
RemotePlayer *player = getplayer(ref);
|
||||
if (player == nullptr) {
|
||||
lua_pushlstring(L, "", 0);
|
||||
return 1;
|
||||
}
|
||||
if (player == nullptr)
|
||||
return 0;
|
||||
|
||||
const PlayerControl &control = player->getPlayerControl();
|
||||
lua_newtable(L);
|
||||
lua_pushboolean(L, player->keyPressed & (1 << 0));
|
||||
lua_pushboolean(L, control.direction_keys & (1 << 0));
|
||||
lua_setfield(L, -2, "up");
|
||||
lua_pushboolean(L, player->keyPressed & (1 << 1));
|
||||
lua_pushboolean(L, control.direction_keys & (1 << 1));
|
||||
lua_setfield(L, -2, "down");
|
||||
lua_pushboolean(L, player->keyPressed & (1 << 2));
|
||||
lua_pushboolean(L, control.direction_keys & (1 << 2));
|
||||
lua_setfield(L, -2, "left");
|
||||
lua_pushboolean(L, player->keyPressed & (1 << 3));
|
||||
lua_pushboolean(L, control.direction_keys & (1 << 3));
|
||||
lua_setfield(L, -2, "right");
|
||||
lua_pushboolean(L, control.jump);
|
||||
lua_setfield(L, -2, "jump");
|
||||
|
@ -1408,12 +1406,24 @@ int ObjectRef::l_get_player_control_bits(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
ObjectRef *ref = checkobject(L, 1);
|
||||
RemotePlayer *player = getplayer(ref);
|
||||
if (player == nullptr) {
|
||||
lua_pushlstring(L, "", 0);
|
||||
return 1;
|
||||
}
|
||||
if (player == nullptr)
|
||||
return 0;
|
||||
|
||||
lua_pushnumber(L, player->keyPressed);
|
||||
const auto &c = player->getPlayerControl();
|
||||
|
||||
// This is very close to PlayerControl::getKeysPressed() but duplicated
|
||||
// here so the encoding in the API is not inadvertedly changed.
|
||||
u32 keypress_bits =
|
||||
c.direction_keys |
|
||||
( (u32)(c.jump & 1) << 4) |
|
||||
( (u32)(c.aux1 & 1) << 5) |
|
||||
( (u32)(c.sneak & 1) << 6) |
|
||||
( (u32)(c.dig & 1) << 7) |
|
||||
( (u32)(c.place & 1) << 8) |
|
||||
( (u32)(c.zoom & 1) << 9)
|
||||
;
|
||||
|
||||
lua_pushinteger(L, keypress_bits);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue