Skip to content

Commit

Permalink
[CSM] sound_play & sound_stop support + client_lua_api doc (#5096)
Browse files Browse the repository at this point in the history
* squashed: CSM: Implement register_globalstep
  * Re-use fatal error mechanism from server to disconnect client on CSM error
  * Little client functions cleanups

* squashed: CSM: add core.after function
  * core.after is shared code between client & server
  * ModApiUtil get_us_time feature enabled for client
  • Loading branch information
nerzhul committed Mar 13, 2017
1 parent d7bc346 commit 2c19d51
Show file tree
Hide file tree
Showing 23 changed files with 996 additions and 91 deletions.
3 changes: 2 additions & 1 deletion builtin/client/init.lua
Expand Up @@ -4,9 +4,10 @@ local clientpath = scriptpath.."client"..DIR_DELIM
local commonpath = scriptpath.."common"..DIR_DELIM

dofile(clientpath .. "register.lua")
dofile(commonpath .. "after.lua")
dofile(commonpath .. "chatcommands.lua")
dofile(clientpath .. "preview.lua")

core.register_on_death(function()
core.display_chat_message("You died.")
end)

15 changes: 13 additions & 2 deletions builtin/client/preview.lua
@@ -1,6 +1,6 @@
-- This is an example function to ensure it's working properly, should be removed before merge
core.register_on_shutdown(function()
print("shutdown client")
print("[PREVIEW] shutdown client")
end)

-- This is an example function to ensure it's working properly, should be removed before merge
Expand All @@ -15,17 +15,28 @@ core.register_on_sending_chat_messages(function(message)
return false
end)

-- This is an example function to ensure it's working properly, should be removed before merge
core.register_on_hp_modification(function(hp)
print("[PREVIEW] HP modified " .. hp)
end)

-- This is an example function to ensure it's working properly, should be removed before merge
core.register_on_damage_taken(function(hp)
print("[PREVIEW] Damage taken " .. hp)
end)

-- This is an example function to ensure it's working properly, should be removed before merge
core.register_globalstep(function(dtime)
-- print("[PREVIEW] globalstep " .. dtime)
end)

-- This is an example function to ensure it's working properly, should be removed before merge
core.register_chatcommand("dump", {
func = function(name, param)
return true, dump(_G)
end,
})
})

core.after(2, function()
print("After 2")
end)
1 change: 1 addition & 0 deletions builtin/client/register.lua
Expand Up @@ -55,6 +55,7 @@ local function make_registration()
return t, registerfunc
end

core.registered_globalsteps, core.register_globalstep = make_registration()
core.registered_on_shutdown, core.register_on_shutdown = make_registration()
core.registered_on_receiving_chat_messages, core.register_on_receiving_chat_messages = make_registration()
core.registered_on_sending_chat_messages, core.register_on_sending_chat_messages = make_registration()
Expand Down
43 changes: 43 additions & 0 deletions builtin/common/after.lua
@@ -0,0 +1,43 @@
local jobs = {}
local time = 0.0
local last = core.get_us_time() / 1000000

core.register_globalstep(function(dtime)
local new = core.get_us_time() / 1000000
if new > last then
time = time + (new - last)
else
-- Overflow, we may lose a little bit of time here but
-- only 1 tick max, potentially running timers slightly
-- too early.
time = time + new
end
last = new

if #jobs < 1 then
return
end

-- Iterate backwards so that we miss any new timers added by
-- a timer callback, and so that we don't skip the next timer
-- in the list if we remove one.
for i = #jobs, 1, -1 do
local job = jobs[i]
if time >= job.expire then
core.set_last_run_mod(job.mod_origin)
job.func(unpack(job.arg))
table.remove(jobs, i)
end
end
end)

function core.after(after, func, ...)
assert(tonumber(after) and type(func) == "function",
"Invalid core.after invocation")
jobs[#jobs + 1] = {
func = func,
expire = time + after,
arg = {...},
mod_origin = core.get_last_run_mod()
}
end
1 change: 1 addition & 0 deletions builtin/game/init.lua
Expand Up @@ -17,6 +17,7 @@ if core.setting_getbool("profiler.load") then
profiler = dofile(scriptpath.."profiler"..DIR_DELIM.."init.lua")
end

dofile(commonpath .. "after.lua")
dofile(gamepath.."item_entity.lua")
dofile(gamepath.."deprecated.lua")
dofile(gamepath.."misc.lua")
Expand Down
44 changes: 0 additions & 44 deletions builtin/game/misc.lua
Expand Up @@ -4,50 +4,6 @@
-- Misc. API functions
--

local jobs = {}
local time = 0.0
local last = core.get_us_time() / 1000000

core.register_globalstep(function(dtime)
local new = core.get_us_time() / 1000000
if new > last then
time = time + (new - last)
else
-- Overflow, we may lose a little bit of time here but
-- only 1 tick max, potentially running timers slightly
-- too early.
time = time + new
end
last = new

if #jobs < 1 then
return
end

-- Iterate backwards so that we miss any new timers added by
-- a timer callback, and so that we don't skip the next timer
-- in the list if we remove one.
for i = #jobs, 1, -1 do
local job = jobs[i]
if time >= job.expire then
core.set_last_run_mod(job.mod_origin)
job.func(unpack(job.arg))
table.remove(jobs, i)
end
end
end)

function core.after(after, func, ...)
assert(tonumber(after) and type(func) == "function",
"Invalid core.after invocation")
jobs[#jobs + 1] = {
func = func,
expire = time + after,
arg = {...},
mod_origin = core.get_last_run_mod()
}
end

function core.check_player_privs(name, ...)
local arg_type = type(name)
if (arg_type == "userdata" or arg_type == "table") and
Expand Down

0 comments on commit 2c19d51

Please sign in to comment.