Compare commits
5 Commits
da8cbc74b0
...
8c3a831082
Author | SHA1 | Date |
---|---|---|
Mrchiantos | 8c3a831082 | |
Mrchiantos | 05f4c19148 | |
Mrchiantos | bff84b7b36 | |
Mrchiantos | d97fb5210e | |
Mrchiantos | 33c7c028ff |
|
@ -0,0 +1,34 @@
|
|||
driftcar 0.1.12 by paramat
|
||||
For Minetest 0.4.16 and later. Compatible with Minetest 5.0.0-dev.
|
||||
Depends: default
|
||||
|
||||
Licenses
|
||||
--------
|
||||
Source code: MIT
|
||||
Media (textures and car nodebox): CC BY-SA 3.0
|
||||
|
||||
Description
|
||||
-----------
|
||||
A vehicle using some physics modelling for more realistic behaviour.
|
||||
|
||||
Usage
|
||||
-----
|
||||
Due to client->server->client control delay this mod is best used in
|
||||
singleplayer or in local multiplayer.
|
||||
Intensive mods that cause long server lags, such as Lua mapgen mods, will affect
|
||||
the responsiveness of the vehicle, even in singleplayer.
|
||||
|
||||
There is no crafting recipe, the vehicle can be found in the creative inventory.
|
||||
Third-person camera mode is recommended when driving for a better view.
|
||||
If parameter 'AVIEW' in the 'init.lua' file is set to 'true', view is
|
||||
automatically set to vehicle velocity direction.
|
||||
|
||||
Controls
|
||||
--------
|
||||
Right mouse button = Enter or exit car when pointing at car.
|
||||
Forward = Speed up.
|
||||
Slow down when moving backwards.
|
||||
Backward = Slow down.
|
||||
Speed up when moving backwards.
|
||||
Left = Rotate anticlockwise.
|
||||
Right = Rotate clockwise.
|
|
@ -0,0 +1 @@
|
|||
default
|
|
@ -0,0 +1,463 @@
|
|||
-- Parameters
|
||||
|
||||
local AVIEW = false -- Autorotate view to velocity direction
|
||||
local GRIP = 6 -- Maximum linear and lateral acceleration, in nodes/s^2
|
||||
local SZTORQ = 16 -- Car speed where motor torque drops to zero, in nodes/s
|
||||
local DRAG = 0.03 -- Air drag
|
||||
local ROLRES = 0.3 -- Rolling resistence
|
||||
local GRAV = 9.81 -- Acceleration of gravity, in nodes/s^2
|
||||
-- Turn parameters, in radians/s or radians/s^2
|
||||
local TINIT = 0.36 -- Initial turn speed on first control input
|
||||
local TACC = 0.12 -- Turn acceleration on control input
|
||||
local TMAX = 2.4 -- Maximum turn speed
|
||||
local TDEC = 0.24 -- Turn deceleration on no control input
|
||||
|
||||
-- End of parameters
|
||||
|
||||
local source_list = {
|
||||
{"black", "Darkened", "292421", 40, 36, 33},
|
||||
{"blue", "Blue", "0000FF", 0, 0, 255},
|
||||
{"green", "Green", "00FF00", 0, 255, 0},
|
||||
{"white", "White", "F5F5F5", 245, 245, 245},
|
||||
{"orange", "Orange", "FF6103", 255, 97, 3},
|
||||
{"red", "Red", "FF0000", 255, 0, 0},
|
||||
{"yellow", "Yellow", "FFFF00", 255, 255, 0},
|
||||
{"pink", "pink", "FF69B4", 255, 105, 180}
|
||||
}
|
||||
|
||||
for i in ipairs(source_list) do
|
||||
local name = source_list[i][1]
|
||||
local description = source_list[i][2]
|
||||
local colour = source_list[i][3]
|
||||
local red = source_list[i][4]
|
||||
local green = source_list[i][5]
|
||||
local blue = source_list[i][6]
|
||||
|
||||
-- Constants
|
||||
|
||||
local sztorqmf = SZTORQ - 4
|
||||
|
||||
|
||||
-- Functions
|
||||
|
||||
local function get_sign(n)
|
||||
if n == 0 then
|
||||
return 0
|
||||
else
|
||||
return n / math.abs(n)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function get_vecmag(vec)
|
||||
return math.sqrt(vec.x ^ 2 + vec.z ^ 2)
|
||||
end
|
||||
|
||||
local function get_theta(vec) -- returns 0 to PI * 2
|
||||
if vec.z == 0 then
|
||||
return 0
|
||||
end
|
||||
if vec.z < 0 then
|
||||
return math.atan(-vec.x / vec.z) + math.pi
|
||||
end
|
||||
if vec.x > 0 then
|
||||
return math.atan(-vec.x / vec.z) + math.pi * 2
|
||||
end
|
||||
return math.atan(-vec.x / vec.z)
|
||||
end
|
||||
|
||||
local function get_veccomp(vecmag, theta, y)
|
||||
local x = -math.sin(theta) * vecmag
|
||||
local z = math.cos(theta) * vecmag
|
||||
return {x = x, y = y, z = z}
|
||||
end
|
||||
|
||||
|
||||
local function wrap_yaw(yaw) -- wrap to 0 to PI * 2
|
||||
local fmod = math.fmod(yaw, math.pi * 2)
|
||||
if fmod < 0 then
|
||||
return fmod + math.pi * 2
|
||||
end
|
||||
return fmod
|
||||
end
|
||||
|
||||
local function angbet(theta1, theta2) -- theta1 relative to theta2, -PI to PI
|
||||
local ang = theta1 - theta2
|
||||
if ang < -math.pi then
|
||||
return ang + math.pi * 2
|
||||
end
|
||||
if ang > math.pi then
|
||||
return ang - math.pi * 2
|
||||
end
|
||||
return ang
|
||||
end
|
||||
|
||||
local function add_smoke_particle(pos, player_name)
|
||||
minetest.add_particle({
|
||||
pos = pos,
|
||||
velocity = {x = 0, y = 0, z = 0},
|
||||
acceleration = {x = 0, y = 0, z = 0},
|
||||
expirationtime = 0.25,
|
||||
size = 2.8,
|
||||
collisiondetection = false,
|
||||
collision_removal = false,
|
||||
vertical = false,
|
||||
texture = "driftbus_smoke.png",
|
||||
playername = player_name,
|
||||
})
|
||||
end
|
||||
|
||||
-- Entity
|
||||
|
||||
local car = {
|
||||
initial_properties = {
|
||||
physical = true,
|
||||
collide_with_objects = false, -- Fixes a MT 0.4.16 engine bug
|
||||
collisionbox = {-1.2, -0.5, -4.5, 1.2, 2.0, 4.5},
|
||||
selection_box = {-1.2, -0.5, -4.5, 1.2, 2.0, 4.5},
|
||||
visual = "wielditem",
|
||||
visual_size = {x = 0.09, y = 0.09}, -- Scale up of nodebox is these * 1.5
|
||||
textures = {"driftbus:driftbus_nodebox" .. name},
|
||||
stepheight = 0.6,
|
||||
},
|
||||
|
||||
-- Custom fields
|
||||
driver = nil,
|
||||
removed = false,
|
||||
rot = 0,
|
||||
}
|
||||
|
||||
function car.on_rightclick(self, clicker)
|
||||
if not clicker or not clicker:is_player() then
|
||||
return
|
||||
end
|
||||
local name = clicker:get_player_name()
|
||||
if self.driver and name == self.driver then
|
||||
-- Detach
|
||||
self.driver = nil
|
||||
clicker:set_detach()
|
||||
default.player_attached[name] = false
|
||||
default.player_set_animation(clicker, "stand" , 30)
|
||||
local pos = clicker:getpos()
|
||||
minetest.after(0.1, function()
|
||||
clicker:setpos(pos)
|
||||
end)
|
||||
elseif not self.driver then
|
||||
-- Attach
|
||||
local attach = clicker:get_attach()
|
||||
if attach and attach:get_luaentity() then
|
||||
local luaentity = attach:get_luaentity()
|
||||
if luaentity.driver then
|
||||
luaentity.driver = nil
|
||||
end
|
||||
clicker:set_detach()
|
||||
end
|
||||
self.driver = name
|
||||
clicker:set_attach(self.object, "",
|
||||
{x = 0, y = -1, z = 0}, {x = 0, y = -1, z = 0})
|
||||
default.player_attached[name] = true
|
||||
minetest.after(0.2, function()
|
||||
default.player_set_animation(clicker, "sit" , 30)
|
||||
end)
|
||||
clicker:set_look_horizontal(self.object:getyaw())
|
||||
end
|
||||
end
|
||||
|
||||
function car.on_activate(self, staticdata, dtime_s)
|
||||
self.object:set_armor_groups({immortal = 1})
|
||||
end
|
||||
|
||||
function car.on_punch(self, puncher)
|
||||
if not puncher or not puncher:is_player() or self.removed then
|
||||
return
|
||||
end
|
||||
|
||||
local name = puncher:get_player_name()
|
||||
if self.driver and name == self.driver then
|
||||
-- Detach
|
||||
self.driver = nil
|
||||
puncher:set_detach()
|
||||
default.player_attached[name] = false
|
||||
end
|
||||
if not self.driver then
|
||||
-- Move to inventory
|
||||
self.removed = true
|
||||
local inv = puncher:get_inventory()
|
||||
if not (creative and creative.is_enabled_for
|
||||
and creative.is_enabled_for(name))
|
||||
or not inv:contains_item("main", "driftbus:driftbus" .. name) then
|
||||
|
||||
end
|
||||
minetest.after(0.1, function()
|
||||
self.object:remove()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function car.on_step(self, dtime)
|
||||
local vel = self.object:getvelocity()
|
||||
local velmag = get_vecmag(vel)
|
||||
-- Early return for near-stationary vehicle with no driver
|
||||
if not self.driver and velmag < 0.01 and vel.y == 0 then
|
||||
self.object:setpos(self.object:getpos())
|
||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
||||
self.object:setacceleration({x = 0, y = 0, z = 0})
|
||||
return
|
||||
end
|
||||
|
||||
-- Angle of yaw relative to velocity, -PI to PI
|
||||
local yawrtvel = angbet(
|
||||
wrap_yaw(self.object:getyaw()),
|
||||
get_theta(vel)
|
||||
)
|
||||
-- Velocity component linear to car
|
||||
local linvel = math.cos(yawrtvel) * velmag
|
||||
-- Touch ground bool
|
||||
local under_pos = self.object:getpos()
|
||||
under_pos.y = under_pos.y - 1.4
|
||||
local node_under = minetest.get_node(under_pos)
|
||||
local nodedef_under = minetest.registered_nodes[node_under.name]
|
||||
local touch = nodedef_under.walkable
|
||||
|
||||
-- Torque acceleration applied linear to car
|
||||
local taccmag = 0
|
||||
|
||||
-- Controls
|
||||
if self.driver and touch then
|
||||
local driver_objref = minetest.get_player_by_name(self.driver)
|
||||
if driver_objref then
|
||||
local ctrl = driver_objref:get_player_control()
|
||||
if ctrl.up or ctrl.down then
|
||||
-- Torque multiplier applied above 4nps to replicate reduction of
|
||||
-- motor torque with rotation speed.
|
||||
local torm = 1
|
||||
local abslinvel = math.abs(linvel)
|
||||
if abslinvel > 4 then
|
||||
torm = (SZTORQ - abslinvel) / sztorqmf
|
||||
end
|
||||
|
||||
if ctrl.up then
|
||||
taccmag = GRIP * torm
|
||||
elseif ctrl.down then
|
||||
taccmag = -GRIP * torm
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Player left server while driving
|
||||
-- In MT 5.0.0 use 'airboat:on_detach_child()' to do this
|
||||
self.driver = nil
|
||||
minetest.log("warning", "[driftbus] Driver left server while" ..
|
||||
" driving. This may cause some 'Pushing ObjectRef to" ..
|
||||
" removed/deactivated object' warnings.")
|
||||
end
|
||||
end
|
||||
|
||||
-- Early return for near-stationary vehicle with driver
|
||||
if taccmag == 0 and velmag < 0.01 and vel.y == 0 then
|
||||
self.object:setpos(self.object:getpos())
|
||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
||||
self.object:setacceleration({x = 0, y = 0, z = 0})
|
||||
return
|
||||
end
|
||||
|
||||
-- Allows fast reduction of turn when no turn control
|
||||
local noturnctrl = true
|
||||
|
||||
if self.driver and touch then
|
||||
local driver_objref = minetest.get_player_by_name(self.driver)
|
||||
if driver_objref then
|
||||
local ctrl = driver_objref:get_player_control()
|
||||
if ctrl.left then
|
||||
if self.rot == 0 then
|
||||
self.rot = TINIT
|
||||
else
|
||||
self.rot = self.rot + TACC
|
||||
end
|
||||
noturnctrl = false
|
||||
elseif ctrl.right then
|
||||
if self.rot == 0 then
|
||||
self.rot = -TINIT
|
||||
else
|
||||
self.rot = self.rot - TACC
|
||||
end
|
||||
noturnctrl = false
|
||||
end
|
||||
|
||||
if AVIEW then
|
||||
driver_objref:set_look_horizontal(get_theta(vel))
|
||||
end
|
||||
else
|
||||
-- Player left server while driving
|
||||
-- In MT 5.0.0 use 'airboat:on_detach_child()' to do this
|
||||
self.driver = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- If no turn control adjust turn towards zero
|
||||
local sr = get_sign(self.rot)
|
||||
if noturnctrl and touch then
|
||||
self.rot = self.rot - TDEC * sr
|
||||
if sr ~= get_sign(self.rot) then
|
||||
self.rot = 0
|
||||
end
|
||||
end
|
||||
-- Limit turn
|
||||
if math.abs(self.rot) > TMAX then
|
||||
self.rot = TMAX * get_sign(self.rot)
|
||||
end
|
||||
|
||||
-- Acceleration caused by 4 Forces
|
||||
|
||||
-- 1. Drag is proportional to velocity, assuming laminar flow
|
||||
local dragacc = vector.multiply(vel, -DRAG)
|
||||
|
||||
-- 2. Rolling resistence is constant
|
||||
local rraccmag = 0
|
||||
if touch then
|
||||
if linvel > 0 then
|
||||
rraccmag = -ROLRES
|
||||
elseif linvel < 0 then
|
||||
rraccmag = ROLRES
|
||||
end
|
||||
end
|
||||
--local rracc = get_veccomp(rraccmag, self.object:getyaw(), 0)
|
||||
|
||||
-- 3. Wheel torque acceleration
|
||||
--local tacc = get_veccomp(taccmag, self.object:getyaw(), 0)
|
||||
|
||||
-- Combine taccmag and rraccmag since same direction
|
||||
local trracc = get_veccomp(taccmag + rraccmag, self.object:getyaw(), 0)
|
||||
|
||||
-- 4. Tire lateral friction
|
||||
-- Velocity component lateral to car
|
||||
local tlfacc = {x = 0, y = 0, z = 0}
|
||||
if touch then
|
||||
local latvel = math.sin(yawrtvel) * velmag
|
||||
local tlfaccmag = math.min(math.max(latvel * 32, -GRIP), GRIP)
|
||||
tlfacc = get_veccomp(tlfaccmag, self.object:getyaw() + math.pi / 2, 0)
|
||||
|
||||
-- Tire smoke
|
||||
if self.driver and math.random() < -0.05 + math.abs(latvel) / 30 then
|
||||
local opos = self.object:getpos()
|
||||
opos.y = opos.y - 0.5
|
||||
local yaw = self.object:getyaw()
|
||||
local yaw1 = yaw + math.pi * 0.25
|
||||
local yaw2 = yaw + math.pi * 0.75
|
||||
|
||||
local srcomp1x = -math.sin(yaw1)
|
||||
local srcomp1z = math.cos(yaw1)
|
||||
local srcomp2x = -math.sin(yaw2)
|
||||
local srcomp2z = math.cos(yaw2)
|
||||
|
||||
add_smoke_particle({
|
||||
x = opos.x + srcomp1x,
|
||||
y = opos.y,
|
||||
z = opos.z + srcomp1z
|
||||
}, self.driver)
|
||||
add_smoke_particle({
|
||||
x = opos.x - srcomp1x,
|
||||
y = opos.y,
|
||||
z = opos.z - srcomp1z
|
||||
}, self.driver)
|
||||
add_smoke_particle({
|
||||
x = opos.x + srcomp2x,
|
||||
y = opos.y,
|
||||
z = opos.z + srcomp2z
|
||||
}, self.driver)
|
||||
add_smoke_particle({
|
||||
x = opos.x - srcomp2x,
|
||||
y = opos.y,
|
||||
z = opos.z - srcomp2z
|
||||
}, self.driver)
|
||||
end
|
||||
end
|
||||
|
||||
local new_acc = {
|
||||
x = trracc.x + dragacc.x + tlfacc.x,
|
||||
y = trracc.y + dragacc.y + tlfacc.y - GRAV,
|
||||
z = trracc.z + dragacc.z + tlfacc.z,
|
||||
}
|
||||
-- Turn multiplier
|
||||
local turm = 1
|
||||
-- Reduce turn below 4nps
|
||||
if velmag < 4 then
|
||||
turm = velmag / 4
|
||||
end
|
||||
-- Limit dtime to avoid too much turn
|
||||
dtime = math.min(dtime, 0.2)
|
||||
|
||||
self.object:setpos(self.object:getpos())
|
||||
self.object:setvelocity(self.object:getvelocity())
|
||||
self.object:setacceleration(new_acc)
|
||||
self.object:setyaw(wrap_yaw(self.object:getyaw() + self.rot * dtime * turm))
|
||||
end
|
||||
|
||||
-- Register entity
|
||||
|
||||
minetest.register_entity("driftbus:driftbus" .. name, car)
|
||||
|
||||
-- Craftitem
|
||||
|
||||
minetest.register_craftitem("driftbus:driftbus" .. name, {
|
||||
description = "Drift Bus" .. name,
|
||||
inventory_image = "volvo_inv.png^[colorize:#"..colour..":70",
|
||||
wield_image = "none.png",
|
||||
wield_scale = {x = 2, y = 2, z = 2},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = pointed_thing.under
|
||||
local node = minetest.get_node(under)
|
||||
local udef = minetest.registered_nodes[node.name]
|
||||
|
||||
-- Run any on_rightclick function of pointed node instead
|
||||
if udef and udef.on_rightclick and
|
||||
not (placer and placer:is_player() and
|
||||
placer:get_player_control().sneak) then
|
||||
return udef.on_rightclick(under, node, placer, itemstack,
|
||||
pointed_thing) or itemstack
|
||||
end
|
||||
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
pointed_thing.under.y = pointed_thing.under.y + 1.25
|
||||
local car = minetest.add_entity(pointed_thing.under,
|
||||
"driftbus:driftbus" .. name)
|
||||
if car then
|
||||
if placer then
|
||||
car:setyaw(placer:get_look_horizontal())
|
||||
end
|
||||
local player_name = placer and placer:get_player_name() or ""
|
||||
if not (creative and creative.is_enabled_for and
|
||||
creative.is_enabled_for(player_name)) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
-- Nodebox
|
||||
|
||||
minetest.register_node("driftbus:driftbus_nodebox" ..name, {
|
||||
description = "Drift Bus Model" ..name,
|
||||
tiles = { -- Top, base, right, left, front, back
|
||||
"volvo.png^[colorize:#"..colour..":70",
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1.2, -0.5, -4.5, 1.2, 2.0, 4.5}
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1.2, -0.5, -4.5, 1.2, 2.0, 4.5}
|
||||
},
|
||||
paramtype = "light",
|
||||
drawtype = "mesh",
|
||||
mesh = "volvo.b3d",
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
})
|
||||
|
||||
end
|
|
@ -0,0 +1,66 @@
|
|||
License of source code
|
||||
----------------------
|
||||
|
||||
The MIT License (MIT)
|
||||
Copyright (C) 2019 MrChiantos (Update)
|
||||
Copyright (c) 2019 Andrey01 (Bus Model)
|
||||
Copyright (C) 2018 paramat (DriftCar Code)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more details:
|
||||
https://opensource.org/licenses/MIT
|
||||
|
||||
|
||||
License of media (textures)
|
||||
---------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
|
||||
Copyright (C) 2019 MrChiantos (Update)
|
||||
Copyright (c) 2019 Andrey01 (Bus Model)
|
||||
Copyright (C) 2018 paramat (DriftCar Code)
|
||||
|
||||
You are free to:
|
||||
|
||||
Share — copy and redistribute the material in any medium or format
|
||||
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
|
||||
|
||||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||
|
||||
Under the following terms:
|
||||
|
||||
Attribution — You must give appropriate credit, provide a link to the license, and
|
||||
indicate if changes were made. You may do so in any reasonable manner, but not in any way
|
||||
that suggests the licensor endorses you or your use.
|
||||
|
||||
ShareAlike — If you remix, transform, or build upon the material, you must distribute
|
||||
your contributions under the same license as the original.
|
||||
|
||||
No additional restrictions — You may not apply legal terms or technological measures that
|
||||
legally restrict others from doing anything the license permits.
|
||||
|
||||
Notices:
|
||||
|
||||
You do not have to comply with the license for elements of the material in the public
|
||||
domain or where your use is permitted by an applicable exception or limitation.
|
||||
No warranties are given. The license may not give you all of the permissions necessary
|
||||
for your intended use. For example, other rights such as publicity, privacy, or moral
|
||||
rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
|
@ -0,0 +1 @@
|
|||
name = driftbus
|
After Width: | Height: | Size: 96 B |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 22 KiB |
|
@ -0,0 +1 @@
|
|||
stairs
|
|
@ -0,0 +1,110 @@
|
|||
combostairleft = {index = {
|
||||
["color:blue"] = "stairsleft:stair_blue",
|
||||
["color:black"] = "stairsleft:stair_black",
|
||||
["color:green"] = "stairsleft:stair_green",
|
||||
["color:red"] = "stairsleft:stair_red",
|
||||
["color:yellow"] = "stairsleft:stair_yellow",
|
||||
["color:orange"] = "stairsleft:stair_orange",
|
||||
["color:pink"] = "stairsleft:stair_pink",
|
||||
["color:white"] = "stairsleft:stair_white",
|
||||
|
||||
}}
|
||||
local creative = minetest.setting_getbool("creative_mode")
|
||||
for k,v1 in pairs(combostairleft.index) do
|
||||
local v1_def = minetest.registered_nodes[v1]
|
||||
local v1_groups = table.copy(v1_def.groups)
|
||||
v1_groups.not_in_creative_inventory = 1
|
||||
local v1_tiles = table.copy(v1_def.tiles)
|
||||
if not v1_tiles[2] then
|
||||
v1_tiles[2] = v1_tiles[1]
|
||||
end
|
||||
if not v1_tiles[3] then
|
||||
v1_tiles[3] = v1_tiles[2]
|
||||
end
|
||||
if not v1_tiles[4] then
|
||||
v1_tiles[4] = v1_tiles[3]
|
||||
end
|
||||
if not v1_tiles[5] then
|
||||
v1_tiles[5] = v1_tiles[4]
|
||||
end
|
||||
if not v1_tiles[6] then
|
||||
v1_tiles[6] = v1_tiles[5]
|
||||
end
|
||||
for _,v2 in pairs(combostairleft.index) do
|
||||
if v1 ~= v2 then
|
||||
local v2_def = minetest.registered_nodes[v2]
|
||||
local v2_tiles = table.copy(v2_def.tiles)
|
||||
if not v2_tiles[2] then
|
||||
v2_tiles[2] = v2_tiles[1]
|
||||
end
|
||||
if not v2_tiles[3] then
|
||||
v2_tiles[3] = v2_tiles[2]
|
||||
end
|
||||
if not v2_tiles[4] then
|
||||
v2_tiles[4] = v2_tiles[3]
|
||||
end
|
||||
if not v2_tiles[5] then
|
||||
v2_tiles[5] = v2_tiles[4]
|
||||
end
|
||||
if not v2_tiles[6] then
|
||||
v2_tiles[6] = v2_tiles[5]
|
||||
end
|
||||
minetest.register_node("combostairleft:"..v1:split(":")[2].."_onc_"..v2:split(":")[2], {
|
||||
description = v1_def.description.." on "..v2_def.description,
|
||||
tiles = {v1_tiles[1], v2_tiles[2]},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "mesh",
|
||||
mesh = "stairleft.b3d",
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
|
||||
sounds = v1_def.sounds,
|
||||
groups = v1_groups,
|
||||
drop = v1,
|
||||
})
|
||||
end
|
||||
end
|
||||
minetest.override_item(v1, {
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local pos = pointed_thing.under
|
||||
if pointed_thing.type ~= "node" or minetest.is_protected(pos, placer:get_player_name()) then
|
||||
return
|
||||
end
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == v1 then
|
||||
minetest.swap_node(pos, {name = k, param2 = 0})
|
||||
if not creative then
|
||||
itemstack:take_item()
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
for _,v in pairs(combostairleft.index) do
|
||||
if node.name == v then
|
||||
minetest.swap_node(pos, {name = "combostairleft:"..v1:split(":")[2].."_onc_"..v:split(":")[2], param2 = node.param2})
|
||||
if not creative then
|
||||
itemstack:take_item()
|
||||
return itemstack
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
|
@ -0,0 +1,31 @@
|
|||
Comboblock Fork for Blockcolor (Mrchiantos)
|
||||
Comboblock Original (pithydon)
|
||||
|
||||
License (Model) : CcO with Help MinetestVideo, Thank man.
|
||||
|
||||
License (source code) :
|
||||
=======================================================================
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org>
|
|
@ -0,0 +1 @@
|
|||
stairs
|
|
@ -0,0 +1,110 @@
|
|||
combostairright = {index = {
|
||||
["color:blue"] = "stairsright:stair_blue",
|
||||
["color:black"] = "stairsright:stair_black",
|
||||
["color:green"] = "stairsright:stair_green",
|
||||
["color:red"] = "stairsright:stair_red",
|
||||
["color:yellow"] = "stairsright:stair_yellow",
|
||||
["color:orange"] = "stairsright:stair_orange",
|
||||
["color:pink"] = "stairsright:stair_pink",
|
||||
["color:white"] = "stairsright:stair_white",
|
||||
|
||||
}}
|
||||
local creative = minetest.setting_getbool("creative_mode")
|
||||
for k,v1 in pairs(combostairright.index) do
|
||||
local v1_def = minetest.registered_nodes[v1]
|
||||
local v1_groups = table.copy(v1_def.groups)
|
||||
v1_groups.not_in_creative_inventory = 1
|
||||
local v1_tiles = table.copy(v1_def.tiles)
|
||||
if not v1_tiles[2] then
|
||||
v1_tiles[2] = v1_tiles[1]
|
||||
end
|
||||
if not v1_tiles[3] then
|
||||
v1_tiles[3] = v1_tiles[2]
|
||||
end
|
||||
if not v1_tiles[4] then
|
||||
v1_tiles[4] = v1_tiles[3]
|
||||
end
|
||||
if not v1_tiles[5] then
|
||||
v1_tiles[5] = v1_tiles[4]
|
||||
end
|
||||
if not v1_tiles[6] then
|
||||
v1_tiles[6] = v1_tiles[5]
|
||||
end
|
||||
for _,v2 in pairs(combostairright.index) do
|
||||
if v1 ~= v2 then
|
||||
local v2_def = minetest.registered_nodes[v2]
|
||||
local v2_tiles = table.copy(v2_def.tiles)
|
||||
if not v2_tiles[2] then
|
||||
v2_tiles[2] = v2_tiles[1]
|
||||
end
|
||||
if not v2_tiles[3] then
|
||||
v2_tiles[3] = v2_tiles[2]
|
||||
end
|
||||
if not v2_tiles[4] then
|
||||
v2_tiles[4] = v2_tiles[3]
|
||||
end
|
||||
if not v2_tiles[5] then
|
||||
v2_tiles[5] = v2_tiles[4]
|
||||
end
|
||||
if not v2_tiles[6] then
|
||||
v2_tiles[6] = v2_tiles[5]
|
||||
end
|
||||
minetest.register_node("combostairright:"..v1:split(":")[2].."_onc_"..v2:split(":")[2], {
|
||||
description = v1_def.description.." on "..v2_def.description,
|
||||
tiles = {v1_tiles[1], v2_tiles[2]},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "mesh",
|
||||
mesh = "stairright.b3d",
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
|
||||
sounds = v1_def.sounds,
|
||||
groups = v1_groups,
|
||||
drop = v1,
|
||||
})
|
||||
end
|
||||
end
|
||||
minetest.override_item(v1, {
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local pos = pointed_thing.under
|
||||
if pointed_thing.type ~= "node" or minetest.is_protected(pos, placer:get_player_name()) then
|
||||
return
|
||||
end
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == v1 then
|
||||
minetest.swap_node(pos, {name = k, param2 = 0})
|
||||
if not creative then
|
||||
itemstack:take_item()
|
||||
return itemstack
|
||||
end
|
||||
else
|
||||
for _,v in pairs(combostairright.index) do
|
||||
if node.name == v then
|
||||
minetest.swap_node(pos, {name = "combostairright:"..v1:split(":")[2].."_onc_"..v:split(":")[2], param2 = node.param2})
|
||||
if not creative then
|
||||
itemstack:take_item()
|
||||
return itemstack
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
|
@ -0,0 +1,31 @@
|
|||
Comboblock Fork for Blockcolor (Mrchiantos)
|
||||
Comboblock Original (pithydon)
|
||||
|
||||
License (Model) : CcO with Help MinetestVideo, Thank man.
|
||||
|
||||
License (source code) :
|
||||
=======================================================================
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org>
|
|
@ -6,6 +6,14 @@
|
|||
|
||||
stairs = {}
|
||||
|
||||
local source_list = {
|
||||
{""},
|
||||
{"nocombo"},
|
||||
}
|
||||
|
||||
for i in ipairs(source_list) do
|
||||
local combo = source_list[i][1]
|
||||
|
||||
|
||||
-- Register aliases for new pine node names
|
||||
|
||||
|
@ -47,7 +55,7 @@ end
|
|||
|
||||
function stairs.register_stair(subname, recipeitem, groups, images, description, sounds, html, wieldcolors)
|
||||
groups.stair = 1
|
||||
minetest.register_node(":stairs:stair_" .. subname, {
|
||||
minetest.register_node(":stairs:stair" .. combo .. "_" .. subname, {
|
||||
description = description,
|
||||
wield_image = wieldcolors,
|
||||
wield_scale = {x=1,y=1,z=0.5},
|
||||
|
@ -85,8 +93,8 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
|
|||
|
||||
-- for replace ABM
|
||||
if replace then
|
||||
minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
|
||||
replace_name = "stairs:stair_" .. subname,
|
||||
minetest.register_node(":stairs:stair" .. combo .. "_" .. subname .. "upside_down", {
|
||||
replace_name = "stairs:stair" .. combo .. "_" .. subname,
|
||||
groups = {slabs_replace = 1},
|
||||
})
|
||||
end
|
||||
|
@ -136,7 +144,7 @@ local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
|
|||
|
||||
function stairs.register_slab(subname, recipeitem, groups, images, description, sounds, html, wieldcolors)
|
||||
groups.slab = 1
|
||||
minetest.register_node(":stairs:slab_" .. subname, {
|
||||
minetest.register_node(":stairs:slab" .. combo .. "_" .. subname, {
|
||||
description = description,
|
||||
wield_image = wieldcolors,
|
||||
wield_scale = {x=1,y=1,z=0.5},
|
||||
|
@ -208,8 +216,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
|
|||
|
||||
-- for replace ABM
|
||||
if replace then
|
||||
minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
|
||||
replace_name = "stairs:slab_".. subname,
|
||||
minetest.register_node(":stairs:slab" .. combo .. "_" .. subname .. "upside_down", {
|
||||
replace_name = "stairs:slab" .. combo .. "_".. subname,
|
||||
groups = {slabs_replace = 1},
|
||||
})
|
||||
end
|
||||
|
@ -368,3 +376,5 @@ stairs.register_stair_and_slab(
|
|||
color8,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color8..":70)"
|
||||
)
|
||||
|
||||
end
|
|
@ -0,0 +1,16 @@
|
|||
Minetest Game mod: stairs
|
||||
=========================
|
||||
See license.txt for license information.
|
||||
|
||||
Authors of source code
|
||||
----------------------
|
||||
Originally by Kahrl <kahrl@gmx.net> (LGPL 2.1) and
|
||||
celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
|
||||
Various Minetest developers and contributors (LGPL 2.1)
|
||||
|
||||
Authors of media (models)
|
||||
-------------------------
|
||||
Jean-Patrick G. (kilbith) <jeanpatrick.guerrero@gmail.com> (CC BY-SA 3.0):
|
||||
stairs_stair.obj
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
color
|
|
@ -0,0 +1,380 @@
|
|||
-- Minetest 0.4 mod: stairsleft
|
||||
-- See README.txt for licensing and other information.
|
||||
|
||||
|
||||
-- Global namespace for functions
|
||||
|
||||
stairsleft = {}
|
||||
|
||||
local source_list = {
|
||||
{""},
|
||||
{"nocombo"},
|
||||
}
|
||||
|
||||
for i in ipairs(source_list) do
|
||||
local combo = source_list[i][1]
|
||||
|
||||
|
||||
-- Register aliases for new pine node names
|
||||
|
||||
minetest.register_alias("stairsleft:stair_pinewood", "stairsleft:stair_pine_wood")
|
||||
minetest.register_alias("stairsleft:slab_pinewood", "stairsleft:slab_pine_wood")
|
||||
|
||||
|
||||
-- Get setting for replace ABM
|
||||
|
||||
local replace = minetest.settings:get_bool("enable_stairsleft_replace_abm")
|
||||
|
||||
local function rotate_and_place(itemstack, placer, pointed_thing)
|
||||
local p0 = pointed_thing.under
|
||||
local p1 = pointed_thing.above
|
||||
local param2 = 0
|
||||
|
||||
local placer_pos = placer:getpos()
|
||||
if placer_pos then
|
||||
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
|
||||
end
|
||||
|
||||
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
|
||||
local fpos = finepos.y % 1
|
||||
|
||||
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
|
||||
or (fpos < -0.5 and fpos > -0.999999999) then
|
||||
param2 = param2 + 20
|
||||
if param2 == 21 then
|
||||
param2 = 23
|
||||
elseif param2 == 23 then
|
||||
param2 = 21
|
||||
end
|
||||
end
|
||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
||||
end
|
||||
|
||||
-- Register stairsleft.
|
||||
-- Node will be called stairsleft:stair_<subname>
|
||||
|
||||
function stairsleft.register_stair(subname, recipeitem, groups, images, description, sounds, html, wieldcolors)
|
||||
groups.stair = 1
|
||||
minetest.register_node(":stairsleft:stair" .. combo .. "_" .. subname, {
|
||||
description = description,
|
||||
wield_image = wieldcolors,
|
||||
wield_scale = {x=1,y=1,z=0.5},
|
||||
drawtype = "mesh",
|
||||
inventory_image = "stairsleft.png^[colorize:#".. html ..":70",
|
||||
mesh = "stairleft.b3d",
|
||||
tiles = images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = groups,
|
||||
sounds = sounds,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
return rotate_and_place(itemstack, placer, pointed_thing)
|
||||
end,
|
||||
})
|
||||
|
||||
-- for replace ABM
|
||||
if replace then
|
||||
minetest.register_node(":stairsleft:stair" .. combo .. "_" .. subname .. "upside_down", {
|
||||
replace_name = "stairsleft:stair" .. combo .. "_" .. subname,
|
||||
groups = {slabs_replace = 1},
|
||||
})
|
||||
end
|
||||
|
||||
if recipeitem then
|
||||
minetest.register_craft({
|
||||
output = 'stairsleft:stair_' .. subname .. ' 8',
|
||||
recipe = {
|
||||
{recipeitem, "", ""},
|
||||
{recipeitem, recipeitem, ""},
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
},
|
||||
})
|
||||
|
||||
-- Flipped recipe for the silly minecrafters
|
||||
minetest.register_craft({
|
||||
output = 'stairsleft:stair_' .. subname .. ' 8',
|
||||
recipe = {
|
||||
{"", "", recipeitem},
|
||||
{"", recipeitem, recipeitem},
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
},
|
||||
})
|
||||
|
||||
-- Fuel
|
||||
local baseburntime = minetest.get_craft_result({
|
||||
method = "fuel",
|
||||
width = 1,
|
||||
items = {recipeitem}
|
||||
}).time
|
||||
if baseburntime > 0 then
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = 'stairsleft:stair_' .. subname,
|
||||
burntime = math.floor(baseburntime * 0.75),
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Slab facedir to placement 6d matching table
|
||||
local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
|
||||
|
||||
-- Register slabs.
|
||||
-- Node will be called stairsleft:slab_<subname>
|
||||
|
||||
function stairsleft.register_slab(subname, recipeitem, groups, images, description, sounds, html, wieldcolors)
|
||||
groups.slab = 1
|
||||
minetest.register_node(":stairsleft:slab_" .. subname, {
|
||||
description = description,
|
||||
wield_image = wieldcolors,
|
||||
wield_scale = {x=1,y=1,z=0.5},
|
||||
inventory_image = "slabs.png^[colorize:#".. html ..":70",
|
||||
drawtype = "nodebox",
|
||||
tiles = images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = groups,
|
||||
sounds = sounds,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = minetest.get_node(pointed_thing.under)
|
||||
local wield_item = itemstack:get_name()
|
||||
local creative_enabled = (creative and creative.is_enabled_for
|
||||
and creative.is_enabled_for(placer:get_player_name()))
|
||||
|
||||
if under and under.name:find("stairsleft:slab_") then
|
||||
-- place slab using under node orientation
|
||||
local dir = minetest.dir_to_facedir(vector.subtract(
|
||||
pointed_thing.above, pointed_thing.under), true)
|
||||
|
||||
local p2 = under.param2
|
||||
|
||||
-- combine two slabs if possible
|
||||
if slab_trans_dir[math.floor(p2 / 4)] == dir
|
||||
and wield_item == under.name then
|
||||
|
||||
if not recipeitem then
|
||||
return itemstack
|
||||
end
|
||||
local player_name = placer:get_player_name()
|
||||
if minetest.is_protected(pointed_thing.under, player_name) and not
|
||||
minetest.check_player_privs(placer, "protection_bypass") then
|
||||
minetest.record_protection_violation(pointed_thing.under,
|
||||
player_name)
|
||||
return
|
||||
end
|
||||
minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2})
|
||||
if not creative_enabled then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
||||
-- Placing a slab on an upside down slab should make it right-side up.
|
||||
if p2 >= 20 and dir == 8 then
|
||||
p2 = p2 - 20
|
||||
-- same for the opposite case: slab below normal slab
|
||||
elseif p2 <= 3 and dir == 4 then
|
||||
p2 = p2 + 20
|
||||
end
|
||||
|
||||
-- else attempt to place node with proper param2
|
||||
minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
|
||||
if not creative_enabled then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
else
|
||||
return rotate_and_place(itemstack, placer, pointed_thing)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- for replace ABM
|
||||
if replace then
|
||||
minetest.register_node(":stairsleft:slab_" .. subname .. "upside_down", {
|
||||
replace_name = "stairsleft:slab_".. subname,
|
||||
groups = {slabs_replace = 1},
|
||||
})
|
||||
end
|
||||
|
||||
if recipeitem then
|
||||
minetest.register_craft({
|
||||
output = 'stairsleft:slab_' .. subname .. ' 6',
|
||||
recipe = {
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
},
|
||||
})
|
||||
|
||||
-- Fuel
|
||||
local baseburntime = minetest.get_craft_result({
|
||||
method = "fuel",
|
||||
width = 1,
|
||||
items = {recipeitem}
|
||||
}).time
|
||||
if baseburntime > 0 then
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = 'stairsleft:slab_' .. subname,
|
||||
burntime = math.floor(baseburntime * 0.5),
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Optionally replace old "upside_down" nodes with new param2 versions.
|
||||
-- Disabled by default.
|
||||
|
||||
if replace then
|
||||
minetest.register_abm({
|
||||
label = "Slab replace",
|
||||
nodenames = {"group:slabs_replace"},
|
||||
interval = 16,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
node.name = minetest.registered_nodes[node.name].replace_name
|
||||
node.param2 = node.param2 + 20
|
||||
if node.param2 == 21 then
|
||||
node.param2 = 23
|
||||
elseif node.param2 == 23 then
|
||||
node.param2 = 21
|
||||
end
|
||||
minetest.set_node(pos, node)
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
-- Stair/slab registration function.
|
||||
-- Nodes will be called stairsleft:{stair,slab}_<subname>
|
||||
|
||||
function stairsleft.register_stair_and_slab(subname, recipeitem,
|
||||
groups, images, desc_stair, desc_slab, sounds, html, wieldcolors)
|
||||
stairsleft.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, html, wieldcolors)
|
||||
stairsleft.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, html, wieldcolors)
|
||||
end
|
||||
|
||||
-- Register default stairsleft and slabs
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"blue",
|
||||
"color:blue",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color2..":70"},
|
||||
"Blue Stair",
|
||||
"Blue Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color2,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color2..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"red",
|
||||
"color:red",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color6..":70"},
|
||||
"Red Stair",
|
||||
"Red Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color6,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color6..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"white",
|
||||
"color:white",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color4..":70"},
|
||||
"White Stair",
|
||||
"White Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color4,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color4..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"black",
|
||||
"color:black",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color1..":70"},
|
||||
"Black Stair",
|
||||
"Black Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color1,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color1..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"green",
|
||||
"color:green",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color3..":70"},
|
||||
"Green Stair",
|
||||
"Green Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color3,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color3..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"yellow",
|
||||
"color:yellow",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color7..":70"},
|
||||
"Yellow Stair",
|
||||
"Yellow Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color7,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color7..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"orange",
|
||||
"color:orange",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color5..":70"},
|
||||
"Orange Stair",
|
||||
"Orange Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color5,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color5..":70)"
|
||||
)
|
||||
|
||||
stairsleft.register_stair_and_slab(
|
||||
"pink",
|
||||
"color:pink",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color8..":70"},
|
||||
"Pink Stair",
|
||||
"Pink Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color8,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color8..":70)"
|
||||
)
|
||||
|
||||
end
|
|
@ -0,0 +1,51 @@
|
|||
License of source code
|
||||
----------------------
|
||||
|
||||
GNU Lesser General Public License, version 2.1
|
||||
Copyright (C) 2011-2016 Kahrl <kahrl@gmx.net>
|
||||
Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2012-2016 Various Minetest developers and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the terms
|
||||
of the GNU Lesser General Public License as published by the Free Software Foundation;
|
||||
either version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details:
|
||||
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
|
||||
|
||||
|
||||
Licenses of media (models)
|
||||
--------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero@gmail.com>
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
|
||||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||
|
||||
Under the following terms:
|
||||
|
||||
Attribution — You must give appropriate credit, provide a link to the license, and
|
||||
indicate if changes were made. You may do so in any reasonable manner, but not in any way
|
||||
that suggests the licensor endorses you or your use.
|
||||
|
||||
ShareAlike — If you remix, transform, or build upon the material, you must distribute
|
||||
your contributions under the same license as the original.
|
||||
|
||||
No additional restrictions — You may not apply legal terms or technological measures that
|
||||
legally restrict others from doing anything the license permits.
|
||||
|
||||
Notices:
|
||||
|
||||
You do not have to comply with the license for elements of the material in the public
|
||||
domain or where your use is permitted by an applicable exception or limitation.
|
||||
No warranties are given. The license may not give you all of the permissions necessary
|
||||
for your intended use. For example, other rights such as publicity, privacy, or moral
|
||||
rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
|
@ -0,0 +1,16 @@
|
|||
Minetest Game mod: stairs
|
||||
=========================
|
||||
See license.txt for license information.
|
||||
|
||||
Authors of source code
|
||||
----------------------
|
||||
Originally by Kahrl <kahrl@gmx.net> (LGPL 2.1) and
|
||||
celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
|
||||
Various Minetest developers and contributors (LGPL 2.1)
|
||||
|
||||
Authors of media (models)
|
||||
-------------------------
|
||||
Jean-Patrick G. (kilbith) <jeanpatrick.guerrero@gmail.com> (CC BY-SA 3.0):
|
||||
stairs_stair.obj
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
color
|
|
@ -0,0 +1,380 @@
|
|||
-- Minetest 0.4 mod: stairsright
|
||||
-- See README.txt for licensing and other information.
|
||||
|
||||
|
||||
-- Global namespace for functions
|
||||
|
||||
stairsright = {}
|
||||
|
||||
local source_list = {
|
||||
{""},
|
||||
{"nocombo"},
|
||||
}
|
||||
|
||||
for i in ipairs(source_list) do
|
||||
local combo = source_list[i][1]
|
||||
|
||||
|
||||
-- Register aliases for new pine node names
|
||||
|
||||
minetest.register_alias("stairsright:stair_pinewood", "stairsright:stair_pine_wood")
|
||||
minetest.register_alias("stairsright:slab_pinewood", "stairsright:slab_pine_wood")
|
||||
|
||||
|
||||
-- Get setting for replace ABM
|
||||
|
||||
local replace = minetest.settings:get_bool("enable_stairsright_replace_abm")
|
||||
|
||||
local function rotate_and_place(itemstack, placer, pointed_thing)
|
||||
local p0 = pointed_thing.under
|
||||
local p1 = pointed_thing.above
|
||||
local param2 = 0
|
||||
|
||||
local placer_pos = placer:getpos()
|
||||
if placer_pos then
|
||||
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
|
||||
end
|
||||
|
||||
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
|
||||
local fpos = finepos.y % 1
|
||||
|
||||
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
|
||||
or (fpos < -0.5 and fpos > -0.999999999) then
|
||||
param2 = param2 + 20
|
||||
if param2 == 21 then
|
||||
param2 = 23
|
||||
elseif param2 == 23 then
|
||||
param2 = 21
|
||||
end
|
||||
end
|
||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
||||
end
|
||||
|
||||
-- Register stairsright.
|
||||
-- Node will be called stairsright:stair_<subname>
|
||||
|
||||
function stairsright.register_stair(subname, recipeitem, groups, images, description, sounds, html, wieldcolors)
|
||||
groups.stair = 1
|
||||
minetest.register_node(":stairsright:stair" .. combo .. "_" .. subname, {
|
||||
description = description,
|
||||
wield_image = wieldcolors,
|
||||
wield_scale = {x=1,y=1,z=0.5},
|
||||
drawtype = "mesh",
|
||||
inventory_image = "stairsright.png^[colorize:#".. html ..":70",
|
||||
mesh = "stairright.b3d",
|
||||
tiles = images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = groups,
|
||||
sounds = sounds,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
return rotate_and_place(itemstack, placer, pointed_thing)
|
||||
end,
|
||||
})
|
||||
|
||||
-- for replace ABM
|
||||
if replace then
|
||||
minetest.register_node(":stairsright:stair" .. combo .. "_" .. subname .. "upside_down", {
|
||||
replace_name = "stairsright:stair" .. combo .. "_" .. subname,
|
||||
groups = {slabs_replace = 1},
|
||||
})
|
||||
end
|
||||
|
||||
if recipeitem then
|
||||
minetest.register_craft({
|
||||
output = 'stairsright:stair_' .. subname .. ' 8',
|
||||
recipe = {
|
||||
{recipeitem, "", ""},
|
||||
{recipeitem, recipeitem, ""},
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
},
|
||||
})
|
||||
|
||||
-- Flipped recipe for the silly minecrafters
|
||||
minetest.register_craft({
|
||||
output = 'stairsright:stair_' .. subname .. ' 8',
|
||||
recipe = {
|
||||
{"", "", recipeitem},
|
||||
{"", recipeitem, recipeitem},
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
},
|
||||
})
|
||||
|
||||
-- Fuel
|
||||
local baseburntime = minetest.get_craft_result({
|
||||
method = "fuel",
|
||||
width = 1,
|
||||
items = {recipeitem}
|
||||
}).time
|
||||
if baseburntime > 0 then
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = 'stairsright:stair_' .. subname,
|
||||
burntime = math.floor(baseburntime * 0.75),
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Slab facedir to placement 6d matching table
|
||||
local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
|
||||
|
||||
-- Register slabs.
|
||||
-- Node will be called stairsright:slab_<subname>
|
||||
|
||||
function stairsright.register_slab(subname, recipeitem, groups, images, description, sounds, html, wieldcolors)
|
||||
groups.slab = 1
|
||||
minetest.register_node(":stairsright:right_" .. subname, {
|
||||
description = description,
|
||||
wield_image = wieldcolors,
|
||||
wield_scale = {x=1,y=1,z=0.5},
|
||||
inventory_image = "slabs.png^[colorize:#".. html ..":70",
|
||||
drawtype = "nodebox",
|
||||
tiles = images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = groups,
|
||||
sounds = sounds,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = minetest.get_node(pointed_thing.under)
|
||||
local wield_item = itemstack:get_name()
|
||||
local creative_enabled = (creative and creative.is_enabled_for
|
||||
and creative.is_enabled_for(placer:get_player_name()))
|
||||
|
||||
if under and under.name:find("stairsright:slab_") then
|
||||
-- place slab using under node orientation
|
||||
local dir = minetest.dir_to_facedir(vector.subtract(
|
||||
pointed_thing.above, pointed_thing.under), true)
|
||||
|
||||
local p2 = under.param2
|
||||
|
||||
-- combine two slabs if possible
|
||||
if slab_trans_dir[math.floor(p2 / 4)] == dir
|
||||
and wield_item == under.name then
|
||||
|
||||
if not recipeitem then
|
||||
return itemstack
|
||||
end
|
||||
local player_name = placer:get_player_name()
|
||||
if minetest.is_protected(pointed_thing.under, player_name) and not
|
||||
minetest.check_player_privs(placer, "protection_bypass") then
|
||||
minetest.record_protection_violation(pointed_thing.under,
|
||||
player_name)
|
||||
return
|
||||
end
|
||||
minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2})
|
||||
if not creative_enabled then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
||||
-- Placing a slab on an upside down slab should make it right-side up.
|
||||
if p2 >= 20 and dir == 8 then
|
||||
p2 = p2 - 20
|
||||
-- same for the opposite case: slab below normal slab
|
||||
elseif p2 <= 3 and dir == 4 then
|
||||
p2 = p2 + 20
|
||||
end
|
||||
|
||||
-- else attempt to place node with proper param2
|
||||
minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
|
||||
if not creative_enabled then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
else
|
||||
return rotate_and_place(itemstack, placer, pointed_thing)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- for replace ABM
|
||||
if replace then
|
||||
minetest.register_node(":stairsright:slab_" .. subname .. "upside_down", {
|
||||
replace_name = "stairsright:slab_".. subname,
|
||||
groups = {slabs_replace = 1},
|
||||
})
|
||||
end
|
||||
|
||||
if recipeitem then
|
||||
minetest.register_craft({
|
||||
output = 'stairsright:slab_' .. subname .. ' 6',
|
||||
recipe = {
|
||||
{recipeitem, recipeitem, recipeitem},
|
||||
},
|
||||
})
|
||||
|
||||
-- Fuel
|
||||
local baseburntime = minetest.get_craft_result({
|
||||
method = "fuel",
|
||||
width = 1,
|
||||
items = {recipeitem}
|
||||
}).time
|
||||
if baseburntime > 0 then
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = 'stairsright:slab_' .. subname,
|
||||
burntime = math.floor(baseburntime * 0.5),
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Optionally replace old "upside_down" nodes with new param2 versions.
|
||||
-- Disabled by default.
|
||||
|
||||
if replace then
|
||||
minetest.register_abm({
|
||||
label = "Slab replace",
|
||||
nodenames = {"group:slabs_replace"},
|
||||
interval = 16,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
node.name = minetest.registered_nodes[node.name].replace_name
|
||||
node.param2 = node.param2 + 20
|
||||
if node.param2 == 21 then
|
||||
node.param2 = 23
|
||||
elseif node.param2 == 23 then
|
||||
node.param2 = 21
|
||||
end
|
||||
minetest.set_node(pos, node)
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
-- Stair/slab registration function.
|
||||
-- Nodes will be called stairsright:{stair,slab}_<subname>
|
||||
|
||||
function stairsright.register_stair_and_slab(subname, recipeitem,
|
||||
groups, images, desc_stair, desc_slab, sounds, html, wieldcolors)
|
||||
stairsright.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, html, wieldcolors)
|
||||
stairsright.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, html, wieldcolors)
|
||||
end
|
||||
|
||||
-- Register default stairsright and slabs
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"blue",
|
||||
"color:blue",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color2..":70"},
|
||||
"Blue Stair Right",
|
||||
"Blue Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color2,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color2..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"red",
|
||||
"color:red",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color6..":70"},
|
||||
"Red Stair Right",
|
||||
"Red Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color6,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color6..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"white",
|
||||
"color:white",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color4..":70"},
|
||||
"White Stair Right",
|
||||
"White Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color4,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color4..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"black",
|
||||
"color:black",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color1..":70"},
|
||||
"Black Stair Right",
|
||||
"Black Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color1,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color1..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"green",
|
||||
"color:green",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color3..":70"},
|
||||
"Green Stair Right",
|
||||
"Green Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color3,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color3..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"yellow",
|
||||
"color:yellow",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color7..":70"},
|
||||
"Yellow Stair Right",
|
||||
"Yellow Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color7,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color7..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"orange",
|
||||
"color:orange",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color5..":70"},
|
||||
"Orange Stair Right",
|
||||
"Orange Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color5,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color5..":70)"
|
||||
)
|
||||
|
||||
stairsright.register_stair_and_slab(
|
||||
"pink",
|
||||
"color:pink",
|
||||
{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
{"color_white2.png^[colorize:#"..color8..":70"},
|
||||
"Pink Stair Right",
|
||||
"Pink Slab",
|
||||
default.node_sound_wood_defaults(),
|
||||
color8,
|
||||
"color_handwhite.png^(color_handwhite2.png^[colorize:#"..color8..":70)"
|
||||
)
|
||||
|
||||
end
|
|
@ -0,0 +1,51 @@
|
|||
License of source code
|
||||
----------------------
|
||||
|
||||
GNU Lesser General Public License, version 2.1
|
||||
Copyright (C) 2011-2016 Kahrl <kahrl@gmx.net>
|
||||
Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2012-2016 Various Minetest developers and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the terms
|
||||
of the GNU Lesser General Public License as published by the Free Software Foundation;
|
||||
either version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details:
|
||||
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
|
||||
|
||||
|
||||
Licenses of media (models)
|
||||
--------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero@gmail.com>
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
|
||||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||
|
||||
Under the following terms:
|
||||
|
||||
Attribution — You must give appropriate credit, provide a link to the license, and
|
||||
indicate if changes were made. You may do so in any reasonable manner, but not in any way
|
||||
that suggests the licensor endorses you or your use.
|
||||
|
||||
ShareAlike — If you remix, transform, or build upon the material, you must distribute
|
||||
your contributions under the same license as the original.
|
||||
|
||||
No additional restrictions — You may not apply legal terms or technological measures that
|
||||
legally restrict others from doing anything the license permits.
|
||||
|
||||
Notices:
|
||||
|
||||
You do not have to comply with the license for elements of the material in the public
|
||||
domain or where your use is permitted by an applicable exception or limitation.
|
||||
No warranties are given. The license may not give you all of the permissions necessary
|
||||
for your intended use. For example, other rights such as publicity, privacy, or moral
|
||||
rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
|
@ -462,6 +462,51 @@ end
|
|||
end
|
||||
)
|
||||
|
||||
-- ComBo Blocks
|
||||
|
||||
-- Stairs (Border Left)
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.stairsleft then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_white')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_black')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_red')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_orange')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_yellow')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_pink')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_green')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stair_blue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
-- Stairs (Border Right)
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.stairsright then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_white')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_black')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_red')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_orange')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_yellow')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_pink')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_green')
|
||||
player:get_inventory():add_item('main', 'stairsright:stair_blue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
|
||||
-- Stairs
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
|
@ -483,26 +528,6 @@ end
|
|||
end
|
||||
)
|
||||
|
||||
-- Top Slabs
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.tslabs then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabwhite')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabblack')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabred')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slaborange')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabyellow')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabpink')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabgreen')
|
||||
player:get_inventory():add_item('main', 'stackslabs:top_slabblue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
-- Bottom Slabs
|
||||
|
||||
|
@ -525,4 +550,92 @@ end
|
|||
end
|
||||
)
|
||||
|
||||
-- End Build Nodes
|
||||
-- No ComBo Blocks
|
||||
|
||||
-- Stairs (Border Left)
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.stairsleftnocombo then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_white')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_black')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_red')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_orange')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_yellow')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_pink')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_green')
|
||||
player:get_inventory():add_item('main', 'stairsleft:stairnocombo_blue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
-- Stairs (Border Right)
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.stairsrightnocombo then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_white')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_black')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_red')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_orange')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_yellow')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_pink')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_green')
|
||||
player:get_inventory():add_item('main', 'stairsright:stairnocombo_blue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
|
||||
-- Stairs
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.stairsnocombo then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_white')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_black')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_red')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_orange')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_yellow')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_pink')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_green')
|
||||
player:get_inventory():add_item('main', 'stairs:stairnocombo_blue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
|
||||
-- Bottom Slabs
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.slabsnocombo then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_white')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_black')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_red')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_orange')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_yellow')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_pink')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_green')
|
||||
player:get_inventory():add_item('main', 'stairs:slabnocombo_blue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
-- End Build Nodes
|
|
@ -90,27 +90,27 @@ inventory_plus.get_formspec = function(player, page)
|
|||
.. "image_button_exit[0,0.5;1,1;blocks.png;blocks;]"
|
||||
.. "tooltip[blocks;Block]"
|
||||
|
||||
.. "image_button_exit[1,0.5;1,1;stairs.png;stairs;]"
|
||||
.. "tooltip[stairs;Stair]"
|
||||
.. "image_button_exit[1,0.5;1,1;stairs.png;stairsnocombo;]"
|
||||
.. "tooltip[stairsnocombo;Stair (no combo)]"
|
||||
|
||||
.. "image_button_exit[2,0.5;1,1;slabs.png;slabs;]"
|
||||
.. "tooltip[slabs;Slab]"
|
||||
.. "image_button_exit[2,0.5;1,1;stairsleft.png;stairsleftnocombo;]"
|
||||
.. "tooltip[stairsleftnocombo;Stair Left (no combo)]"
|
||||
|
||||
.. "image_button_exit[3,0.5;1,1;windows.png;windows;]"
|
||||
.. "image_button_exit[3,0.5;1,1;stairsright.png;stairsrightnocombo;]"
|
||||
.. "tooltip[stairsrightnocombo;Stair Right (no combo)]"
|
||||
|
||||
.. "image_button_exit[4,0.5;1,1;slabs.png;slabsnocombo;]"
|
||||
.. "tooltip[slabsnocombo;Slab (no combo)]"
|
||||
|
||||
.. "image_button_exit[5,0.5;1,1;windows.png;windows;]"
|
||||
.. "tooltip[windows;Window]"
|
||||
|
||||
.. "image_button_exit[4,0.5;1,1;lights.png;lights;]"
|
||||
.. "image_button_exit[6,0.5;1,1;lights.png;lights;]"
|
||||
.. "tooltip[lights;Light]"
|
||||
|
||||
.. "image_button_exit[5,0.5;1,1;waters.png;waters;]"
|
||||
.. "tooltip[waters;Water]"
|
||||
|
||||
.. "image_button_exit[6,0.5;1,1;doors.png;doors;] "
|
||||
.. "image_button_exit[7,0.5;1,1;doors.png;doors;] "
|
||||
.. "tooltip[doors;Door]"
|
||||
|
||||
.. "image_button_exit[7,0.5;1,1;carpets.png;carpets;]"
|
||||
.. "tooltip[carpets;Carpet]"
|
||||
|
||||
.. "image_button_exit[0,2.5;1,1;trapdoor.png;trapdoor;]"
|
||||
.. "tooltip[trapdoor;Trapdoor]"
|
||||
|
||||
|
@ -168,6 +168,8 @@ inventory_plus.get_formspec = function(player, page)
|
|||
.. "image_button_exit[2,6.5;1,1;nones.png;none;]"
|
||||
.. "tooltip[none;None]"
|
||||
|
||||
.. "image_button[5,6.5;3,1;;nodesnocombo1;Combo Nodes]"
|
||||
.. "tooltip[nodesnocombo1;Combo Nodes]"
|
||||
|
||||
.. ""
|
||||
|
||||
|
@ -188,6 +190,12 @@ inventory_plus.get_formspec = function(player, page)
|
|||
|
||||
.. "image_button_exit[0,0.5;1,1;edgecorner.png;edgecorner;]"
|
||||
.. "tooltip[edgecorner;Edge corner]"
|
||||
|
||||
.. "image_button_exit[1,0.5;1,1;carpets.png;carpets;]"
|
||||
.. "tooltip[carpets;Carpet]"
|
||||
|
||||
.. "image_button_exit[2,0.5;1,1;waters.png;waters;]"
|
||||
.. "tooltip[waters;Water]"
|
||||
|
||||
.. "image_button[0,6.5;1,1;gauche.png;nodes;]"
|
||||
.. "tooltip[nodes;Nodes Page 1]"
|
||||
|
@ -202,6 +210,45 @@ inventory_plus.get_formspec = function(player, page)
|
|||
|
||||
end
|
||||
|
||||
-- nodes nocombo
|
||||
|
||||
if page == "nodesnocombo1" then
|
||||
|
||||
local inv = player:get_inventory() or nil
|
||||
|
||||
if not inv then
|
||||
print ("NO INVENTORY FOUND")
|
||||
return
|
||||
end
|
||||
|
||||
formspec = formspec
|
||||
|
||||
.. "image_button_exit[1,0.5;1,1;stairs.png;stairs;]"
|
||||
.. "tooltip[stairs;Stair]"
|
||||
|
||||
.. "image_button_exit[2,0.5;1,1;stairsleft.png;stairsleft;]"
|
||||
.. "tooltip[stairsleft;Stair Left]"
|
||||
|
||||
.. "image_button_exit[3,0.5;1,1;stairsright.png;stairsright;]"
|
||||
.. "tooltip[stairsright;Stair Right]"
|
||||
|
||||
.. "image_button_exit[4,0.5;1,1;slabs.png;slabs;]"
|
||||
.. "tooltip[slabs;Slab]"
|
||||
|
||||
|
||||
.. "image_button[0,6.5;1,1;gauche.png;nodes;]"
|
||||
.. "tooltip[nodes; Normal Nodes]"
|
||||
|
||||
.. "image_button_exit[1,6.5;1,1;rotate.png;rotate;]"
|
||||
.. "tooltip[rotate;Rotate]"
|
||||
|
||||
.. "image_button_exit[2,6.5;1,1;nones.png;none;]"
|
||||
.. "tooltip[none;None]"
|
||||
|
||||
.. ""
|
||||
|
||||
end
|
||||
|
||||
if page == "animals" then
|
||||
|
||||
local inv = player:get_inventory() or nil
|
||||
|
@ -397,6 +444,9 @@ if page == "furnitures" then
|
|||
.. "image_button_exit[7,0.5;1,1;carts_rail_straight_pwr.png;rails;]"
|
||||
.. "tooltip[rails;Rail]"
|
||||
|
||||
.. "image_button_exit[0,2.5;1,1;bus.png;bus;]"
|
||||
.. "tooltip[bus;Bus]"
|
||||
|
||||
.. "image_button[0,6.5;1,1;gauche.png;main;]"
|
||||
.. "tooltip[main;Back to Menu]"
|
||||
|
||||
|
@ -732,6 +782,22 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
return
|
||||
end
|
||||
|
||||
if fields.nodes2 then
|
||||
|
||||
inventory_plus.set_inventory_formspec(player,
|
||||
inventory_plus.get_formspec(player, "nodes2"))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if fields.nodesnocombo1 then
|
||||
|
||||
inventory_plus.set_inventory_formspec(player,
|
||||
inventory_plus.get_formspec(player, "nodesnocombo1"))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if fields.lettermenu then
|
||||
|
||||
inventory_plus.set_inventory_formspec(player,
|
||||
|
@ -764,14 +830,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
return
|
||||
end
|
||||
|
||||
if fields.nodes2 then
|
||||
|
||||
inventory_plus.set_inventory_formspec(player,
|
||||
inventory_plus.get_formspec(player, "nodes2"))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if fields.furnitures then
|
||||
|
||||
inventory_plus.set_inventory_formspec(player,
|
||||
|
|
After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.4 KiB |
|
@ -124,6 +124,27 @@ end
|
|||
end
|
||||
)
|
||||
|
||||
-- Bus
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = player:get_player_name()
|
||||
if fields.bus then --main page
|
||||
|
||||
player:get_inventory():set_list("main", {})
|
||||
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbuswhite')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbusblack')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbusred')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbusorange')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbusyellow')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbuspink')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbusgreen')
|
||||
player:get_inventory():add_item('main', 'driftbus:driftbusblue')
|
||||
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
-- Cars
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
|
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,51 @@
|
|||
minetest.register_on_joinplayer(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.setting_set("time", 12000)
|
||||
end)
|
||||
|
||||
minetest.register_on_shutdown(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.setting_set("time", 12000)
|
||||
end)
|
||||
|
||||
--Version 0.2
|
||||
|
||||
pos = {x=0, y=0, z=0}
|
||||
|
||||
--The skybox for space, feel free to change it to however you like.
|
||||
|
||||
local skybox = {
|
||||
"sky.png",
|
||||
"sky.png",
|
||||
"sky_1.png",
|
||||
"sky.png",
|
||||
"sky.png",
|
||||
"sky.png",
|
||||
}
|
||||
|
||||
|
||||
local time = 0
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
time = time + dtime
|
||||
if time > 1 then for _, player in ipairs(minetest.get_connected_players()) do
|
||||
time = 0
|
||||
|
||||
local name = player:get_player_name()
|
||||
local pos = player:getpos()
|
||||
|
||||
-- 9,807 m/s²
|
||||
|
||||
player:set_physics_override(1, 1, 1) -- speed, jump, gravity [default]
|
||||
player:set_sky({}, "skybox", skybox) -- Sets skybox, in this case it sets the skybox to it's default setting if and only if the player's Y value is less than the value of space.
|
||||
|
||||
end end end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
|
||||
local name = player:get_player_name()
|
||||
|
||||
if name then
|
||||
player:set_sky({}, "skybox", skybox)
|
||||
|
||||
end end)
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 328 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 8.1 KiB |
|
@ -0,0 +1,50 @@
|
|||
minetest.register_on_joinplayer(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.setting_set("time", 12000)
|
||||
end)
|
||||
|
||||
minetest.register_on_shutdown(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.setting_set("time", 12000)
|
||||
end)
|
||||
|
||||
--Version 0.2
|
||||
|
||||
pos = {x=0, y=0, z=0}
|
||||
|
||||
--The skybox for space, feel free to change it to however you like.
|
||||
|
||||
local skybox = {
|
||||
"space.png",
|
||||
"space.png",
|
||||
"space.png",
|
||||
"space.png",
|
||||
"space.png",
|
||||
"space.png",
|
||||
}
|
||||
|
||||
local time = 0
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
time = time + dtime
|
||||
if time > 1 then for _, player in ipairs(minetest.get_connected_players()) do
|
||||
time = 0
|
||||
|
||||
local name = player:get_player_name()
|
||||
local pos = player:getpos()
|
||||
|
||||
-- 3,711 m/s²
|
||||
|
||||
player:set_physics_override(1, 1, 0.3784031814) -- speed, jump, gravity [default]
|
||||
player:set_sky({}, "skybox", skybox) -- Sets skybox, in this case it sets the skybox to it's default setting if and only if the player's Y value is less than the value of space.
|
||||
|
||||
end end end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
|
||||
local name = player:get_player_name()
|
||||
|
||||
if name then
|
||||
player:set_sky({}, "skybox", skybox)
|
||||
|
||||
end end)
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 328 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 8.1 KiB |
|
@ -0,0 +1,51 @@
|
|||
minetest.register_on_joinplayer(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.setting_set("time", 12000)
|
||||
end)
|
||||
|
||||
minetest.register_on_shutdown(function(player)
|
||||
minetest.setting_set("time_speed", 0)
|
||||
minetest.setting_set("time", 12000)
|
||||
end)
|
||||
|
||||
--Version 0.2
|
||||
|
||||
pos = {x=0, y=0, z=0}
|
||||
|
||||
--The skybox for space, feel free to change it to however you like.
|
||||
|
||||
local skybox = {
|
||||
"space.png",
|
||||
"space.png",
|
||||
"space_1.png",
|
||||
"space.png",
|
||||
"space.png",
|
||||
"space.png",
|
||||
}
|
||||
|
||||
|
||||
local time = 0
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
time = time + dtime
|
||||
if time > 1 then for _, player in ipairs(minetest.get_connected_players()) do
|
||||
time = 0
|
||||
|
||||
local name = player:get_player_name()
|
||||
local pos = player:getpos()
|
||||
|
||||
-- 1,620 m/s²
|
||||
|
||||
player:set_physics_override(1, 1, 0.16518813092) -- speed, jump, gravity [default]
|
||||
player:set_sky({}, "skybox", skybox) -- Sets skybox, in this case it sets the skybox to it's default setting if and only if the player's Y value is less than the value of space.
|
||||
|
||||
end end end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
|
||||
local name = player:get_player_name()
|
||||
|
||||
if name then
|
||||
player:set_sky({}, "skybox", skybox)
|
||||
|
||||
end end)
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 328 KiB |
After Width: | Height: | Size: 9.8 KiB |