Improve rover texture. Add rover jumping and dust track

This commit is contained in:
paramat 2017-03-14 00:38:50 +00:00
parent b880c1c53a
commit 9acd8fdb72
6 changed files with 115 additions and 49 deletions

View File

@ -1,4 +1,4 @@
moonrealm 0.10.2 by paramat moonrealm 0.10.3 by paramat
For Minetest 0.4.14 or later For Minetest 0.4.15 or later
Depends default Depends default
Licenses: Code LGPL 2.1. Media CC BY-SA 3.0 Licenses: Code LGPL 2.1. Media CC BY-SA 3.0

View File

@ -137,7 +137,8 @@ minetest.register_globalstep(function(dtime)
for _, player in ipairs(minetest.get_connected_players()) do for _, player in ipairs(minetest.get_connected_players()) do
-- Footprints -- Footprints
if FOOT and math.random() < 0.15 and if FOOT and not default.player_attached[player:get_player_name()] and
math.random() < 0.15 and
player_pos_previous[player:get_player_name()] ~= nil then player_pos_previous[player:get_player_name()] ~= nil then
local pos = player:getpos() local pos = player:getpos()
player_pos[player:get_player_name()] = { player_pos[player:get_player_name()] = {

View File

@ -66,7 +66,7 @@ minetest.register_node("moonrealm:dust", {
}) })
minetest.register_node("moonrealm:dustprint1", { minetest.register_node("moonrealm:dustprint1", {
description = "Moon Dust Footprint1", description = "Moon Dust Footprint 1",
tiles = {"moonrealm_dustprint1.png", "moonrealm_dust.png"}, tiles = {"moonrealm_dustprint1.png", "moonrealm_dust.png"},
is_ground_content = false, is_ground_content = false,
groups = {crumbly = 3}, groups = {crumbly = 3},
@ -77,7 +77,7 @@ minetest.register_node("moonrealm:dustprint1", {
}) })
minetest.register_node("moonrealm:dustprint2", { minetest.register_node("moonrealm:dustprint2", {
description = "Moon Dust Footprint2", description = "Moon Dust Footprint 2",
tiles = {"moonrealm_dustprint2.png", "moonrealm_dust.png"}, tiles = {"moonrealm_dustprint2.png", "moonrealm_dust.png"},
is_ground_content = false, is_ground_content = false,
groups = {crumbly = 3}, groups = {crumbly = 3},
@ -87,6 +87,17 @@ minetest.register_node("moonrealm:dustprint2", {
}), }),
}) })
minetest.register_node("moonrealm:dusttrack", {
description = "Moon Rover Track",
tiles = {"moonrealm_dusttrack.png", "moonrealm_dust.png"},
is_ground_content = false,
groups = {crumbly = 3},
drop = "moonrealm:dust",
sounds = default.node_sound_sand_defaults({
footstep = {name = "default_sand_footstep", gain = 0.05},
}),
})
minetest.register_node("moonrealm:vacuum", { minetest.register_node("moonrealm:vacuum", {
description = "Vacuum", description = "Vacuum",
drawtype = "airlike", drawtype = "airlike",

View File

@ -1,7 +1,8 @@
local ACDC = 0.2 -- Acceleration / decelleration -- Parameters
local MAXSP = 8 -- Maximum speed
local TURNSP = 0.03 -- Maximum yaw speed
local STEPH = 1.1 -- Stepheight, 0.6 = climb slabs, 1.1 = climb nodes local ACDC = 0.15 -- Acceleration / decelleration
local TURNSP = 0.02 -- Maximum yaw speed
-- Functions -- Functions
@ -32,7 +33,7 @@ end
local rover = { local rover = {
physical = true, physical = true,
collide_with_objects = true, collide_with_objects = true,
collisionbox = {-0.7, -1.0, -0.7, 0.7, 1.0, 0.7}, collisionbox = {-0.7, 0.4, -0.7, 0.7, 1.0, 0.7},
visual = "cube", visual = "cube",
visual_size = {x = 2.0, y = 2.0}, visual_size = {x = 2.0, y = 2.0},
textures = { textures = {
@ -44,7 +45,7 @@ local rover = {
"moonrealm_rover_front.png", "moonrealm_rover_front.png",
"moonrealm_rover_back.png", "moonrealm_rover_back.png",
}, },
stepheight = STEPH, stepheight = 0,
driver = nil, driver = nil,
v = 0, v = 0,
last_v = 0, last_v = 0,
@ -169,28 +170,42 @@ end
function rover:on_step(dtime) function rover:on_step(dtime)
self.v = get_v(self.object:getvelocity()) * get_sign(self.v) local ctrl
if self.driver then
ctrl = self.driver:get_player_control()
end
if (not ctrl or not (ctrl.up or ctrl.down)) and
vector.equals(self.object:getvelocity(), {x = 0, y = 0, z = 0}) then
-- Either no driver or driver but no accelerator, and stationary
return
end
-- Touching ground?
local obj_pos = self.object:getpos()
obj_pos.y = obj_pos.y - 1.1
local under_pos = obj_pos
local node_under = minetest.get_node(under_pos)
local nodedef_under = minetest.registered_nodes[node_under.name]
local touch_ground = nodedef_under.walkable
local absv = get_v(self.object:getvelocity())
self.v = absv * get_sign(self.v)
if touch_ground then
-- Acceleration and steering
if self.driver then if self.driver then
local ctrl = self.driver:get_player_control()
if ctrl.up then if ctrl.up then
self.v = self.v + ACDC self.v = self.v + ACDC
elseif ctrl.down then elseif ctrl.down then
self.v = self.v - ACDC self.v = self.v - ACDC
end end
end
if self.v == 0 and self.object:getvelocity().y == 0 then
return
end
local absv = math.abs(self.v)
if self.driver then
local ctrl = self.driver:get_player_control()
local turn local turn
local maxturn = (1 + dtime * 2) * TURNSP local maxturn = (1 + dtime * 2) * TURNSP
if absv < 4 then if absv < 4 then
turn = maxturn * absv / 4 turn = maxturn * absv / 4
else else
turn = maxturn * (1 - (absv - 4) / 16) turn = maxturn * (1 - (absv - 4) / 8)
end end
if ctrl.left then if ctrl.left then
self.object:setyaw(self.object:getyaw() + turn) self.object:setyaw(self.object:getyaw() + turn)
@ -199,20 +214,59 @@ function rover:on_step(dtime)
end end
end end
-- Slowing from resistence
local s = get_sign(self.v) local s = get_sign(self.v)
self.v = self.v - 0.03 * s self.v = self.v - 0.04 * s
if s ~= get_sign(self.v) then if s ~= get_sign(self.v) then
self.object:setvelocity({x = 0, y = 0, z = 0}) self.object:setvelocity({x = 0, y = 0, z = 0})
self.v = 0 self.v = 0
return return
end end
if absv > MAXSP then -- Limit to max speed
self.v = MAXSP * get_sign(self.v) if absv > 8 then
self.v = 8 * get_sign(self.v)
end
end end
-- Vertical behaviour
local obj_pos = self.object:getpos()
obj_pos.y = obj_pos.y - 0.5
local nodedef_in = minetest.registered_nodes[minetest.get_node(obj_pos).name]
if nodedef_in.walkable then
-- In node, jump up
self.object:setacceleration({x = 0, y = 0, z = 0})
self.object:setvelocity(get_velocity(self.v,
self.object:getyaw(), math.max(absv / 2, 1)))
self.object:setpos(self.object:getpos())
else
if not touch_ground then
-- No node under, freefall
self.object:setacceleration({x = 0, y = -1.962, z = 0}) self.object:setacceleration({x = 0, y = -1.962, z = 0})
self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), self.object:setvelocity(get_velocity(self.v, self.object:getyaw(),
self.object:getvelocity().y)) self.object:getvelocity().y))
self.object:setpos(self.object:getpos()) self.object:setpos(self.object:getpos())
else
-- Node under, on surface, check y velocity
if self.object:getvelocity().y < 0 then
-- Landing on surface
local pos = self.object:getpos()
pos.y = math.floor(pos.y) + 0.5
self.object:setacceleration({x = 0, y = 0, z = 0})
self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), 0))
self.object:setpos(pos)
else
-- On surface or jumping up through surface
self.object:setacceleration({x = 0, y = 0, z = 0})
self.object:setvelocity(get_velocity(self.v, self.object:getyaw(),
self.object:getvelocity().y))
self.object:setpos(self.object:getpos())
end
if node_under.name == "moonrealm:dust" or
node_under.name == "moonrealm:dustprint1" or
node_under.name == "moonrealm:dustprint2" then
minetest.set_node(under_pos, {name = "moonrealm:dusttrack"})
end
end
end
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 B

After

Width:  |  Height:  |  Size: 209 B