This commit is contained in:
lifestorm
2024-08-04 23:54:45 +03:00
parent 8064ba84d8
commit 6a58f406b1
7522 changed files with 4011896 additions and 15 deletions

View File

@@ -0,0 +1,180 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
-- registers the actions as ix.action and ix.action.list
-- registers the functions:
-- ix.action.Getactions() - returns actions on character
-- ix.action.RegisterSkillAction(uniqueID, data) - registers action specified
-- ix.action.Find(action) - finds the action specified
ix.action = ix.action or {}
ix.action.list = ix.action.list or {}
local isfunction = isfunction
function ix.action:RegisterSkillAction(skillID, uniqueID, data)
if (!uniqueID or type(uniqueID) != "string") then
ErrorNoHalt("Attempted to register action without valid uniqueID.")
return
end
data.uniqueID = uniqueID
data.name = data.name or "Unknown"
data.description = data.description or "No description given."
if (data.DoResult and type(data.DoResult) == "table" and data.DoResult[1]) then
table.SortByMember(data.DoResult, "level", true)
local copy = {}
for k, v in pairs(data.DoResult) do
copy[v.level] = v.exp
end
local currExp = 0
data.DoResult = {}
for i = 0, ix.skill.MAX_SKILL - 1 do
if (copy[i]) then currExp = copy[i] end
data.DoResult[i] = currExp
end
data.DoResult[ix.skill.MAX_SKILL] = 0
end
if (!skillID or !ix.skill:Find(skillID)) then
ErrorNoHalt("Attempted to register '"..uniqueID.."' action without valid skill.")
return
else
data.skill = ix.skill:Find(skillID).uniqueID
ix.skill:RegisterSkillAction(data.skill, data)
end
ix.action.list[uniqueID] = data
end
function ix.action:Find(actionID)
if (ix.action.list[actionID]) then
return ix.action.list[actionID]
else
for _, action in pairs(ix.action.list) do
if (string.find(action.name:utf8lower(), actionID:utf8lower())) then
return action
end
end
end
end
if (SERVER) then
ix.log.AddType("actionsDoAction", function(client, name, result, skill)
return string.format("%s has performed the '%s' action, gaining %d experience in %s.", client:GetName(), name, result, skill)
end)
ix.log.AddType("actionsDoActionNoExp", function(client, name)
return string.format("%s has performed the '%s' action.", client:GetName(), name)
end)
end
do
local CHAR = ix.meta.character
function CHAR:CanDoAction(actionID, ...)
local action = ix.action:Find(actionID)
if (!action) then
--ErrorNoHalt("Attempted to check if player can do invalid action '"..(actionID or "nil").."'.")
return
end
if (!action.CanDo) then
return true
end
if (!isfunction(action.CanDo)) then
return self:GetSkillLevel(action.skill) >= action.CanDo
else
return action:CanDo(self, self:GetSkillLevel(action.skill), ...)
end
end
if (SERVER) then
function CHAR:DoAction(actionID, ...)
local action = ix.action:Find(actionID)
if (!action) then
ErrorNoHalt(string.format("[ACTIONS] Attempted to do invalid action '%s'.", actionID))
end
local result = self:GetResult(actionID, ...)
if (result and result > 0 and self:GetSkillLevel(action.skill) >= 0) then
if (self:GetSkill(action.skill) >= ix.skill.MAX_SKILL) then
return
end
local storedExp = self:GetSkillStoredExp(action.skill)
self:SetSkillStoredExp(action.skill, math.min(result, 1999 - storedExp))
if (self:GetSkillAutoLevel(action.skill)) then
self:LevelUpSkill(action.skill)
elseif (self:CanLevelSkill(action.skill) and storedExp < 1000) then
local skill = ix.skill:Find(action.skill)
self:GetPlayer():NotifyLocalized("levelPossible", skill.name, self:GetSkill(skill.uniqueID) + 1)
end
if (!action.bNoLog) then
ix.log.Add(self:GetPlayer(), "actionsDoAction", action.name, result, action.skill)
end
elseif (action.alwaysLog) then
ix.log.Add(self:GetPlayer(), "actionsDoActionNoExp", action.name)
end
end
end
local function GetExp(DoResult, skillLevel)
for k, v in ipairs(DoResult) do
if (v.level > skillLevel) then
break
elseif (v.level <= skillLevel and skillLevel < DoResult[k + 1].level) then
return v.exp
end
end
return 0
end
function CHAR:GetResult(actionID, ...)
local action = ix.action:Find(actionID)
if (!action) then
--ErrorNoHalt("Attempted to get result from invalid action '"..(actionID or "nil").."'.")
return
end
if (!action.DoResult) then
return 0
end
local min = self:GetSkill(action.skill)
local max = math.max(min, self:GetSkillLevel(action.skill))
if (!isfunction(action.DoResult)) then
local maxExp = 0
for k = min, max do
if (action.DoResult[k] and action.DoResult[k] > maxExp) then
maxExp = action.DoResult[k]
end
end
return maxExp
else
local maxExp = 0
for i = min, max do
local result = action:DoResult(self, i, ...) or 0
if (result > maxExp) then
maxExp = result
end
end
return maxExp
end
end
end