Big update
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
-----------------------------------------------------------
|
||||
-- weapon_base.lua, Базоавый скрипт оружия
|
||||
-- weapon_base.lua, Базовый скрипт оружия
|
||||
-- Автор: Кирилл
|
||||
-- Изменяли:
|
||||
-- Дата: 05.03.2026
|
||||
-----------------------------------------------------------
|
||||
|
||||
-- индификаторы состояний FSM
|
||||
WEAPON_FSM_STATE_NONE = 0
|
||||
WEAPON_FSM_STATE_IDLE = 1
|
||||
WEAPON_FSM_STATE_ATTACK = 2
|
||||
WEAPON_FSM_STATE_ATTACK2 = 3
|
||||
@@ -17,32 +18,11 @@ weapon_base = inherit_table(game_object)
|
||||
-- инициализация FSM
|
||||
weapon_base.m_fsm = {}
|
||||
|
||||
-- покой
|
||||
weapon_base.m_fsm[WEAPON_FSM_STATE_IDLE] = {
|
||||
anim = "idle", -- имя анимации
|
||||
anim_playback = ANIM_PLAYBACK_REPEAT, -- бесконечно играть
|
||||
anim_speed = 1.0 -- обычная скорость анимации
|
||||
}
|
||||
|
||||
-- атака
|
||||
weapon_base.m_fsm[WEAPON_FSM_STATE_ATTACK] = {
|
||||
anim = "attack", -- имя анимации
|
||||
anim_playback = ANIM_PLAYBACK_NONE,
|
||||
anim_speed = 1.0 -- обычная скорость анимации
|
||||
}
|
||||
|
||||
-- перезарядка
|
||||
weapon_base.m_fsm[WEAPON_FSM_STATE_RELOAD] = {
|
||||
anim = "reload", -- имя анимации
|
||||
anim_playback = ANIM_PLAYBACK_NONE,
|
||||
anim_speed = 1.0 -- обычная скорость анимации
|
||||
}
|
||||
|
||||
function weapon_base:on_init()
|
||||
game_object.on_init(self)
|
||||
|
||||
-- начальное состояние FSM
|
||||
self.m_state = WEAPON_FSM_STATE_IDLE
|
||||
self.m_state = WEAPON_FSM_STATE_NONE
|
||||
self.m_next_state = WEAPON_FSM_STATE_IDLE
|
||||
self.m_state_time = 0.0
|
||||
self.m_end_state_time = 0.0
|
||||
@@ -64,46 +44,96 @@ function weapon_base:on_fsm_state_update(dt)
|
||||
self.m_state_time = self.m_state_time + dt
|
||||
|
||||
-- проверка на стрельбу
|
||||
if (self.m_state == WEAPON_STATE_ATTACK or
|
||||
self.m_state == WEAPON_STATE_ATTACK2) and
|
||||
if (self.m_state == WEAPON_FSM_STATE_ATTACK or
|
||||
self.m_state == WEAPON_FSM_STATE_ATTACK2) and
|
||||
self.m_state_time >= self.m_end_state_time then
|
||||
|
||||
-- переходим в ожидание
|
||||
self:set_state(WEAPON_STATE_IDLE)
|
||||
self:set_state(WEAPON_FSM_STATE_IDLE)
|
||||
end
|
||||
|
||||
-- костыль, нету анимаций бесконечных
|
||||
if self.m_state == WEAPON_STATE_IDLE and self.m_state_time >= self.m_end_state_time then
|
||||
if self.m_state == WEAPON_FSM_STATE_IDLE and self.m_state_time >= self.m_end_state_time then
|
||||
-- переходим в ожидание
|
||||
self:set_state(WEAPON_STATE_IDLE)
|
||||
self:set_state(WEAPON_FSM_STATE_IDLE)
|
||||
end
|
||||
|
||||
self:fsm_update(dt)
|
||||
end
|
||||
|
||||
function weapon_base:set_state(next_state)
|
||||
if self.m_state == next_state or self.m_next_state == next_state then
|
||||
return
|
||||
end
|
||||
|
||||
if (self.m_state == WEAPON_FSM_STATE_ATTACK or self.m_state == WEAPON_FSM_STATE_RELOAD)
|
||||
and next_state ~= WEAPON_FSM_STATE_IDLE then
|
||||
return
|
||||
end
|
||||
|
||||
self.m_next_state = next_state
|
||||
console.print(string.format("weapon_base:set_state: switich to '%d' ", next_state))
|
||||
end
|
||||
|
||||
function weapon_base:fsm_update(dt)
|
||||
|
||||
-- надо ли менять состояние
|
||||
if self.m_next_state ~= self.m_state then
|
||||
|
||||
if self.m_next_state == WEAPON_STATE_ATTACK then
|
||||
self:set_anim("attack1")
|
||||
elseif self.m_next_state == WEAPON_STATE_ATTACK2 then
|
||||
self:set_anim("attack1")
|
||||
end
|
||||
self:on_state_switch(self.m_next_state)
|
||||
|
||||
-- сброс времени и установка его на таймер анимации
|
||||
self.m_state_time = 0.0
|
||||
self.m_end_state_time = render.get_anim_time(self:get_anim())
|
||||
self.m_end_state_time = self:get_animation_time(self:get_current_animation())
|
||||
|
||||
-- запускаем атаку
|
||||
if self.m_next_state == WEAPON_STATE_ATTACK or self.m_next_state == WEAPON_STATE_ATTACK2 then
|
||||
self:attack()
|
||||
end
|
||||
console.print(string.format("weapon_base:fsm_update: switched from '%d' to '%d', end time %f ",
|
||||
self.m_state, self.m_next_state, self.m_end_state_time))
|
||||
|
||||
self.m_state = self.m_next_state
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function weapon_base:find_fsm_state(state)
|
||||
for k, v in pairs(self.m_fsm) do
|
||||
if k == state then
|
||||
return v
|
||||
end
|
||||
end
|
||||
|
||||
console.print(string.format("weapon_base:find_fsm_state: state '%d' not found or not registered", state))
|
||||
return nil
|
||||
end
|
||||
|
||||
function weapon_base:on_state_switch(state)
|
||||
-- ищем стейт в таблице
|
||||
local fsm_state = self:find_fsm_state(state)
|
||||
if not fsm_state then
|
||||
return
|
||||
end
|
||||
|
||||
local anim_id = self:find_animation(fsm_state.anim)
|
||||
self:play_animation(anim_id, fsm_state.anim_playback)
|
||||
end
|
||||
|
||||
function weapon_base:set_relative_position_to_camera( ent )
|
||||
local camX, camY, camZ = camera.get_position()
|
||||
local frontX, frontY, frontZ = camera.get_front()
|
||||
local rightX, rightY, rightZ = camera.get_right()
|
||||
local upX, upY, upZ = camera.get_up()
|
||||
|
||||
self:set_rotation_from_vectors(frontX, frontY, frontZ,
|
||||
rightX, rightY, rightZ,
|
||||
upX, upY, upZ)
|
||||
|
||||
local offsetx = 0.0
|
||||
local offsety = 0.0
|
||||
local offsetz = 0.0
|
||||
|
||||
local x = camX + (rightX * offsetx) + (upX * offsety) + (frontX * offsetz)
|
||||
local y = camY + (rightY * offsetx) + (upY * offsety) + (frontY * offsetz)
|
||||
local z = camZ + (rightZ * offsetx) + (upZ * offsety) + (frontZ * offsetz)
|
||||
self:set_position(x, y, z)
|
||||
|
||||
-- force update transform
|
||||
self:update_transform()
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user