Skip to content

Commit

Permalink
refactor: optimize time formatting function for better performance (o…
Browse files Browse the repository at this point in the history
…pentibiabr#2904)

Refactors the getTimeInWords function to improve performance and
code readability. The new implementation adopts a more efficient
approach for calculating and formatting time in days, hours, minutes,
and seconds, reducing redundancy and simplifying the logical flow.

• Optimized the function for better execution speed.
• Simplified the conditions and formatting structure.
• Maintained the same functionality with clearer and more efficient
code.
  • Loading branch information
omarcopires authored Oct 18, 2024
1 parent 2735b8c commit 1af76e2
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ function bossEntrance.onStepIn(creature, item, position, fromPosition, toPositio
if timeLeft > 0 then
player:teleportTo(fromPosition, true)
player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have to wait " .. getTimeInWords(timeLeft) .. " to face " .. bossName .. " again!")
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have to wait " .. Game.getTimeInWords(timeLeft) .. " to face " .. bossName .. " again!")
player:getPosition():sendMagicEffect(CONST_ME_POFF)
return true
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ function teleportBoss.onStepIn(creature, item, position, fromPosition)
if timeLeft > 0 then
player:teleportTo(config.exitPosition, true)
player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have to wait " .. getTimeInWords(timeLeft) .. " to face " .. config.bossName .. " again!")
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have to wait " .. Game.getTimeInWords(timeLeft) .. " to face " .. config.bossName .. " again!")
player:getPosition():sendMagicEffect(CONST_ME_POFF)
return false
end
Expand Down
2 changes: 1 addition & 1 deletion data/events/scripts/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ function Player:onLookInBattleList(creature, distance)
if master and table.contains(summons, creature:getName():lower()) then
local familiarSummonTime = master:kv():get("familiar-summon-time") or 0
description = description .. " (Master: " .. master:getName() .. "). \z
It will disappear in " .. getTimeInWords(familiarSummonTime - os.time())
It will disappear in " .. Game.getTimeInWords(familiarSummonTime - os.time())
end
end
if self:getGroup():getAccess() then
Expand Down
2 changes: 1 addition & 1 deletion data/libs/functions/boss_lever.lua
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ function BossLever:onUse(player)
local currentTime = os.time()
if lastEncounter and currentTime < lastEncounter then
local timeLeft = lastEncounter - currentTime
local timeMessage = getTimeInWords(timeLeft) .. " to face " .. self.name .. " again!"
local timeMessage = Game.getTimeInWords(timeLeft) .. " to face " .. self.name .. " again!"
local message = "You have to wait " .. timeMessage

if currentPlayer ~= player then
Expand Down
62 changes: 0 additions & 62 deletions data/libs/functions/functions.lua
Original file line number Diff line number Diff line change
Expand Up @@ -65,43 +65,6 @@ function getTitle(uid)
return false
end

function getTimeInWords(secsParam)
local secs = tonumber(secsParam)
local days = math.floor(secs / (24 * 3600))
secs = secs - (days * 24 * 3600)
local hours, minutes, seconds = getHours(secs), getMinutes(secs), getSeconds(secs)
local timeStr = ""

if days > 0 then
timeStr = days .. (days > 1 and " days" or " day")
end

if hours > 0 then
if timeStr ~= "" then
timeStr = timeStr .. ", "
end

timeStr = timeStr .. hours .. (hours > 1 and " hours" or " hour")
end

if minutes > 0 then
if timeStr ~= "" then
timeStr = timeStr .. ", "
end

timeStr = timeStr .. minutes .. (minutes > 1 and " minutes" or " minute")
end

if seconds > 0 then
if timeStr ~= "" then
timeStr = timeStr .. " and "
end

timeStr = timeStr .. seconds .. (seconds > 1 and " seconds" or " second")
end
return timeStr
end

function getLootRandom(modifier)
local multi = (configManager.getNumber(configKeys.RATE_LOOT) * SCHEDULE_LOOT_RATE) * (modifier or 1)
return math.random(0, MAX_LOOTCHANCE) * 100 / math.max(1, multi)
Expand Down Expand Up @@ -949,31 +912,6 @@ function SetInfluenced(monsterType, monster, player, influencedLevel)
monster:setForgeStack(influencedLevel)
end

function getHours(seconds)
return math.floor((seconds / 60) / 60)
end

function getMinutes(seconds)
return math.floor(seconds / 60) % 60
end

function getSeconds(seconds)
return seconds % 60
end

function getTime(seconds)
local hours, minutes = getHours(seconds), getMinutes(seconds)
if minutes > 59 then
minutes = minutes - hours * 60
end

if minutes < 10 then
minutes = "0" .. minutes
end

return hours .. ":" .. minutes .. "h"
end

function ReloadDataEvent(cid)
local player = Player(cid)
if not player then
Expand Down
34 changes: 34 additions & 0 deletions data/libs/functions/game.lua
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,37 @@ function Game.setStorageValue(key, value)

globalStorageTable[key] = value
end

function Game.getTimeInWords(seconds)
local days = math.floor(seconds / (24 * 3600))
seconds = seconds % (24 * 3600)
local hours = math.floor(seconds / 3600)
seconds = seconds % 3600
local minutes = math.floor(seconds / 60)
seconds = seconds % 60

local timeParts = {}

if days > 0 then
table.insert(timeParts, days .. (days > 1 and " days" or " day"))
end

if hours > 0 then
table.insert(timeParts, hours .. (hours > 1 and " hours" or " hour"))
end

if minutes > 0 then
table.insert(timeParts, minutes .. (minutes > 1 and " minutes" or " minute"))
end

if seconds > 0 or #timeParts == 0 then
table.insert(timeParts, seconds .. (seconds > 1 and " seconds" or " second"))
end

local timeStr = table.concat(timeParts, ", ")
local lastComma = timeStr:find(", [%a%d]+$")
if lastComma then
timeStr = timeStr:sub(1, lastComma - 1) .. " and" .. timeStr:sub(lastComma + 1)
end
return timeStr
end
6 changes: 3 additions & 3 deletions data/libs/systems/concoctions.lua
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ function Concoction:init(player, sendMessage)
return
end
eventPlayer:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your concoction " .. name .. " is still active for another " .. duration .. ".")
end, 500, player:getId(), self.name, getTimeInWords(self:timeLeft(player)))
end, 500, player:getId(), self.name, Game.getTimeInWords(self:timeLeft(player)))
end
end

Expand All @@ -180,7 +180,7 @@ function Concoction:activate(player, item)
local cooldown = self:cooldown()
if self:lastActivatedAt(player) + cooldown > os.time() then
local cooldownLeft = self:lastActivatedAt(player) + cooldown - os.time()
player:sendTextMessage(MESSAGE_FAILURE, "You must wait " .. getTimeInWords(cooldownLeft) .. " before using " .. item:getName() .. " again.")
player:sendTextMessage(MESSAGE_FAILURE, "You must wait " .. Game.getTimeInWords(cooldownLeft) .. " before using " .. item:getName() .. " again.")
return true
end
self:timeLeft(player, self:totalDuration())
Expand All @@ -191,7 +191,7 @@ function Concoction:activate(player, item)
self.config.callback(player, self.config)
else
self:addCondition(player)
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have activated " .. item:getName() .. ". It will last for " .. getTimeInWords(self:totalDuration()) .. consumptionString .. ".")
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have activated " .. item:getName() .. ". It will last for " .. Game.getTimeInWords(self:totalDuration()) .. consumptionString .. ".")
if self:tickType() == ConcoctionTickType.Online then
addEvent(tick, updateInterval * 1000, self.id, player:getId(), updateInterval)
end
Expand Down
2 changes: 1 addition & 1 deletion data/scripts/eventcallbacks/player/on_look.lua
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ local function handleCreatureDescription(inspectedThing, lookDistance)
local monsterMaster = inspectedThing:getMaster()
if monsterMaster and table.contains({ "sorcerer familiar", "knight familiar", "druid familiar", "paladin familiar" }, inspectedThing:getName():lower()) then
local summonTimeRemaining = monsterMaster:kv():get("familiar-summon-time") or 0
descriptionText = string.format("%s (Master: %s). It will disappear in %s", descriptionText, monsterMaster:getName(), getTimeInWords(summonTimeRemaining - os.time()))
descriptionText = string.format("%s (Master: %s). It will disappear in %s", descriptionText, monsterMaster:getName(), Game.getTimeInWords(summonTimeRemaining - os.time()))
end
end

Expand Down

0 comments on commit 1af76e2

Please sign in to comment.