Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: optimize time formatting function for better performance #2904

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -26,7 +26,7 @@ function callback.playerOnLook(player, thing, position, distance)
local master = thing:getMaster()
if master and table.contains({ "sorcerer familiar", "knight familiar", "druid familiar", "paladin familiar" }, thing:getName():lower()) then
local familiarSummonTime = master:kv():get("familiar-summon-time") or 0
description = string.format("%s (Master: %s). \z It will disappear in %s", description, master:getName(), getTimeInWords(familiarSummonTime - os.time()))
description = string.format("%s (Master: %s). \z It will disappear in %s", description, master:getName(), Game.getTimeInWords(familiarSummonTime - os.time()))
end
end
end
Expand Down
Loading