commit cb0719b7dd63324a45432f83c4ac5f63db319a29 Author: Jeija Date: Sun Mar 24 14:40:18 2013 +0100 Initial upload diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/weather/command.lua b/weather/command.lua new file mode 100644 index 0000000..b9c4a09 --- /dev/null +++ b/weather/command.lua @@ -0,0 +1,15 @@ +minetest.register_privilege("weather", { + description = "Change the weather", + give_to_singleplayer = false +}) + +-- Set weather +minetest.register_chatcommand("setweather", { + params = "", + description = "Set weather to rain, snow or none", -- full description + privs = {weather = true}, + func = function(name, param) + weather = param + save_weather() + end +}) diff --git a/weather/init.lua b/weather/init.lua new file mode 100644 index 0000000..37777d7 --- /dev/null +++ b/weather/init.lua @@ -0,0 +1,50 @@ +-- Weather: +-- * rain +-- * snow +-- * wind (not implemented) + +assert(minetest.add_particlespawner, "I told you to run the latest GitHub!") + +addvectors = function (v1, v2) + return {x=v1.x+v2.x, y=v1.y+v2.y, z=v1.z+v2.z} +end + +save_weather = function () + local file = io.open(minetest.get_worldpath().."/weather", "w+") + file:write(weather) + file:close() +end + +read_weather = function () + local file = io.open(minetest.get_worldpath().."/weather", "r") + if not file then return end + local readweather = file:read() + file:close() + return readweather +end + +weather = read_weather() + +minetest.register_globalstep(function(dtime) + if weather == "rain" or weather == "snow" then + if math.random(1, 10000) == 1 then + weather = "none" + save_weather() + end + else + if math.random(1, 50000) == 1 then + weather = "rain" + save_weather() + end + if math.random(1, 50000) == 2 then + weather = "snow" + save_weather() + end + end +end) + +dofile(minetest.get_modpath("weather").."/rain.lua") +dofile(minetest.get_modpath("weather").."/snow.lua") +dofile(minetest.get_modpath("weather").."/command.lua") + + diff --git a/weather/rain.lua b/weather/rain.lua new file mode 100644 index 0000000..6e09e6c --- /dev/null +++ b/weather/rain.lua @@ -0,0 +1,24 @@ +-- Rain +minetest.register_globalstep(function(dtime) + if weather ~= "rain" then return end + for _, player in ipairs(minetest.get_connected_players()) do + local ppos = player:getpos() + + -- Make sure player is not in a cave/house... + if minetest.env:get_node_light(ppos, 0.5) ~= 15 then return end + + local minp = addvectors(ppos, {x=-9, y=7, z=-9}) + local maxp = addvectors(ppos, {x= 9, y=7, z= 9}) + + local vel = {x=0, y= -4, z=0} + local acc = {x=0, y=-9.81, z=0} + + minetest.add_particlespawner(25, 0.5, + minp, maxp, + vel, vel, + acc, acc, + 0.8, 0.8, + 25, 25, + false, "weather_rain.png", player:get_player_name()) + end +end) diff --git a/weather/snow.lua b/weather/snow.lua new file mode 100644 index 0000000..73fd62d --- /dev/null +++ b/weather/snow.lua @@ -0,0 +1,72 @@ +-- Snow +minetest.register_globalstep(function(dtime) + if weather ~= "snow" then return end + for _, player in ipairs(minetest.get_connected_players()) do + local ppos = player:getpos() + + -- Make sure player is not in a cave/house... + if minetest.env:get_node_light(ppos, 0.5) ~= 15 then return end + + local minp = addvectors(ppos, {x=-9, y=7, z=-9}) + local maxp = addvectors(ppos, {x= 9, y=7, z= 9}) + + local minp_deep = addvectors(ppos, {x=-10, y=3.2, z=-10}) + local maxp_deep = addvectors(ppos, {x= 10, y=2.6, z= 10}) + + local vel = {x=0, y= -0.5, z=0} + local acc = {x=0, y= -0.5, z=0} + + minetest.add_particlespawner(5, 0.5, + minp, maxp, + vel, vel, + acc, acc, + 5, 5, + 25, 25, + false, "weather_snow.png", player:get_player_name()) + + minetest.add_particlespawner(4, 0.5, + minp_deep, maxp_deep, + vel, vel, + acc, acc, + 4, 4, + 25, 25, + false, "weather_snow.png", player:get_player_name()) + end +end) + +local snow_box = +{ + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} +} + +-- Snow cover +minetest.register_node("weather:snow_cover", { + tiles = {"weather_snow_cover.png"}, + drawtype = "nodebox", + paramtype = "light", + node_box = snow_box, + selection_box = snow_box, + groups = {not_in_creative_inventory = 1, crumbly = 3, attached_node = 1}, + drop = {} +}) + +--[[ Enable this section if you have a very fast PC +minetest.register_abm({ + nodenames = {"group:crumbly", "group:snappy", "group:cracky", "group:choppy"}, + neighbors = {"default:air"}, + interval = 10.0, + chance = 80, + action = function (pos, node, active_object_count, active_object_count_wider) + if weather == "snow" then + if minetest.registered_nodes[node.name].drawtype == "normal" + or minetest.registered_nodes[node.name].drawtype == "allfaces_optional" then + local np = addvectors(pos, {x=0, y=1, z=0}) + if minetest.env:get_node_light(np, 0.5) == 15 then + minetest.env:add_node(np, {name="weather:snow_cover"}) + end + end + end + end +}) +]] diff --git a/weather/textures/weather_rain.png b/weather/textures/weather_rain.png new file mode 100644 index 0000000..39b153c Binary files /dev/null and b/weather/textures/weather_rain.png differ diff --git a/weather/textures/weather_snow.png b/weather/textures/weather_snow.png new file mode 100644 index 0000000..8c44f7a Binary files /dev/null and b/weather/textures/weather_snow.png differ diff --git a/weather/textures/weather_snow_cover.png b/weather/textures/weather_snow_cover.png new file mode 100644 index 0000000..9221a5a Binary files /dev/null and b/weather/textures/weather_snow_cover.png differ