Files
community_bridge/modules/skills/_default/server.lua
T
gononono64 c53209ef96 typo
the day the earth stood still
2025-06-22 22:23:08 -05:00

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