mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2024-12-29 03:19:44 +00:00
115 lines
3.6 KiB
Lua
115 lines
3.6 KiB
Lua
local ambient = require('openmw.ambient')
|
|
local core = require('openmw.core')
|
|
local Skill = core.stats.Skill
|
|
local I = require('openmw.interfaces')
|
|
local nearby = require('openmw.nearby')
|
|
local self = require('openmw.self')
|
|
local types = require('openmw.types')
|
|
local NPC = types.NPC
|
|
local Actor = types.Actor
|
|
local ui = require('openmw.ui')
|
|
|
|
local cell = nil
|
|
local autodoors = {}
|
|
|
|
local function onCellChange()
|
|
autodoors = {}
|
|
for _, door in ipairs(nearby.doors) do
|
|
if door.type == types.ESM4Door and types.ESM4Door.record(door).isAutomatic then
|
|
autodoors[#autodoors + 1] = door
|
|
end
|
|
end
|
|
end
|
|
|
|
local autodoorActivationDist = 300
|
|
|
|
local lastAutoActivation = 0
|
|
local function processAutomaticDoors()
|
|
if core.getRealTime() - lastAutoActivation < 2 then
|
|
return
|
|
end
|
|
for _, door in ipairs(autodoors) do
|
|
if door.enabled and (door.position - self.position):length() < autodoorActivationDist then
|
|
print('Automatic activation of', door)
|
|
door:activateBy(self)
|
|
lastAutoActivation = core.getRealTime()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function skillLevelUpHandler(skillid, source, params)
|
|
local skillStat = NPC.stats.skills[skillid](self)
|
|
if skillStat.base >= 100 then
|
|
return false
|
|
end
|
|
|
|
if params.skillIncreaseValue then
|
|
skillStat.base = skillStat.base + params.skillIncreaseValue
|
|
end
|
|
|
|
local levelStat = Actor.stats.level(self)
|
|
if params.levelUpProgress then
|
|
levelStat.progress = levelStat.progress + params.levelUpProgress
|
|
end
|
|
|
|
if params.levelUpAttribute and params.levelUpAttributeIncreaseValue then
|
|
levelStat.skillIncreasesForAttribute[params.levelUpAttribute]
|
|
= levelStat.skillIncreasesForAttribute[params.levelUpAttribute] + params.levelUpAttributeIncreaseValue
|
|
end
|
|
|
|
if params.levelUpSpecialization and params.levelUpSpecializationIncreaseValue then
|
|
levelStat.skillIncreasesForSpecialization[params.levelUpSpecialization]
|
|
= levelStat.skillIncreasesForSpecialization[params.levelUpSpecialization] + params.levelUpSpecializationIncreaseValue;
|
|
end
|
|
|
|
local skillRecord = Skill.record(skillid)
|
|
local npcRecord = NPC.record(self)
|
|
local class = NPC.classes.record(npcRecord.class)
|
|
|
|
ambient.playSound("skillraise")
|
|
|
|
local message = string.format(core.getGMST('sNotifyMessage39'),skillRecord.name,skillStat.base)
|
|
|
|
if source == I.SkillProgression.SKILL_INCREASE_SOURCES.Book then
|
|
message = '#{sBookSkillMessage}\n'..message
|
|
end
|
|
|
|
ui.showMessage(message, { showInDialogue = false })
|
|
|
|
if levelStat.progress >= core.getGMST('iLevelUpTotal') then
|
|
ui.showMessage('#{sLevelUpMsg}', { showInDialogue = false })
|
|
end
|
|
|
|
if not source or source == I.SkillProgression.SKILL_INCREASE_SOURCES.Usage then skillStat.progress = 0 end
|
|
end
|
|
|
|
local function skillUsedHandler(skillid, params)
|
|
if NPC.isWerewolf(self) then
|
|
return false
|
|
end
|
|
|
|
local skillStat = NPC.stats.skills[skillid](self)
|
|
skillStat.progress = skillStat.progress + params.skillGain / I.SkillProgression.getSkillProgressRequirement(skillid)
|
|
|
|
if skillStat.progress >= 1 then
|
|
I.SkillProgression.skillLevelUp(skillid, I.SkillProgression.SKILL_INCREASE_SOURCES.Usage)
|
|
end
|
|
end
|
|
|
|
local function onUpdate()
|
|
if self.cell ~= cell then
|
|
cell = self.cell
|
|
onCellChange()
|
|
end
|
|
processAutomaticDoors()
|
|
end
|
|
|
|
I.SkillProgression.addSkillUsedHandler(skillUsedHandler)
|
|
I.SkillProgression.addSkillLevelUpHandler(skillLevelUpHandler)
|
|
|
|
return {
|
|
engineHandlers = {
|
|
onUpdate = onUpdate,
|
|
},
|
|
}
|