306 lines
11 KiB
Lua
306 lines
11 KiB
Lua
---@diagnostic disable: duplicate-set-field
|
|
Skills = Skills or {}
|
|
Skills.All = Skills.All or {}
|
|
---This will get the name of the Skills system being being used.
|
|
---@return string
|
|
Skills.GetResourceName = function()
|
|
return "community_bridge"
|
|
end
|
|
|
|
Skills.Create = function(name, maxLevel, baseXP)
|
|
if not name then return end
|
|
local self = Skills.All[name] or {}
|
|
self.maxLevel = maxLevel or 99
|
|
self.baseXP = baseXP or 50
|
|
self.name = name
|
|
Skills.All[name] = self
|
|
Skills.GenerateCache(name, maxLevel)
|
|
return self
|
|
end
|
|
|
|
Skills.GetTotalXPForLevel = function(skillName, level)
|
|
if not skillName or not level or level < 1 then return 0 end
|
|
local skill = Skills.All[skillName]
|
|
if not skill then return 0 end
|
|
local cache = skill.cache or {}
|
|
if cache[level] then return cache[level] end
|
|
local xp = 0
|
|
for n = 1, level - 1 do
|
|
xp = xp + (n + 300 * (2 ^ (n / 7)))
|
|
end
|
|
xp = math.floor(xp / 4)
|
|
cache[level] = xp
|
|
return xp
|
|
end
|
|
|
|
Skills.GetLevelFromXP = function(skillName, xp)
|
|
if not skillName or not xp or xp < 0 then return 1 end
|
|
local skill = Skills.All[skillName]
|
|
if not skill then return 1 end
|
|
local cache = skill.cache or {}
|
|
for level = 1, skill.maxLevel do
|
|
local requiredXp = Skills.GetTotalXPForLevel(skillName, level)
|
|
if requiredXp > xp then
|
|
return level - 1
|
|
end
|
|
end
|
|
return skill.maxLevel
|
|
end
|
|
|
|
Skills.GenerateCache = function(skillName, maxLevel)
|
|
if not skillName or not maxLevel or maxLevel < 1 then return {} end
|
|
local cache = {}
|
|
for level = 1, maxLevel do
|
|
cache[level] = Skills.GetTotalXPForLevel(skillName, level)
|
|
end
|
|
return cache
|
|
end
|
|
|
|
Skills.GetScaledXP = function(baseXP, playerLevel)
|
|
if not baseXP or baseXP <= 0 then return 0 end
|
|
return math.floor(baseXP * (1 + playerLevel * 0.05))
|
|
end
|
|
|
|
Skills.GetPlayerLevel = function(src, skillName)
|
|
if not src or not skillName then return 1 end
|
|
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
return skill.level or 1
|
|
end
|
|
|
|
Skills.SetPlayerLevel = function(src, skillName, level)
|
|
if not src or not skillName or not level or level < 1 then return false end
|
|
if not Skills.All[skillName] then
|
|
Skills.All[skillName] = Skills.Create(skillName, 99, 50)
|
|
end
|
|
|
|
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
skill.level = math.min(Skills.All[skillName].maxLevel, level)
|
|
skill.xp = 0
|
|
|
|
playerSkills[skillName] = skill
|
|
Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
return true
|
|
end
|
|
|
|
Skills.AddPlayerXP = function(src, skillName, xp)
|
|
if not src or not skillName then return false end
|
|
if not Skills.All[skillName] then
|
|
Skills.All[skillName] = Skills.Create(skillName, 99, 50)
|
|
end
|
|
|
|
if not xp or xp < 0 then
|
|
xp = Skills.GetScaledXP(Skills.All[skillName].baseXP, Skills.GetPlayerLevel(src, skillName))
|
|
end
|
|
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
skill.xp = skill.xp + xp
|
|
skill.level = Skills.GetLevelFromXP(skillName, skill.xp)
|
|
|
|
playerSkills[skillName] = skill
|
|
Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
return true
|
|
end
|
|
|
|
Skills.SetXP = function(src, skillName, xp)
|
|
if not src or not skillName or not xp or xp < 0 then return false end
|
|
if not Skills.All[skillName] then
|
|
Skills.All[skillName] = Skills.Create(skillName, 99, 50)
|
|
end
|
|
|
|
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
skill.xp = math.max(0, xp)
|
|
skill.level = Skills.GetLevelFromXP(skillName, skill.xp)
|
|
|
|
playerSkills[skillName] = skill
|
|
Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
return true
|
|
end
|
|
|
|
Skills.GetXP = function(src, skillName)
|
|
if not src or not skillName then return 0 end
|
|
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
return skill.xp or 0
|
|
end
|
|
|
|
|
|
|
|
-- Skills.AddSkillLevel = function(src, skillName, amount)
|
|
-- if not src or not skillName then return false end
|
|
-- if not Skills.All[skillName] then
|
|
-- Skills.All[skillName] = Skills.Create(skillName, 99, 50)
|
|
-- end
|
|
|
|
-- local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
-- skill.level = math.min(Skills.All[skillName].maxLevel, skill.level + (amount or 1))
|
|
-- skill.xp = Skills.GetScaledXP(Skills.All[skillName].baseXP, skill.level)
|
|
|
|
-- playerSkills[skillName] = skill
|
|
-- Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
-- return true
|
|
-- end
|
|
|
|
|
|
|
|
-- Skills.AddXp = function(src, skillName, amount)
|
|
-- if not src or not skillName then return false end
|
|
-- if not Skills.All[skillName] then
|
|
-- Skills.All[skillName] = Skills.Create(skillName, 99, 50)
|
|
-- end
|
|
-- if not amount or amount < 0 then
|
|
-- amount = Skills.GetScaledXP(Skills.All[skillName].baseXP, Skills.GetSkillLevel(src, skillName))
|
|
-- end
|
|
|
|
-- local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
-- skill.xp = skill.xp + amount
|
|
-- skill.level = Skills.GetLevelFromXP(skillName, skill.xp)
|
|
|
|
-- playerSkills[skillName] = skill
|
|
-- Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
-- return true
|
|
-- end
|
|
|
|
-- Skills.RemoveXp = function(src, skillName, amount)
|
|
-- if not src or not skillName then return false end
|
|
|
|
-- if not amount or amount <= 0 then
|
|
-- amount = Skills.GetScaledXP(Skills.All[skillName].baseXP or 0, Skills.GetSkillLevel(src, skillName))
|
|
-- end
|
|
|
|
-- local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- local skill = playerSkills[skillName] or { xp = 0, level = 1 }
|
|
-- skill.xp = math.max(0, skill.xp - amount)
|
|
-- skill.level = Skills.GetLevelFromXP(skillName, skill.xp)
|
|
|
|
-- playerSkills[skillName] = skill
|
|
-- Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
-- return true
|
|
-- end
|
|
|
|
|
|
|
|
|
|
--92 is half way to 99 :P
|
|
-- local levelTable = {
|
|
-- [1] = 0, [2] = 83, [3] = 174, [4] = 276, [5] = 388, [6] = 512, [7] = 650, [8] = 801, [9] = 969, [10] = 1154,
|
|
-- [11] = 1358, [12] = 1584, [13] = 1833, [14] = 2107, [15] = 2411, [16] = 2746, [17] = 3115, [18] = 3523, [19] = 3973, [20] = 4470,
|
|
-- [21] = 5018, [22] = 5624, [23] = 6291, [24] = 7028, [25] = 7842, [26] = 8740, [27] = 9730, [28] = 10824, [29] = 12031, [30] = 13363,
|
|
-- [31] = 14833, [32] = 16456, [33] = 18247, [34] = 20224, [35] = 22406, [36] = 24815, [37] = 27473, [38] = 30408, [39] = 33648, [40] = 37224,
|
|
-- [41] = 41171, [42] = 45529, [43] = 50339, [44] = 55649, [45] = 61512, [46] = 67983, [47] = 75127, [48] = 83014, [49] = 91721, [50] = 101333,
|
|
-- [51] = 111945, [52] = 123660, [53] = 136594, [54] = 150872, [55] = 166636, [56] = 184040, [57] = 203254, [58] = 224466, [59] = 247886, [60] = 273742,
|
|
-- [61] = 302288, [62] = 333804, [63] = 368599, [64] = 407015, [65] = 449428, [66] = 496254, [67] = 547953, [68] = 605032, [69] = 668051, [70] = 737627,
|
|
-- [71] = 814445, [72] = 899257, [73] = 992895, [74] = 1096278, [75] = 1210421, [76] = 1336443, [77] = 1475581, [78] = 1629200, [79] = 1798808, [80] = 1986068,
|
|
-- [81] = 2192818, [82] = 2421087, [83] = 2673114, [84] = 2951373, [85] = 3258594, [86] = 3597792, [87] = 3972294, [88] = 4385776, [89] = 4842295, [90] = 5346332,
|
|
-- [91] = 5902831, [92] = 6517253, [93] = 7195629, [94] = 7944614, [95] = 8771558, [96] = 9684577, [97] = 10692629, [98] = 11805606, [99] = 13034431
|
|
-- }
|
|
|
|
|
|
-- local levelTable = {}
|
|
|
|
-- -- Calculate XP required for a specific level using the algorithm: xp(L) = ⌊(1/4) * Σ [n + 300 * 2^(n/7)]⌋
|
|
-- local function getXPForLevel(level)
|
|
-- if levelTable[level] then return levelTable[level] end
|
|
-- if level <= 1 then return 0 end
|
|
|
|
-- local xp = 0
|
|
-- for n = 1, level - 1 do
|
|
-- xp = xp + (n + 300 * (2 ^ (n / 7)))
|
|
-- end
|
|
-- xp = math.floor(xp / 4)
|
|
-- levelTable[level] = xp
|
|
-- return xp
|
|
-- end
|
|
|
|
-- ---Calculate level from total XP
|
|
-- ---@param xp number
|
|
-- ---@return number
|
|
-- local function calculateLevelFromXp(xp)
|
|
-- if xp <= 0 then return 1 end
|
|
|
|
-- for level = #levelTable, 1, -1 do
|
|
-- local requiredXp = getXPForLevel(level)
|
|
-- if requiredXp <= xp then
|
|
-- return level
|
|
-- end
|
|
-- if levelTable[level] and xp >= levelTable[level] then return level end
|
|
-- end
|
|
|
|
-- return 1
|
|
-- end
|
|
|
|
-- ---Get or create a specific skill for a player
|
|
-- ---@param src number
|
|
-- ---@param skillName string
|
|
-- ---@return table
|
|
-- local function getOrCreateSkill(src, skillName)
|
|
-- local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- if not playerSkills[skillName] then
|
|
-- playerSkills[skillName] = { xp = 0, level = 1 }
|
|
-- Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
-- end
|
|
|
|
-- return playerSkills[skillName]
|
|
-- end
|
|
|
|
-- ---This will get the skill level of the passed skill name.
|
|
-- ---@param src number
|
|
-- ---@param skillName string
|
|
-- ---@return number
|
|
-- Skills.GetSkillLevel = function(src, skillName)
|
|
-- local skill = getOrCreateSkill(src, skillName)
|
|
-- return skill.level or 1
|
|
-- end
|
|
|
|
-- ---This will get all skills for a player
|
|
-- ---@param src number
|
|
-- ---@return table
|
|
-- Skills.GetAllSkills = function(src)
|
|
-- return Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- end
|
|
|
|
-- ---This will add xp to the passed skill name.
|
|
-- ---@param src number
|
|
-- ---@param skillName string
|
|
-- ---@param amount number
|
|
-- ---@return boolean
|
|
-- Skills.AddXp = function(src, skillName, amount)
|
|
-- if not src or not skillName or not amount or amount <= 0 then return false end
|
|
|
|
-- local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- local skill = getOrCreateSkill(src, skillName)
|
|
|
|
-- skill.xp = skill.xp + amount
|
|
-- skill.level = calculateLevelFromXp(skill.xp)
|
|
|
|
-- playerSkills[skillName] = skill
|
|
-- Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
|
|
-- return true
|
|
-- end
|
|
|
|
-- ---This will remove xp from the passed skill name.
|
|
-- ---@param src number
|
|
-- ---@param skillName string
|
|
-- ---@param amount number
|
|
-- ---@return boolean
|
|
-- Skills.RemoveXp = function(src, skillName, amount)
|
|
-- if not src or not skillName or not amount or amount <= 0 then return false end
|
|
|
|
-- local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
|
-- local skill = getOrCreateSkill(src, skillName)
|
|
|
|
-- skill.xp = math.max(0, skill.xp - amount)
|
|
-- skill.level = calculateLevelFromXp(skill.xp)
|
|
|
|
-- playerSkills[skillName] = skill
|
|
-- Framework.SetPlayerMetadata(src, "community_bridge_skills", playerSkills)
|
|
|
|
-- return true
|
|
-- end
|
|
|
|
-- return Skills |