From 2e8e9ee7f5c0fa638e5a427f34b6823892c84f7c Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Tue, 24 Jan 2012 12:01:59 +0200 Subject: [PATCH] Add EnvRef:set_timeofday(0...1) and EnvRef:get_timeofday() --- data/mods/default/init.lua | 6 ++++-- data/mods/experimental/init.lua | 22 +++++++++++++++++++++ src/scriptapi.cpp | 34 +++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index 7c6cccd44..f0e6b6dc2 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -114,10 +114,10 @@ -- minetest.chat_send_player(name, text) -- minetest.get_player_privs(name) -> set of privs -- minetest.get_inventory(location) -> InvRef --- minetest.get_current_modname() -> string --- minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname" -- ^ location = eg. {type="player", name="celeron55"} -- {type="node", pos={x=, y=, z=}} +-- minetest.get_current_modname() -> string +-- minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname" -- -- minetest.debug(line) -- ^ Goes to dstream @@ -169,6 +169,8 @@ -- - get_meta(pos) -- Get a NodeMetaRef at that position -- - get_player_by_name(name) -- Get an ObjectRef to a player -- - get_objects_inside_radius(pos, radius) +-- - set_timeofday(val): val: 0...1; 0 = midnight, 0.5 = midday +-- - get_timeofday() -- -- NodeMetaRef (this stuff is subject to change in a future version) -- - get_type() diff --git a/data/mods/experimental/init.lua b/data/mods/experimental/init.lua index 368295ea7..9a8f8868d 100644 --- a/data/mods/experimental/init.lua +++ b/data/mods/experimental/init.lua @@ -4,6 +4,8 @@ -- For testing random stuff +experimental = {} + function on_step(dtime) -- print("experimental on_step") --[[ @@ -20,6 +22,26 @@ function on_step(dtime) end end --]] + --[[ + if experimental.t1 == nil then + experimental.t1 = 0 + end + experimental.t1 = experimental.t1 + dtime + if experimental.t1 >= 2 then + experimental.t1 = experimental.t1 - 2 + minetest.log("time of day is "..minetest.env:get_timeofday()) + if experimental.day then + minetest.log("forcing day->night") + experimental.day = false + minetest.env:set_timeofday(0.0) + else + minetest.log("forcing night->day") + experimental.day = true + minetest.env:set_timeofday(0.5) + end + minetest.log("time of day is "..minetest.env:get_timeofday()) + end + --]] end minetest.register_globalstep(on_step) diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 5d68793e2..a064cd688 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -2913,6 +2913,38 @@ private: return 1; } + // EnvRef:set_timeofday(val) + // val = 0...1 + static int l_set_timeofday(lua_State *L) + { + EnvRef *o = checkobject(L, 1); + ServerEnvironment *env = o->m_env; + if(env == NULL) return 0; + // Do it + float timeofday_f = luaL_checknumber(L, 2); + assert(timeofday_f >= 0.0 && timeofday_f <= 1.0); + int timeofday_mh = (int)(timeofday_f * 24000.0); + // This should be set directly in the environment but currently + // such changes aren't immediately sent to the clients, so call + // the server instead. + //env->setTimeOfDay(timeofday_mh); + get_server(L)->setTimeOfDay(timeofday_mh); + return 0; + } + + // EnvRef:get_timeofday() -> 0...1 + static int l_get_timeofday(lua_State *L) + { + EnvRef *o = checkobject(L, 1); + ServerEnvironment *env = o->m_env; + if(env == NULL) return 0; + // Do it + int timeofday_mh = env->getTimeOfDay(); + float timeofday_f = (float)timeofday_mh / 24000.0; + lua_pushnumber(L, timeofday_f); + return 1; + } + static int gc_object(lua_State *L) { EnvRef *o = *(EnvRef **)(lua_touserdata(L, 1)); delete o; @@ -2990,6 +3022,8 @@ const luaL_reg EnvRef::methods[] = { method(EnvRef, get_meta), method(EnvRef, get_player_by_name), method(EnvRef, get_objects_inside_radius), + method(EnvRef, set_timeofday), + method(EnvRef, get_timeofday), {0,0} };