make core:mob.look_at public

This commit is contained in:
MihailRis 2025-09-07 23:41:29 +03:00
parent 3c2061f788
commit 23a9ad0979
3 changed files with 32 additions and 30 deletions

View File

@ -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

View File

@ -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

View File

@ -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());
}