LuaPlus extenssion
This commit is contained in:
109
data/scripts/weapons/weapon_base.lua
Normal file
109
data/scripts/weapons/weapon_base.lua
Normal file
@@ -0,0 +1,109 @@
|
||||
-----------------------------------------------------------
|
||||
-- weapon_base.lua, Базоавый скрипт оружия
|
||||
-- Автор: Кирилл
|
||||
-- Изменяли:
|
||||
-- Дата: 05.03.2026
|
||||
-----------------------------------------------------------
|
||||
|
||||
-- индификаторы состояний FSM
|
||||
WEAPON_FSM_STATE_IDLE = 1
|
||||
WEAPON_FSM_STATE_ATTACK = 2
|
||||
WEAPON_FSM_STATE_ATTACK2 = 3
|
||||
WEAPON_FSM_STATE_RELOAD = 4
|
||||
|
||||
-- базовый класс оружия
|
||||
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_next_state = WEAPON_FSM_STATE_IDLE
|
||||
self.m_state_time = 0.0
|
||||
self.m_end_state_time = 0.0
|
||||
self.m_damage = 25
|
||||
end
|
||||
|
||||
function weapon_base:on_shutdown()
|
||||
game_object.on_shutdown(self)
|
||||
end
|
||||
|
||||
function weapon_base:on_update(dt)
|
||||
game_object.on_update(self, dt)
|
||||
|
||||
self:on_fsm_state_update(dt)
|
||||
end
|
||||
|
||||
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
|
||||
self.m_state_time >= self.m_end_state_time then
|
||||
|
||||
-- переходим в ожидание
|
||||
self:set_state(WEAPON_STATE_IDLE)
|
||||
end
|
||||
|
||||
-- костыль, нету анимаций бесконечных
|
||||
if self.m_state == WEAPON_STATE_IDLE and self.m_state_time >= self.m_end_state_time then
|
||||
-- переходим в ожидание
|
||||
self:set_state(WEAPON_STATE_IDLE)
|
||||
end
|
||||
|
||||
self:fsm_update(dt)
|
||||
end
|
||||
|
||||
function weapon_base:set_state(next_state)
|
||||
self.m_next_state = 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.m_state_time = 0.0
|
||||
self.m_end_state_time = render.get_anim_time(self:get_anim())
|
||||
|
||||
-- запускаем атаку
|
||||
if self.m_next_state == WEAPON_STATE_ATTACK or self.m_next_state == WEAPON_STATE_ATTACK2 then
|
||||
self:attack()
|
||||
end
|
||||
|
||||
self.m_state = self.m_next_state
|
||||
end
|
||||
end
|
||||
1
data/scripts/weapons/weapon_key.lua
Normal file
1
data/scripts/weapons/weapon_key.lua
Normal file
@@ -0,0 +1 @@
|
||||
weapon_key = inherit_table(weapon_base)
|
||||
Reference in New Issue
Block a user