Skip to content

Commit

Permalink
perf: optimize experience gain and loss calculations
Browse files Browse the repository at this point in the history
  • Loading branch information
omarcopires committed Sep 23, 2024
1 parent ae39682 commit 542ba48
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 66 deletions.
100 changes: 34 additions & 66 deletions data/events/scripts/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -527,52 +527,48 @@ function Player:onGainExperience(target, exp, rawExp)
self:addCondition(soulCondition)
end

-- XP Boost Bonus
useStaminaXpBoost(self) -- Use stamina XP boost (store or daily reward)
-- Apply XP Boost (Store or Daily Reward)
useStaminaXpBoost(self)

local xpBoostTimeLeft = self:getXpBoostTime()
local stillHasXpBoost = xpBoostTimeLeft > 0
local xpBoostPercent = stillHasXpBoost and self:getXpBoostPercent() or 0

self:setXpBoostPercent(xpBoostPercent)
local hasXpBoost = xpBoostTimeLeft > 0
local xpBoostPercent = hasXpBoost and self:getXpBoostPercent() or 0

-- Stamina Bonus
local staminaBonusXp = 1
local isStaminaEnabled = configManager.getBoolean(configKeys.STAMINA_SYSTEM)
useStamina(self, isStaminaEnabled)
if isStaminaEnabled then
if configManager.getBoolean(configKeys.STAMINA_SYSTEM) then
useStamina(self, true)
staminaBonusXp = self:getFinalBonusStamina()
self:setStaminaXpBoost(staminaBonusXp * 100)
end

-- Concoction System
useConcoctionTime(self)

-- Boosted creature
if target:getName():lower() == (Game.getBoostedCreature()):lower() then
-- Apply Boosted Creature Bonus
if target:getName():lower() == Game.getBoostedCreature():lower() then
exp = exp * 2
end

-- Prey system
-- Prey System
if configManager.getBoolean(configKeys.PREY_ENABLED) then
local monsterType = target:getType()
if monsterType and monsterType:raceId() > 0 then
exp = math.ceil((exp * self:getPreyExperiencePercentage(monsterType:raceId())) / 100)
end
end

-- VIP Bonus Experience
if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) then
local vipBonusExp = configManager.getNumber(configKeys.VIP_BONUS_EXP)
if vipBonusExp > 0 and self:isVip() then
vipBonusExp = (vipBonusExp > 100 and 100) or vipBonusExp
exp = exp * (1 + (vipBonusExp / 100))
exp = exp * (1 + math.min(vipBonusExp, 100) / 100)
end
end

local lowLevelBonuxExp = self:getFinalLowLevelBonus()
local baseRate = self:getFinalBaseRateExperience()
-- Final Adjustments: Low Level Bonus and Base Rate
local lowLevelBonusExp = self:getFinalLowLevelBonus()
local baseRateExp = self:getFinalBaseRateExperience()

return (exp + (exp * (xpBoostPercent / 100) + (exp * (lowLevelBonuxExp / 100)))) * staminaBonusXp * baseRate
-- Return final experience value
return (exp * (1 + xpBoostPercent / 100 + lowLevelBonusExp / 100)) * staminaBonusXp * baseRateExp
end

function Player:onLoseExperience(exp)
Expand All @@ -584,42 +580,35 @@ function Player:onGainSkillTries(skill, tries)
if IsRunningGlobalDatapack() and isSkillGrowthLimited(self, skill) then
return 0
end

if not APPLY_SKILL_MULTIPLIER then
return tries
end

-- Event scheduler skill rate
local STAGES_DEFAULT = nil
if configManager.getBoolean(configKeys.RATE_USE_STAGES) then
STAGES_DEFAULT = skillsStages
end
local SKILL_DEFAULT = self:getSkillLevel(skill)
local RATE_DEFAULT = configManager.getNumber(configKeys.RATE_SKILL)
-- Default skill rate settings
local rateSkillStages = configManager.getBoolean(configKeys.RATE_USE_STAGES) and skillsStages or nil
local currentSkillLevel = self:getSkillLevel(skill)
local baseRate = configManager.getNumber(configKeys.RATE_SKILL)

-- Special case for magic level
if skill == SKILL_MAGLEVEL then
-- Magic Level
if configManager.getBoolean(configKeys.RATE_USE_STAGES) then
STAGES_DEFAULT = magicLevelStages
end
SKILL_DEFAULT = self:getBaseMagicLevel()
RATE_DEFAULT = configManager.getNumber(configKeys.RATE_MAGIC)
rateSkillStages = configManager.getBoolean(configKeys.RATE_USE_STAGES) and magicLevelStages or nil
currentSkillLevel = self:getBaseMagicLevel()
baseRate = configManager.getNumber(configKeys.RATE_MAGIC)
end

local skillOrMagicRate = getRateFromTable(STAGES_DEFAULT, SKILL_DEFAULT, RATE_DEFAULT)

if SCHEDULE_SKILL_RATE ~= 100 then
skillOrMagicRate = math.max(0, (skillOrMagicRate * SCHEDULE_SKILL_RATE) / 100)
end
-- Calculate skill rate from stages and schedule
local skillRate = getRateFromTable(rateSkillStages, currentSkillLevel, baseRate)
skillRate = (SCHEDULE_SKILL_RATE ~= 100) and (skillRate * SCHEDULE_SKILL_RATE / 100) or skillRate

if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) then
local vipBoost = configManager.getNumber(configKeys.VIP_BONUS_SKILL)
if vipBoost > 0 and self:isVip() then
vipBoost = (vipBoost > 100 and 100) or vipBoost
skillOrMagicRate = skillOrMagicRate + (skillOrMagicRate * (vipBoost / 100))
end
-- Apply VIP boost if applicable
if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) and self:isVip() then
local vipBonusSkill = math.min(configManager.getNumber(configKeys.VIP_BONUS_SKILL), 100)
skillRate = skillRate + (skillRate * (vipBonusSkill / 100))
end

return tries / 100 * (skillOrMagicRate * 100)
-- Calculate and return the final experience gain
return tries * skillRate
end

function Player:onCombat(target, item, primaryDamage, primaryType, secondaryDamage, secondaryType)
Expand Down Expand Up @@ -670,24 +659,3 @@ function Player:onChangeZone(zone)
end

function Player:onInventoryUpdate(item, slot, equip) end

function Player:getURL()
local playerLink = string.gsub(self:getName(), "%s+", "+")
local serverURL = configManager.getString(configKeys.URL)
return serverURL .. "/characters/" .. playerLink
end

function Player:getMarkdownLink()
local vocation = self:vocationAbbrev()
local emoji = ":school_satchel:"
if self:isKnight() then
emoji = ":crossed_swords:"
elseif self:isPaladin() then
emoji = ":bow_and_arrow:"
elseif self:isDruid() then
emoji = ":herb:"
elseif self:isSorcerer() then
emoji = ":crystal_ball:"
end
return "**[" .. self:getName() .. "](" .. self:getURL() .. ")** " .. emoji .. " [_" .. vocation .. "_]"
end
22 changes: 22 additions & 0 deletions data/libs/functions/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1000,3 +1000,25 @@ function Player:canGetReward(rewardId, questName)

return true
end

function Player.getURL(self)
local playerName = self:getName():gsub("%s+", "+")
local serverURL = configManager.getString(configKeys.URL)

return serverURL .. "/characters/" .. playerName
end

local emojiMap = {
["knight"] = ":crossed_swords:",
["paladin"] = ":bow_and_arrow:",
["druid"] = ":herb:",
["sorcerer"] = ":crystal_ball:",
}

function Player.getMarkdownLink(self)
local vocation = self:vocationAbbrev()
local emoji = emojiMap[self:getVocation():getName():lower()] or ":school_satchel:"
local playerURL = self:getURL()

return string.format("**[%s](%s)** %s [_%s_]", self:getName(), playerURL, emoji, vocation)
end

0 comments on commit 542ba48

Please sign in to comment.