Update()
##Overview
The Update()
event is triggered dozens of times per second and allows your script to constantly update itself.
##Syntax
function Update( timeElapsed )
-- your code here
end
Where:
-
timeElapsed
is the amount of time since the event was last triggered
##Example
local count = 0
function Update()
count = count + 1
this.Tooltip = 'I have been updated '..count..' times.'
end
##Performance
Whatever your frame rate is (frames per second), that's how many times this event is being called. For every instance of your object on the map. So if you've got 100 objects, and 25 fps, that's a total of 2,500 calls to their Update()
functions per second. Because of this you should always 'despam' the function using Game.Time()
- like this:
-- despam Update
local Now = Game.Time
local Delay = 2 -- game seconds = prison minutes
local Ready = Now() + Delay
function Update( timeSinceLastUpdate ) -- called repeatedly, every frame
if Now() > Ready then
-- your code here
Ready = Now() + Delay
end
end
The Delay
(update interval) is defined in terms of game seconds (where each second is equivalent to a prison minute). Try and make Delay
as big as possible, as that will minimise CPU load and performance issues.
More advanced tricks include spreading update code over several frames (particularly important if your update code is quite bulky).
Here's a basic example:
-- despam variables here (removed for sake of brevity)
local FirstTask = true
function Update()
if Now() > Ready then
if FirstTask then
-- first task code here
else
-- second task code here
end
FirstTask = not FirstTask -- toggle between tasks
Ready = Now() + Delay
end
end
And a more advanced example:
-- despam variables here (removed for sake of brevity)
local Tasks = {} -- forward reference
local NextTask = 1
function Update()
if Now() > Ready then
Tasks[ NextTask ]()
if NextTask == #Tasks then
NextTask = 1 -- back to start
else
NextTask = NextTask + 1
end
Ready = Now() + Delay
end
end
Tasks[1] = function()
-- code for task 1 here
end
Tasks[2] = function()
-- code for task 2 here
end
-- etc...
Another nice trick is to have a variable despam Delay
based on what happened in the last update. For example, your default Delay
might be two seconds, but on some occasions you'll know for sure that a longer delay can be used. Building on the example above, we could implement that as follows:
-- despam variables here (removed for sake of brevity)
local Tasks = {} -- forward reference
local NextTask = 1
function Update()
if Now() > Ready then
Ready = Now() + ( Tasks[ NextTask ]() or Delay )
-- faster version of next task determination code:
NextTask = NextTask == #Tasks and 1 or ( NextTask + 1 )
end
end
Tasks[1] = function()
-- code for task 1 here
return 15 -- wait 15 seconds before next task
end
Tasks[2] = function()
-- code for task 2 here
-- no return value means 'use default delay'
end
##See Also
Create()
- [Save-Load Cycle Guide](Save-Load Cycle Guide)
- [Object Events](Object Events)
^ Open "Pages" to Search
- [Lua Basics](Lua Basics Guide)
- [Save-Load Cycle](Save-Load Cycle Guide)
[Globals](Object Globals):
- [
Game
](Game (Global)) - [
me
](me (Global)) - [
Object
](Object (Global)) - [
this
](this (Global))
[Events](Object Events):
- [Rotation table](Rotation table)
- [Id table](Id table)
- [Location table](Location table)
- [Velocity table](Velocity table)
[Methods](Object Methods):
.ApplyVelocity()
.ClearRouting()
.CreateJob()
.Delete()
.GetNearbyObjects()
.LeaveMap()
.NavigateTo()
.Sound()
[Properties](Object Properties):
.Active
.Age
.AiSetTarget
.AiWalkSpeed
.AnimateRotation
.AnimateVelocity
.AssignedRoom
.Attacker
.AttackTimer
.AvailableMoney
.AvatarControl
.BodyArmour
.BoilingPoint
.BookInCell
.Carried
.CarrierId
.Carrying
.CarryingBook
.Category
.Cell
.CellId
.CellIdTimer
.CloseTimer
-
.Connections
⚠️ .Contents
.CutsceneActor
.Damage
.Dest
.Door
.Driver
.Energy
.Equipment
.Entity
-
.ExternalPower
⚠️ .FailedToFindCell
.FeedJobId
.FireEngine
.Fireman
.FollowerId
.Fuel
.Gang
.Garbage
.HealingJobId
.Hidden
.Hose
.HoseOffset
.Hostage
.Id
.Intensity
.IsExternalTeacher
.IsNewIntake
.JobId
.LastAccess
.LastAte
.LastTreated
.LastVisitors
.LeavingMap
.Library
.Loaded
.Locked
.Misbehaviour
.Mode
.Naked
.Name
.Needs
.Office
-
.On
⚠️ .Open
.OpenDir
.Opened
.OpenOnTrigger
.OpenTimer
.Operation
.OperationTimer
.Or
.Patrol
.PermitPlayerControl
.PlayerOrderPos
.Pos
-
.Powered
⚠️ .Prisoner
.ProcessingRoom
.Quantity
.ReloadTimer
.RemotelyOpenable
.RequiredCellType
.RestState
.Result
.RotateDir
.SectorTimer
.Shackled
.Slot0..7
.SnitchTimer
.Speed
.State
.Station
.StatusEffects
.SubType
.TargetObject
.TazerTrained
.TimeOfLastMisconduct
.Timer
.Tooltip
.Triggered
.TriggeredBy
.TriggeredTime
.Type
.UnlockingDoor
.Vel
.WallCheckTimer
.Walls
.WatchingFight
.Weight
-
.Wired
⚠️ .WorldObject