summaryrefslogtreecommitdiff
path: root/mods/vzxv_gravity/init.lua
blob: 54a68e89556334592c358313ca788ccf2497f7d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
local gravity_objects = {}

local e = 2.718

function vzxv.gravity(ylevel)
	return 2 / (1+(e ^ (ylevel/6000)))
end

local gravmul = -9.81

local gravfunc = function(e)
	local pos = e.object:get_pos()
	local grav = vzxv.gravity(pos.y) * gravmul
	e.object:set_acceleration({x=0,y=grav,z=0})
end

function vzxv.register_gravity(entity)
	local entdef = minetest.registered_entities[entity]
	local old_onstep = entdef.on_step or function() end
	entdef.on_step = function(self,dtime,moveresult)
		gravfunc(self)
		return old_onstep(self,dtime,moveresult)
	end
end

local function color(r,g,b)
	return ("#%02X%02X%02X"):format(r,g,b)
end

minetest.register_globalstep(function()
	local players = minetest.get_connected_players()
	local brightness = math.max(0,math.min(1,3-((
		math.abs(-12000+minetest:get_timeofday()*24000)
	)/3000)))
	for _,player in ipairs(players) do
		local pos = player:get_pos()
		player:set_physics_override({
			gravity = vzxv.gravity(pos.y)
		})
		local skycol = {0x40,0x80,0xFF}

		skycol[1] = skycol[1] * brightness
		skycol[2] = skycol[2] * brightness
		skycol[3] = skycol[3] * brightness
		
		local heightfac = math.max(1-(math.max(pos.y,0)/10000),0)

		skycol[1] = skycol[1] * heightfac
		skycol[2] = skycol[2] * heightfac
		skycol[3] = skycol[3] * heightfac

		local sky = color(skycol[1],skycol[2],skycol[3])

		local skyparams = {
			type="plain",
			base_color=sky,
		}
		if pos.y>=3000 then
			player:set_sun({
				sunrise_visible = false
			})
			player:set_stars({
				stars_visible = true
			})
		else
			player:set_sun() -- default value?
			player:set_stars()
		end
		player:set_sky(skyparams)
	end
end)