diff --git a/res/scripts/components/mob.lua b/res/scripts/components/mob.lua index 8a156dc9..6defca42 100644 --- a/res/scripts/components/mob.lua +++ b/res/scripts/components/mob.lua @@ -26,6 +26,20 @@ def_prop("crouch_speed_mul", 0.35) def_prop("flight_speed_mul", 4.0) def_prop("gravity_scale", 1.0) +local function normalize_angle(angle) + while angle > 180 do + angle = angle - 360 + end + while angle <= -180 do + angle = angle + 360 + end + return angle +end + +local function angle_delta(a, b) + return normalize_angle(a - b) +end + local dir = {0, 0, -1} local flight = false @@ -86,21 +100,25 @@ end local headIndex = rig:index("head") --- todo: move somewhere -local function update_head(point) +function look_at(point, change_dir) local pos = tsf:get_pos() local viewdir = vec3.normalize(vec3.sub(point, pos)) local dot = vec3.dot(viewdir, dir) - if dot > 0.0 then + if dot < 0.0 and not change_dir then + viewdir = mat4.mul(tsf:get_rot(), {0, 0, -1}) + else dir[1] = dir[1] * 0.8 + viewdir[1] * 0.2 dir[3] = dir[3] * 0.8 + viewdir[3] * 0.2 - else - viewdir = mat4.mul(tsf:get_rot(), {0, 0, -1}) + end + + if not headIndex then + return end local headrot = mat4.idt() - local curdir = mat4.mul(mat4.mul(tsf:get_rot(), rig:get_matrix(headIndex)), {0, 0, -1}) + local curdir = mat4.mul(mat4.mul(tsf:get_rot(), + rig:get_matrix(headIndex)), {0, 0, -1}) vec3.mix(curdir, viewdir, 0.2, viewdir) @@ -140,20 +158,6 @@ function set_flight(flag) flight = flag end local prev_angle = 0.0 -local function normalize_angle(angle) - while angle > 180 do - angle = angle - 360 - end - while angle <= -180 do - angle = angle + 360 - end - return angle -end - -local function angle_delta(a, b) - return normalize_angle(a - b) -end - function on_physics_update(tps) local delta = (1.0 / tps) @@ -174,19 +178,13 @@ function on_physics_update(tps) local rotate_speed = entity:get_player() == -1 and 200 or 400 if math.abs(adelta) > 5 then - if adelta > 0 then - angle = angle + delta * rotate_speed - else - angle = angle - delta * rotate_speed - end + angle = angle + delta * rotate_speed * (adelta > 0 and 1 or -1) end + tsf:set_rot(mat4.rotate({0, 1, 0}, angle + 180)) prev_angle = angle if entity:get_player() == -1 then - update_head({player.get_pos(hud.get_player())}) - else - local cam = cameras.get("core:first-person") - update_head(vec3.add({player.get_pos(entity:get_player())}, cam:get_front())) + look_at({player.get_pos(hud.get_player())}) end end diff --git a/res/scripts/components/player.lua b/res/scripts/components/player.lua index e892d2c8..1f3b5797 100644 --- a/res/scripts/components/player.lua +++ b/res/scripts/components/player.lua @@ -1,3 +1,4 @@ +local tsf = entity.transform local body = entity.rigidbody local mob = entity:require_component("core:mob") @@ -54,6 +55,9 @@ function on_physics_update(tps) local delta = (1.0 / tps) local pid = entity:get_player() if pid ~= -1 then + local pos = tsf:get_pos() + local cam = cameras.get("core:first-person") process_player_inputs(pid, delta) + mob.look_at(vec3.add(pos, cam:get_front())) end end diff --git a/src/logic/scripting/lua/libs/lib__skeleton.cpp b/src/logic/scripting/lua/libs/lib__skeleton.cpp index 7272548c..12f9ac2d 100644 --- a/src/logic/scripting/lua/libs/lib__skeleton.cpp +++ b/src/logic/scripting/lua/libs/lib__skeleton.cpp @@ -91,7 +91,7 @@ static int l_set_texture(lua::State* L) { } static int l_index(lua::State* L) { - if (auto skeleton= get_skeleton(L)) { + if (auto skeleton = get_skeleton(L)) { if (auto bone = skeleton->config->find(lua::require_string(L, 2))) { return lua::pushinteger(L, bone->getIndex()); }