Add and remove mods
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "mods/throwing"]
|
||||||
|
path = mods/throwing
|
||||||
|
url = https://github.com/PilzAdam/throwing
|
|
@ -1,16 +0,0 @@
|
||||||
Minetest 0.4 mod: boats
|
|
||||||
=======================
|
|
||||||
by PilzAdam, slightly modified for NeXt
|
|
||||||
|
|
||||||
License of source code:
|
|
||||||
-----------------------
|
|
||||||
WTFPL
|
|
||||||
|
|
||||||
License of media (textures and sounds):
|
|
||||||
---------------------------------------
|
|
||||||
WTFPL
|
|
||||||
|
|
||||||
Authors of media files:
|
|
||||||
-----------------------
|
|
||||||
textures: Zeg9
|
|
||||||
model: thetoon and Zeg9, modified by PavelS(SokolovPavel)
|
|
|
@ -1 +0,0 @@
|
||||||
default
|
|
|
@ -1,217 +0,0 @@
|
||||||
|
|
||||||
--
|
|
||||||
-- Helper functions
|
|
||||||
--
|
|
||||||
|
|
||||||
local function is_water(pos)
|
|
||||||
local nn = minetest.get_node(pos).name
|
|
||||||
return minetest.get_item_group(nn, "water") ~= 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_sign(i)
|
|
||||||
if i == 0 then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return i / math.abs(i)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_velocity(v, yaw, y)
|
|
||||||
local x = -math.sin(yaw) * v
|
|
||||||
local z = math.cos(yaw) * v
|
|
||||||
return {x = x, y = y, z = z}
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_v(v)
|
|
||||||
return math.sqrt(v.x ^ 2 + v.z ^ 2)
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Boat entity
|
|
||||||
--
|
|
||||||
|
|
||||||
local boat = {
|
|
||||||
physical = true,
|
|
||||||
collisionbox = {-0.5, -0.4, -0.5, 0.5, 0.3, 0.5},
|
|
||||||
visual = "mesh",
|
|
||||||
mesh = "boat.x",
|
|
||||||
textures = {"default_wood.png"},
|
|
||||||
|
|
||||||
driver = nil,
|
|
||||||
v = 0,
|
|
||||||
last_v = 0,
|
|
||||||
removed = false
|
|
||||||
}
|
|
||||||
|
|
||||||
function boat.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 clicker == self.driver then
|
|
||||||
self.driver = nil
|
|
||||||
clicker:set_detach()
|
|
||||||
default.player_attached[name] = false
|
|
||||||
default.player_set_animation(clicker, "stand" , 30)
|
|
||||||
elseif not self.driver then
|
|
||||||
self.driver = clicker
|
|
||||||
clicker:set_attach(self.object, "", {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0})
|
|
||||||
default.player_attached[name] = true
|
|
||||||
minetest.after(0.2, function()
|
|
||||||
default.player_set_animation(clicker, "sit" , 30)
|
|
||||||
end)
|
|
||||||
self.object:setyaw(clicker:get_look_yaw() - math.pi / 2)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function boat.on_activate(self, staticdata, dtime_s)
|
|
||||||
self.object:set_armor_groups({immortal = 1})
|
|
||||||
if staticdata then
|
|
||||||
self.v = tonumber(staticdata)
|
|
||||||
end
|
|
||||||
self.last_v = self.v
|
|
||||||
end
|
|
||||||
|
|
||||||
function boat.get_staticdata(self)
|
|
||||||
return tostring(self.v)
|
|
||||||
end
|
|
||||||
|
|
||||||
function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, direction)
|
|
||||||
if not puncher or not puncher:is_player() or self.removed then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if self.driver and puncher == self.driver then
|
|
||||||
self.driver = nil
|
|
||||||
puncher:set_detach()
|
|
||||||
default.player_attached[puncher:get_player_name()] = false
|
|
||||||
end
|
|
||||||
if not self.driver then
|
|
||||||
self.removed = true
|
|
||||||
-- delay remove to ensure player is detached
|
|
||||||
minetest.after(0.1, function()
|
|
||||||
self.object:remove()
|
|
||||||
end)
|
|
||||||
if not minetest.setting_getbool("creative_mode") then
|
|
||||||
puncher:get_inventory():add_item("main", "boats:boat")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function boat.on_step(self, dtime)
|
|
||||||
self.v = get_v(self.object:getvelocity()) * get_sign(self.v)
|
|
||||||
if self.driver then
|
|
||||||
local ctrl = self.driver:get_player_control()
|
|
||||||
local yaw = self.object:getyaw()
|
|
||||||
if ctrl.up then
|
|
||||||
self.v = self.v + 0.1
|
|
||||||
elseif ctrl.down then
|
|
||||||
self.v = self.v - 0.1
|
|
||||||
end
|
|
||||||
if ctrl.left then
|
|
||||||
if self.v < 0 then
|
|
||||||
self.object:setyaw(yaw - (1 + dtime) * 0.03)
|
|
||||||
else
|
|
||||||
self.object:setyaw(yaw + (1 + dtime) * 0.03)
|
|
||||||
end
|
|
||||||
elseif ctrl.right then
|
|
||||||
if self.v < 0 then
|
|
||||||
self.object:setyaw(yaw + (1 + dtime) * 0.03)
|
|
||||||
else
|
|
||||||
self.object:setyaw(yaw - (1 + dtime) * 0.03)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local velo = self.object:getvelocity()
|
|
||||||
if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
|
||||||
self.object:setpos(self.object:getpos())
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local s = get_sign(self.v)
|
|
||||||
self.v = self.v - 0.02 * s
|
|
||||||
if s ~= get_sign(self.v) then
|
|
||||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
|
||||||
self.v = 0
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if math.abs(self.v) > 4.5 then
|
|
||||||
self.v = 4.5 * get_sign(self.v)
|
|
||||||
end
|
|
||||||
|
|
||||||
local p = self.object:getpos()
|
|
||||||
p.y = p.y - 0.5
|
|
||||||
local new_velo = {x = 0, y = 0, z = 0}
|
|
||||||
local new_acce = {x = 0, y = 0, z = 0}
|
|
||||||
if not is_water(p) then
|
|
||||||
local nodedef = minetest.registered_nodes[minetest.get_node(p).name]
|
|
||||||
if (not nodedef) or nodedef.walkable then
|
|
||||||
self.v = 0
|
|
||||||
new_acce = {x = 0, y = 1, z = 0}
|
|
||||||
else
|
|
||||||
new_acce = {x = 0, y = -9.8, z = 0}
|
|
||||||
end
|
|
||||||
new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)
|
|
||||||
self.object:setpos(self.object:getpos())
|
|
||||||
else
|
|
||||||
p.y = p.y + 1
|
|
||||||
if is_water(p) then
|
|
||||||
local y = self.object:getvelocity().y
|
|
||||||
if y >= 4.5 then
|
|
||||||
y = 4.5
|
|
||||||
elseif y < 0 then
|
|
||||||
new_acce = {x = 0, y = 20, z = 0}
|
|
||||||
else
|
|
||||||
new_acce = {x = 0, y = 5, z = 0}
|
|
||||||
end
|
|
||||||
new_velo = get_velocity(self.v, self.object:getyaw(), y)
|
|
||||||
self.object:setpos(self.object:getpos())
|
|
||||||
else
|
|
||||||
new_acce = {x = 0, y = 0, z = 0}
|
|
||||||
if math.abs(self.object:getvelocity().y) < 1 then
|
|
||||||
local pos = self.object:getpos()
|
|
||||||
pos.y = math.floor(pos.y) + 0.5
|
|
||||||
self.object:setpos(pos)
|
|
||||||
new_velo = get_velocity(self.v, self.object:getyaw(), 0)
|
|
||||||
else
|
|
||||||
new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)
|
|
||||||
self.object:setpos(self.object:getpos())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
self.object:setvelocity(new_velo)
|
|
||||||
self.object:setacceleration(new_acce)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_entity("boats:boat", boat)
|
|
||||||
|
|
||||||
minetest.register_craftitem("boats:boat", {
|
|
||||||
description = "Boat",
|
|
||||||
inventory_image = "boat_inventory.png",
|
|
||||||
wield_image = "boat_wield.png",
|
|
||||||
wield_scale = {x = 2, y = 2, z = 1},
|
|
||||||
liquids_pointable = true,
|
|
||||||
|
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
|
||||||
if pointed_thing.type ~= "node" then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if not is_water(pointed_thing.under) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
pointed_thing.under.y = pointed_thing.under.y + 0.5
|
|
||||||
minetest.add_entity(pointed_thing.under, "boats:boat")
|
|
||||||
if not minetest.setting_getbool("creative_mode") then
|
|
||||||
itemstack:take_item()
|
|
||||||
end
|
|
||||||
return itemstack
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "boats:boat",
|
|
||||||
recipe = {
|
|
||||||
{"", "", "" },
|
|
||||||
{"group:wood", "", "group:wood"},
|
|
||||||
{"group:wood", "group:wood", "group:wood"},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
11110
mods/boats/models/boat.x
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 847 B |
|
@ -1,17 +0,0 @@
|
||||||
Minetest 0.4 mod: bones
|
|
||||||
=======================
|
|
||||||
|
|
||||||
License of source code:
|
|
||||||
-----------------------
|
|
||||||
Copyright (C) 2012 PilzAdam
|
|
||||||
|
|
||||||
WTFPL
|
|
||||||
|
|
||||||
License of media (textures and sounds)
|
|
||||||
--------------------------------------
|
|
||||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
|
||||||
http://creativecommons.org/licenses/by-sa/3.0/
|
|
||||||
|
|
||||||
Authors of media files
|
|
||||||
----------------------
|
|
||||||
Bad_Command_
|
|
|
@ -1 +0,0 @@
|
||||||
default
|
|
|
@ -1,170 +0,0 @@
|
||||||
-- Minetest 0.4 mod: bones
|
|
||||||
-- See README.txt for licensing and other information.
|
|
||||||
|
|
||||||
local function is_owner(pos, name)
|
|
||||||
local owner = minetest.get_meta(pos):get_string("owner")
|
|
||||||
if owner == "" or owner == name then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node("bones:bones", {
|
|
||||||
description = "Bones",
|
|
||||||
tiles = {
|
|
||||||
"bones_top.png",
|
|
||||||
"bones_bottom.png",
|
|
||||||
"bones_side.png",
|
|
||||||
"bones_side.png",
|
|
||||||
"bones_rear.png",
|
|
||||||
"bones_front.png"
|
|
||||||
},
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
groups = {dig_immediate=2},
|
|
||||||
sounds = default.node_sound_dirt_defaults({
|
|
||||||
footstep = {name="default_gravel_footstep", gain=0.5},
|
|
||||||
dug = {name="default_gravel_footstep", gain=1.0},
|
|
||||||
}),
|
|
||||||
|
|
||||||
can_dig = function(pos, player)
|
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
|
||||||
return is_owner(pos, player:get_player_name()) and inv:is_empty("main")
|
|
||||||
end,
|
|
||||||
|
|
||||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
||||||
if is_owner(pos, player:get_player_name()) then
|
|
||||||
return count
|
|
||||||
end
|
|
||||||
return 0
|
|
||||||
end,
|
|
||||||
|
|
||||||
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
||||||
return 0
|
|
||||||
end,
|
|
||||||
|
|
||||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
||||||
if is_owner(pos, player:get_player_name()) then
|
|
||||||
return stack:get_count()
|
|
||||||
end
|
|
||||||
return 0
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
if meta:get_inventory():is_empty("main") then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_punch = function(pos, node, player)
|
|
||||||
if(not is_owner(pos, player:get_player_name())) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
|
||||||
local player_inv = player:get_inventory()
|
|
||||||
local has_space = true
|
|
||||||
|
|
||||||
for i=1,inv:get_size("main") do
|
|
||||||
local stk = inv:get_stack("main", i)
|
|
||||||
if player_inv:room_for_item("main", stk) then
|
|
||||||
inv:set_stack("main", i, nil)
|
|
||||||
player_inv:add_item("main", stk)
|
|
||||||
else
|
|
||||||
has_space = false
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- remove bones if player emptied them
|
|
||||||
if has_space then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
on_timer = function(pos, elapsed)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local time = meta:get_int("time")+elapsed
|
|
||||||
local publish = 1200
|
|
||||||
if tonumber(minetest.setting_get("share_bones_time")) then
|
|
||||||
publish = tonumber(minetest.setting_get("share_bones_time"))
|
|
||||||
end
|
|
||||||
if publish == 0 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if time >= publish then
|
|
||||||
meta:set_string("infotext", meta:get_string("owner").."'s old bones")
|
|
||||||
meta:set_string("owner", "")
|
|
||||||
else
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_on_dieplayer(function(player)
|
|
||||||
if minetest.setting_getbool("creative_mode") then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local player_inv = player:get_inventory()
|
|
||||||
if player_inv:is_empty("main") and
|
|
||||||
player_inv:is_empty("craft") then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local pos = player:getpos()
|
|
||||||
pos.x = math.floor(pos.x+0.5)
|
|
||||||
pos.y = math.floor(pos.y+0.5)
|
|
||||||
pos.z = math.floor(pos.z+0.5)
|
|
||||||
local param2 = minetest.dir_to_facedir(player:get_look_dir())
|
|
||||||
local player_name = player:get_player_name()
|
|
||||||
local player_inv = player:get_inventory()
|
|
||||||
|
|
||||||
local nn = minetest.get_node(pos).name
|
|
||||||
if minetest.registered_nodes[nn].can_dig and
|
|
||||||
not minetest.registered_nodes[nn].can_dig(pos, player) then
|
|
||||||
|
|
||||||
-- drop items instead of delete
|
|
||||||
for i=1,player_inv:get_size("main") do
|
|
||||||
minetest.add_item(pos, player_inv:get_stack("main", i))
|
|
||||||
end
|
|
||||||
for i=1,player_inv:get_size("craft") do
|
|
||||||
minetest.add_item(pos, player_inv:get_stack("craft", i))
|
|
||||||
end
|
|
||||||
-- empty lists main and craft
|
|
||||||
player_inv:set_list("main", {})
|
|
||||||
player_inv:set_list("craft", {})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.dig_node(pos)
|
|
||||||
minetest.add_node(pos, {name="bones:bones", param2=param2})
|
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local inv = meta:get_inventory()
|
|
||||||
inv:set_size("main", 8*4)
|
|
||||||
inv:set_list("main", player_inv:get_list("main"))
|
|
||||||
|
|
||||||
for i=1,player_inv:get_size("craft") do
|
|
||||||
local stack = player_inv:get_stack("craft", i)
|
|
||||||
if inv:room_for_item("main", stack) then
|
|
||||||
inv:add_item("main", stack)
|
|
||||||
else
|
|
||||||
--drop if no space left
|
|
||||||
minetest.add_item(pos, stack)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
player_inv:set_list("main", {})
|
|
||||||
player_inv:set_list("craft", {})
|
|
||||||
|
|
||||||
meta:set_string("formspec", "size[8,9;]"..
|
|
||||||
"list[current_name;main;0,0;8,4;]"..
|
|
||||||
"list[current_player;main;0,5;8,4;]")
|
|
||||||
meta:set_string("infotext", player_name.."'s fresh bones")
|
|
||||||
meta:set_string("owner", player_name)
|
|
||||||
meta:set_int("time", 0)
|
|
||||||
|
|
||||||
local timer = minetest.get_node_timer(pos)
|
|
||||||
timer:start(10)
|
|
||||||
end)
|
|
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 187 B |
Before Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 182 B |
|
@ -20,7 +20,7 @@ director.spawn_list = {
|
||||||
intensity_max = 0.5,
|
intensity_max = 0.5,
|
||||||
group_min = 4,
|
group_min = 4,
|
||||||
group_max = 12,
|
group_max = 12,
|
||||||
probability = 0.5,
|
probability = 0.2,
|
||||||
spawn_time = 29.0,
|
spawn_time = 29.0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -40,7 +40,7 @@ director.spawn_list = {
|
||||||
intensity_max = 0.5,
|
intensity_max = 0.5,
|
||||||
group_min = 1,
|
group_min = 1,
|
||||||
group_max = 1,
|
group_max = 1,
|
||||||
probability = 0.4,
|
probability = 0.1,
|
||||||
spawn_time = 13.0,
|
spawn_time = 13.0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,4 +14,5 @@ dofile2("mob.lua")
|
||||||
dofile2("mobs/unggoy.lua")
|
dofile2("mobs/unggoy.lua")
|
||||||
dofile2("mobs/sarangay.lua")
|
dofile2("mobs/sarangay.lua")
|
||||||
|
|
||||||
dofile2("director.lua")
|
dofile2("director.lua")
|
||||||
|
dofile2("initial_stuff.lua")
|
|
@ -50,12 +50,12 @@ defense.mobs.register_mob("defense:sarangay", {
|
||||||
|
|
||||||
-- Break obstacles
|
-- Break obstacles
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
pos.y = pos.y + 1.5
|
pos.y = pos.y + 2.5
|
||||||
local v = self.object:getvelocity()
|
local v = self.object:getvelocity()
|
||||||
v.y = 0
|
v.y = 0
|
||||||
pos = vector.add(pos, vector.multiply(vector.normalize(v), 2.5))
|
pos = vector.add(pos, vector.multiply(vector.normalize(v), 1.5))
|
||||||
local blocks = self:crash_blocks(pos, 2)
|
local blocks = self:crash_blocks(pos, 4)
|
||||||
local entities = self:crash_entities(pos, 2)
|
local entities = self:crash_entities(pos, 3)
|
||||||
self.charge_power = self.charge_power - blocks * 0.1 - entities * 0.01
|
self.charge_power = self.charge_power - blocks * 0.1 - entities * 0.01
|
||||||
|
|
||||||
if self.charge_power < 0 or (self.charge_power > 1 and vector.length(self.object:getvelocity()) < 1) then
|
if self.charge_power < 0 or (self.charge_power > 1 and vector.length(self.object:getvelocity()) < 1) then
|
||||||
|
@ -124,16 +124,16 @@ defense.mobs.register_mob("defense:sarangay", {
|
||||||
local myv = self.object:getvelocity()
|
local myv = self.object:getvelocity()
|
||||||
for _,o in pairs(minetest.get_objects_inside_radius(pos, radius)) do
|
for _,o in pairs(minetest.get_objects_inside_radius(pos, radius)) do
|
||||||
if o ~= self.object then
|
if o ~= self.object then
|
||||||
local dir = vector.direction(self.object:getpos(), o:getpos())
|
o:set_hp(o:get_hp() - 1)
|
||||||
o:set_hp(o:get_hp() - 3)
|
|
||||||
|
|
||||||
local e = o:get_luaentity()
|
local e = o:get_luaentity()
|
||||||
if e then
|
if e then
|
||||||
local m = e.mass or 0.1
|
local m = e.mass or 0.1
|
||||||
local v = vector.add(o:getvelocity(), vector.multiply(myv, 1/m))
|
local v = vector.add(o:getvelocity(), vector.multiply(myv, 1/m))
|
||||||
if v then
|
if v then
|
||||||
|
local dir = vector.direction(self.object:getpos(), o:getpos())
|
||||||
dir.y = dir.y + 1
|
dir.y = dir.y + 1
|
||||||
o:setvelocity(vector.add(v, vector.multiply(dir, 6/m)))
|
o:setvelocity(vector.add(v, vector.multiply(dir, 3/m)))
|
||||||
end
|
end
|
||||||
|
|
||||||
weight_count = weight_count + m
|
weight_count = weight_count + m
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
Minetest 0.4 mod: dye
|
|
||||||
======================
|
|
||||||
|
|
||||||
See init.lua for documentation.
|
|
||||||
|
|
||||||
License of source code and media files:
|
|
||||||
---------------------------------------
|
|
||||||
Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55@gmail.com>
|
|
||||||
|
|
||||||
This program is free software. It comes without any warranty, to
|
|
||||||
the extent permitted by applicable law. You can redistribute it
|
|
||||||
and/or modify it under the terms of the Do What The Fuck You Want
|
|
||||||
To Public License, Version 2, as published by Sam Hocevar. See
|
|
||||||
http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
-- minetest/dye/init.lua
|
|
||||||
|
|
||||||
-- Other mods can use these for looping through available colors
|
|
||||||
dye = {}
|
|
||||||
dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"}
|
|
||||||
dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"}
|
|
||||||
|
|
||||||
-- Local stuff
|
|
||||||
local dyelocal = {}
|
|
||||||
|
|
||||||
-- This collection of colors is partly a historic thing, partly something else.
|
|
||||||
dyelocal.dyes = {
|
|
||||||
{"white", "White dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}},
|
|
||||||
{"grey", "Grey dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}},
|
|
||||||
{"dark_grey", "Dark grey dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}},
|
|
||||||
{"black", "Black dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}},
|
|
||||||
{"violet", "Violet dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}},
|
|
||||||
{"blue", "Blue dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}},
|
|
||||||
{"cyan", "Cyan dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}},
|
|
||||||
{"dark_green", "Dark green dye",{dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}},
|
|
||||||
{"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}},
|
|
||||||
{"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}},
|
|
||||||
{"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}},
|
|
||||||
{"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}},
|
|
||||||
{"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}},
|
|
||||||
{"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}},
|
|
||||||
{"pink", "Pink dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Define items
|
|
||||||
for _, row in ipairs(dyelocal.dyes) do
|
|
||||||
local name = row[1]
|
|
||||||
local description = row[2]
|
|
||||||
local groups = row[3]
|
|
||||||
local item_name = "dye:"..name
|
|
||||||
local item_image = "dye_"..name..".png"
|
|
||||||
minetest.register_craftitem(item_name, {
|
|
||||||
inventory_image = item_image,
|
|
||||||
description = description,
|
|
||||||
groups = groups
|
|
||||||
})
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "shapeless",
|
|
||||||
output = item_name.." 4",
|
|
||||||
recipe = {"group:flower,color_"..name},
|
|
||||||
})
|
|
||||||
end
|
|
||||||
-- manually add coal->black dye
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "shapeless",
|
|
||||||
output = "dye:black 4",
|
|
||||||
recipe = {"group:coal"},
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Mix recipes
|
|
||||||
-- Just mix everything to everything somehow sanely
|
|
||||||
|
|
||||||
dyelocal.mixbases = {"magenta", "red", "orange", "brown", "yellow", "green", "dark_green", "cyan", "blue", "violet", "black", "dark_grey", "grey", "white"}
|
|
||||||
|
|
||||||
dyelocal.mixes = {
|
|
||||||
-- magenta, red, orange, brown, yellow, green, dark_green, cyan, blue, violet, black, dark_grey, grey, white
|
|
||||||
white = {"pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet", "grey", "grey", "white", "white"},
|
|
||||||
grey = {"pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "pink", "dark_grey","grey", "grey"},
|
|
||||||
dark_grey={"brown","brown", "brown", "brown", "brown","dark_green","dark_green","blue","blue","violet","black", "black"},
|
|
||||||
black = {"black", "black", "black", "black", "black", "black", "black", "black", "black", "black", "black"},
|
|
||||||
violet= {"magenta","magenta","red", "brown", "red", "cyan", "brown", "blue", "violet","violet"},
|
|
||||||
blue = {"violet", "magenta","brown","brown","dark_green","cyan","cyan", "cyan", "blue"},
|
|
||||||
cyan = {"blue","brown","dark_green","dark_grey","green","cyan","dark_green","cyan"},
|
|
||||||
dark_green={"brown","brown","brown", "brown", "green", "green", "dark_green"},
|
|
||||||
green = {"brown", "yellow","yellow","dark_green","green","green"},
|
|
||||||
yellow= {"red", "orange", "yellow","orange", "yellow"},
|
|
||||||
brown = {"brown", "brown","orange", "brown"},
|
|
||||||
orange= {"red", "orange","orange"},
|
|
||||||
red = {"magenta","red"},
|
|
||||||
magenta={"magenta"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for one,results in pairs(dyelocal.mixes) do
|
|
||||||
for i,result in ipairs(results) do
|
|
||||||
local another = dyelocal.mixbases[i]
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "shapeless",
|
|
||||||
output = 'dye:'..result..' 2',
|
|
||||||
recipe = {'dye:'..one, 'dye:'..another},
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 161 B |
Before Width: | Height: | Size: 164 B |
Before Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 169 B |
|
@ -1,2 +0,0 @@
|
||||||
default
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
minetest.register_on_newplayer(function(player)
|
|
||||||
--print("on_newplayer")
|
|
||||||
if minetest.setting_getbool("give_initial_stuff") then
|
|
||||||
minetest.log("action", "Giving initial stuff to player "..player:get_player_name())
|
|
||||||
player:get_inventory():add_item('main', 'default:pick_steel')
|
|
||||||
player:get_inventory():add_item('main', 'default:torch 99')
|
|
||||||
player:get_inventory():add_item('main', 'default:axe_steel')
|
|
||||||
player:get_inventory():add_item('main', 'default:shovel_steel')
|
|
||||||
player:get_inventory():add_item('main', 'default:cobble 99')
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 90bcf4362e73fa00c3681c6ea45c4b5e58a9d004
|
|
@ -1,36 +0,0 @@
|
||||||
=== TNT mod for Minetest ===
|
|
||||||
by PilzAdam and ShadowNinja
|
|
||||||
|
|
||||||
Introduction:
|
|
||||||
This mod adds TNT to Minetest. TNT is a tool to help the player
|
|
||||||
in mining.
|
|
||||||
|
|
||||||
How to use the mod:
|
|
||||||
Craft gunpowder by placing coal and gravel in the crafting area. The
|
|
||||||
gunpowder can be used to craft TNT or as fuze for TNT. To craft TNT
|
|
||||||
surround gunpowder with 4 wood in a + shape.
|
|
||||||
There are different ways to blow up TNT:
|
|
||||||
1. Hit it with a torch.
|
|
||||||
2. Hit a gunpowder fuze that leads to a TNT block with a torch.
|
|
||||||
3. Activate it with mesecons (fastest way)
|
|
||||||
Be aware of the damage radius of 7 blocks!
|
|
||||||
|
|
||||||
License:
|
|
||||||
WTFPL (see below)
|
|
||||||
|
|
||||||
See also:
|
|
||||||
http://minetest.net/
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
Version 2, December 2004
|
|
||||||
|
|
||||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim or modified
|
|
||||||
copies of this license document, and changing it is allowed as long
|
|
||||||
as the name is changed.
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
|
|
@ -1,3 +0,0 @@
|
||||||
default
|
|
||||||
fire
|
|
||||||
|
|
|
@ -1,356 +0,0 @@
|
||||||
|
|
||||||
-- Default to enabled in singleplayer and disabled in multiplayer
|
|
||||||
local singleplayer = minetest.is_singleplayer()
|
|
||||||
local setting = minetest.setting_getbool("enable_tnt")
|
|
||||||
if (not singleplayer and setting ~= true) or
|
|
||||||
(singleplayer and setting == false) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- loss probabilities array (one in X will be lost)
|
|
||||||
local loss_prob = {}
|
|
||||||
|
|
||||||
loss_prob["default:cobble"] = 3
|
|
||||||
loss_prob["default:dirt"] = 4
|
|
||||||
|
|
||||||
local radius = tonumber(minetest.setting_get("tnt_radius") or 3)
|
|
||||||
|
|
||||||
-- Fill a list with data for content IDs, after all nodes are registered
|
|
||||||
local cid_data = {}
|
|
||||||
minetest.after(0, function()
|
|
||||||
for name, def in pairs(minetest.registered_nodes) do
|
|
||||||
cid_data[minetest.get_content_id(name)] = {
|
|
||||||
name = name,
|
|
||||||
drops = def.drops,
|
|
||||||
flammable = def.groups.flammable,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local function rand_pos(center, pos, radius)
|
|
||||||
pos.x = center.x + math.random(-radius, radius)
|
|
||||||
pos.z = center.z + math.random(-radius, radius)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function eject_drops(drops, pos, radius)
|
|
||||||
local drop_pos = vector.new(pos)
|
|
||||||
for _, item in pairs(drops) do
|
|
||||||
local count = item:get_count()
|
|
||||||
local max = item:get_stack_max()
|
|
||||||
if count > max then
|
|
||||||
item:set_count(max)
|
|
||||||
end
|
|
||||||
while count > 0 do
|
|
||||||
if count < max then
|
|
||||||
item:set_count(count)
|
|
||||||
end
|
|
||||||
rand_pos(pos, drop_pos, radius)
|
|
||||||
local obj = minetest.add_item(drop_pos, item)
|
|
||||||
if obj then
|
|
||||||
obj:get_luaentity().collect = true
|
|
||||||
obj:setacceleration({x=0, y=-10, z=0})
|
|
||||||
obj:setvelocity({x=math.random(-3, 3), y=10,
|
|
||||||
z=math.random(-3, 3)})
|
|
||||||
end
|
|
||||||
count = count - max
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_drop(drops, item)
|
|
||||||
item = ItemStack(item)
|
|
||||||
local name = item:get_name()
|
|
||||||
if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local drop = drops[name]
|
|
||||||
if drop == nil then
|
|
||||||
drops[name] = item
|
|
||||||
else
|
|
||||||
drop:set_count(drop:get_count() + item:get_count())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local fire_node = {name="fire:basic_flame"}
|
|
||||||
|
|
||||||
local function destroy(drops, pos, cid)
|
|
||||||
if minetest.is_protected(pos, "") then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local def = cid_data[cid]
|
|
||||||
if def and def.flammable then
|
|
||||||
minetest.set_node(pos, fire_node)
|
|
||||||
else
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
if def then
|
|
||||||
local node_drops = minetest.get_node_drops(def.name, "")
|
|
||||||
for _, item in ipairs(node_drops) do
|
|
||||||
add_drop(drops, item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function calc_velocity(pos1, pos2, old_vel, power)
|
|
||||||
local vel = vector.direction(pos1, pos2)
|
|
||||||
vel = vector.normalize(vel)
|
|
||||||
vel = vector.multiply(vel, power)
|
|
||||||
|
|
||||||
-- Divide by distance
|
|
||||||
local dist = vector.distance(pos1, pos2)
|
|
||||||
dist = math.max(dist, 1)
|
|
||||||
vel = vector.divide(vel, dist)
|
|
||||||
|
|
||||||
-- Add old velocity
|
|
||||||
vel = vector.add(vel, old_vel)
|
|
||||||
return vel
|
|
||||||
end
|
|
||||||
|
|
||||||
local function entity_physics(pos, radius)
|
|
||||||
-- Make the damage radius larger than the destruction radius
|
|
||||||
radius = radius * 2
|
|
||||||
local objs = minetest.get_objects_inside_radius(pos, radius)
|
|
||||||
for _, obj in pairs(objs) do
|
|
||||||
local obj_pos = obj:getpos()
|
|
||||||
local obj_vel = obj:getvelocity()
|
|
||||||
local dist = math.max(1, vector.distance(pos, obj_pos))
|
|
||||||
|
|
||||||
if obj_vel ~= nil then
|
|
||||||
obj:setvelocity(calc_velocity(pos, obj_pos,
|
|
||||||
obj_vel, radius * 10))
|
|
||||||
end
|
|
||||||
|
|
||||||
local damage = (4 / dist) * radius
|
|
||||||
obj:set_hp(obj:get_hp() - damage)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_effects(pos, radius)
|
|
||||||
minetest.add_particlespawner({
|
|
||||||
amount = 128,
|
|
||||||
time = 1,
|
|
||||||
minpos = vector.subtract(pos, radius / 2),
|
|
||||||
maxpos = vector.add(pos, radius / 2),
|
|
||||||
minvel = {x=-20, y=-20, z=-20},
|
|
||||||
maxvel = {x=20, y=20, z=20},
|
|
||||||
minacc = vector.new(),
|
|
||||||
maxacc = vector.new(),
|
|
||||||
minexptime = 1,
|
|
||||||
maxexptime = 3,
|
|
||||||
minsize = 8,
|
|
||||||
maxsize = 16,
|
|
||||||
texture = "tnt_smoke.png",
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
local function burn(pos)
|
|
||||||
local name = minetest.get_node(pos).name
|
|
||||||
if name == "tnt:tnt" then
|
|
||||||
minetest.sound_play("tnt_ignite", {pos=pos})
|
|
||||||
minetest.set_node(pos, {name="tnt:tnt_burning"})
|
|
||||||
minetest.get_node_timer(pos):start(1)
|
|
||||||
elseif name == "tnt:gunpowder" then
|
|
||||||
minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2})
|
|
||||||
minetest.set_node(pos, {name="tnt:gunpowder_burning"})
|
|
||||||
minetest.get_node_timer(pos):start(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function explode(pos, radius)
|
|
||||||
local pos = vector.round(pos)
|
|
||||||
local vm = VoxelManip()
|
|
||||||
local pr = PseudoRandom(os.time())
|
|
||||||
local p1 = vector.subtract(pos, radius)
|
|
||||||
local p2 = vector.add(pos, radius)
|
|
||||||
local minp, maxp = vm:read_from_map(p1, p2)
|
|
||||||
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
|
||||||
local data = vm:get_data()
|
|
||||||
|
|
||||||
local drops = {}
|
|
||||||
local p = {}
|
|
||||||
|
|
||||||
local c_air = minetest.get_content_id("air")
|
|
||||||
local c_tnt = minetest.get_content_id("tnt:tnt")
|
|
||||||
local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning")
|
|
||||||
local c_gunpowder = minetest.get_content_id("tnt:gunpowder")
|
|
||||||
local c_gunpowder_burning = minetest.get_content_id("tnt:gunpowder_burning")
|
|
||||||
local c_boom = minetest.get_content_id("tnt:boom")
|
|
||||||
local c_fire = minetest.get_content_id("fire:basic_flame")
|
|
||||||
|
|
||||||
for z = -radius, radius do
|
|
||||||
for y = -radius, radius do
|
|
||||||
local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z)
|
|
||||||
for x = -radius, radius do
|
|
||||||
if (x * x) + (y * y) + (z * z) <=
|
|
||||||
(radius * radius) + pr:next(-radius, radius) then
|
|
||||||
local cid = data[vi]
|
|
||||||
p.x = pos.x + x
|
|
||||||
p.y = pos.y + y
|
|
||||||
p.z = pos.z + z
|
|
||||||
if cid == c_tnt or cid == c_gunpowder then
|
|
||||||
burn(p)
|
|
||||||
elseif cid ~= c_tnt_burning and
|
|
||||||
cid ~= c_gunpowder_burning and
|
|
||||||
cid ~= c_air and
|
|
||||||
cid ~= c_fire and
|
|
||||||
cid ~= c_boom then
|
|
||||||
destroy(drops, p, cid)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
vi = vi + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return drops
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function boom(pos)
|
|
||||||
minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
|
|
||||||
minetest.set_node(pos, {name="tnt:boom"})
|
|
||||||
minetest.get_node_timer(pos):start(0.5)
|
|
||||||
|
|
||||||
local drops = explode(pos, radius)
|
|
||||||
entity_physics(pos, radius)
|
|
||||||
eject_drops(drops, pos, radius)
|
|
||||||
add_effects(pos, radius)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node("tnt:tnt", {
|
|
||||||
description = "TNT",
|
|
||||||
tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"},
|
|
||||||
groups = {dig_immediate=2, mesecon=2},
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
on_punch = function(pos, node, puncher)
|
|
||||||
if puncher:get_wielded_item():get_name() == "default:torch" then
|
|
||||||
minetest.sound_play("tnt_ignite", {pos=pos})
|
|
||||||
minetest.set_node(pos, {name="tnt:tnt_burning"})
|
|
||||||
minetest.get_node_timer(pos):start(4)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
mesecons = {effector = {action_on = boom}},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:tnt_burning", {
|
|
||||||
tiles = {
|
|
||||||
{
|
|
||||||
name = "tnt_top_burning_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tnt_bottom.png", "tnt_side.png"},
|
|
||||||
light_source = 5,
|
|
||||||
drop = "",
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
on_timer = boom,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:boom", {
|
|
||||||
drawtype = "plantlike",
|
|
||||||
tiles = {"tnt_boom.png"},
|
|
||||||
light_source = LIGHT_MAX,
|
|
||||||
walkable = false,
|
|
||||||
drop = "",
|
|
||||||
groups = {dig_immediate=3},
|
|
||||||
on_timer = function(pos, elapsed)
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:gunpowder", {
|
|
||||||
description = "Gun Powder",
|
|
||||||
drawtype = "raillike",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
tiles = {"tnt_gunpowder.png",},
|
|
||||||
inventory_image = "tnt_gunpowder_inventory.png",
|
|
||||||
wield_image = "tnt_gunpowder_inventory.png",
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
|
|
||||||
},
|
|
||||||
groups = {dig_immediate=2,attached_node=1},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
|
|
||||||
on_punch = function(pos, node, puncher)
|
|
||||||
if puncher:get_wielded_item():get_name() == "default:torch" then
|
|
||||||
burn(pos)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("tnt:gunpowder_burning", {
|
|
||||||
drawtype = "raillike",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
light_source = 5,
|
|
||||||
tiles = {{
|
|
||||||
name = "tnt_gunpowder_burning_animated.png",
|
|
||||||
animation = {
|
|
||||||
type = "vertical_frames",
|
|
||||||
aspect_w = 16,
|
|
||||||
aspect_h = 16,
|
|
||||||
length = 1,
|
|
||||||
}
|
|
||||||
}},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
|
|
||||||
},
|
|
||||||
drop = "",
|
|
||||||
groups = {dig_immediate=2,attached_node=1},
|
|
||||||
sounds = default.node_sound_leaves_defaults(),
|
|
||||||
on_timer = function(pos, elapsed)
|
|
||||||
for dx = -1, 1 do
|
|
||||||
for dz = -1, 1 do
|
|
||||||
for dy = -1, 1 do
|
|
||||||
if not (dx == 0 and dz == 0) then
|
|
||||||
burn({
|
|
||||||
x = pos.x + dx,
|
|
||||||
y = pos.y + dy,
|
|
||||||
z = pos.z + dz,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
nodenames = {"tnt:tnt", "tnt:gunpowder"},
|
|
||||||
neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = burn,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "tnt:gunpowder",
|
|
||||||
type = "shapeless",
|
|
||||||
recipe = {"default:coal_lump", "default:gravel"}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "tnt:tnt",
|
|
||||||
recipe = {
|
|
||||||
{"", "group:wood", ""},
|
|
||||||
{"group:wood", "tnt:gunpowder", "group:wood"},
|
|
||||||
{"", "group:wood", ""}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if minetest.setting_get("log_mods") then
|
|
||||||
minetest.debug("[TNT] Loaded!")
|
|
||||||
end
|
|
||||||
|
|
Before Width: | Height: | Size: 178 B |
Before Width: | Height: | Size: 99 B |
Before Width: | Height: | Size: 336 B |
Before Width: | Height: | Size: 344 B |
Before Width: | Height: | Size: 203 B |
Before Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 128 B |
Before Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 159 B |
Before Width: | Height: | Size: 238 B |
|
@ -1,45 +0,0 @@
|
||||||
Minetest 0.4 mod: vessels
|
|
||||||
==========================
|
|
||||||
|
|
||||||
Crafts
|
|
||||||
-------
|
|
||||||
Glass bottle (yields 10)
|
|
||||||
|
|
||||||
G - G
|
|
||||||
G - G
|
|
||||||
- G -
|
|
||||||
|
|
||||||
Drinking Glass (yields 14)
|
|
||||||
|
|
||||||
G - G
|
|
||||||
G - G
|
|
||||||
G G G
|
|
||||||
|
|
||||||
Heavy Steel Bottle (yields 5)
|
|
||||||
|
|
||||||
S - S
|
|
||||||
S - S
|
|
||||||
- S -
|
|
||||||
|
|
||||||
License of source code:
|
|
||||||
-----------------------
|
|
||||||
Copyright (C) 2012 Vanessa Ezekowitz
|
|
||||||
Version 2012-09-02
|
|
||||||
Modifications by Perttu Ahola <celeron55@gmail.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
http://www.gnu.org/licenses/lgpl-2.1.html
|
|
||||||
|
|
||||||
License of media (textures and sounds)
|
|
||||||
--------------------------------------
|
|
||||||
WTFPL
|
|
||||||
|
|
||||||
Authors of media files
|
|
||||||
-----------------------
|
|
||||||
Unless specifically noted,
|
|
||||||
Copyright (C) 2012 Vanessa Ezekowitz
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
default
|
|
|
@ -1,116 +0,0 @@
|
||||||
-- Minetest 0.4 mod: vessels
|
|
||||||
-- See README.txt for licensing and other information.
|
|
||||||
|
|
||||||
minetest.register_node("vessels:glass_bottle", {
|
|
||||||
description = "Glass Bottle (empty)",
|
|
||||||
drawtype = "plantlike",
|
|
||||||
tiles = {"vessels_glass_bottle.png"},
|
|
||||||
inventory_image = "vessels_glass_bottle_inv.png",
|
|
||||||
wield_image = "vessels_glass_bottle.png",
|
|
||||||
paramtype = "light",
|
|
||||||
walkable = false,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
|
|
||||||
},
|
|
||||||
groups = {vessel=1,dig_immediate=3,attached_node=1},
|
|
||||||
sounds = default.node_sound_glass_defaults(),
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
output = "vessels:glass_bottle 10",
|
|
||||||
recipe = {
|
|
||||||
{ "default:glass", "", "default:glass" },
|
|
||||||
{ "default:glass", "", "default:glass" },
|
|
||||||
{ "", "default:glass", "" }
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("vessels:drinking_glass", {
|
|
||||||
description = "Drinking Glass (empty)",
|
|
||||||
drawtype = "plantlike",
|
|
||||||
tiles = {"vessels_drinking_glass.png"},
|
|
||||||
inventory_image = "vessels_drinking_glass_inv.png",
|
|
||||||
wield_image = "vessels_drinking_glass.png",
|
|
||||||
paramtype = "light",
|
|
||||||
walkable = false,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
|
|
||||||
},
|
|
||||||
groups = {vessel=1,dig_immediate=3,attached_node=1},
|
|
||||||
sounds = default.node_sound_glass_defaults(),
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
output = "vessels:drinking_glass 14",
|
|
||||||
recipe = {
|
|
||||||
{ "default:glass", "", "default:glass" },
|
|
||||||
{ "default:glass", "", "default:glass" },
|
|
||||||
{ "default:glass", "default:glass", "default:glass" }
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("vessels:steel_bottle", {
|
|
||||||
description = "Heavy Steel Bottle (empty)",
|
|
||||||
drawtype = "plantlike",
|
|
||||||
tiles = {"vessels_steel_bottle.png"},
|
|
||||||
inventory_image = "vessels_steel_bottle_inv.png",
|
|
||||||
wield_image = "vessels_steel_bottle.png",
|
|
||||||
paramtype = "light",
|
|
||||||
walkable = false,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
|
|
||||||
},
|
|
||||||
groups = {vessel=1,dig_immediate=3,attached_node=1},
|
|
||||||
sounds = default.node_sound_defaults(),
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
output = "vessels:steel_bottle 5",
|
|
||||||
recipe = {
|
|
||||||
{ "default:steel_ingot", "", "default:steel_ingot" },
|
|
||||||
{ "default:steel_ingot", "", "default:steel_ingot" },
|
|
||||||
{ "", "default:steel_ingot", "" }
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
-- Make sure we can recycle them
|
|
||||||
|
|
||||||
minetest.register_craftitem("vessels:glass_fragments", {
|
|
||||||
description = "Pile of Glass Fragments",
|
|
||||||
inventory_image = "vessels_glass_fragments.png",
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
type = "shapeless",
|
|
||||||
output = "vessels:glass_fragments",
|
|
||||||
recipe = {
|
|
||||||
"vessels:glass_bottle",
|
|
||||||
"vessels:glass_bottle",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
type = "shapeless",
|
|
||||||
output = "vessels:glass_fragments",
|
|
||||||
recipe = {
|
|
||||||
"vessels:drinking_glass",
|
|
||||||
"vessels:drinking_glass",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "cooking",
|
|
||||||
output = "default:glass",
|
|
||||||
recipe = "vessels:glass_fragments",
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
type = "cooking",
|
|
||||||
output = "default:steel_ingot",
|
|
||||||
recipe = "vessels:steel_bottle",
|
|
||||||
})
|
|
||||||
|
|
Before Width: | Height: | Size: 167 B |
Before Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 238 B |
Before Width: | Height: | Size: 508 B |
Before Width: | Height: | Size: 508 B |
Before Width: | Height: | Size: 341 B |
Before Width: | Height: | Size: 341 B |
Before Width: | Height: | Size: 741 B |
Before Width: | Height: | Size: 425 B |
Before Width: | Height: | Size: 425 B |
|
@ -1,13 +0,0 @@
|
||||||
Minetest 0.4.x mod: xpanes
|
|
||||||
==========================
|
|
||||||
|
|
||||||
License:
|
|
||||||
--------
|
|
||||||
Copyright (C) xyz
|
|
||||||
modified by BlockMen (iron bars)
|
|
||||||
|
|
||||||
This program is free software. It comes without any warranty, to
|
|
||||||
the extent permitted by applicable law. You can redistribute it
|
|
||||||
and/or modify it under the terms of the Do What The Fuck You Want
|
|
||||||
To Public License, Version 2, as published by Sam Hocevar. See
|
|
||||||
http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
|
@ -1 +0,0 @@
|
||||||
default
|
|
|
@ -1,193 +0,0 @@
|
||||||
xpanes = {}
|
|
||||||
|
|
||||||
local function rshift(x, by)
|
|
||||||
return math.floor(x / 2 ^ by)
|
|
||||||
end
|
|
||||||
|
|
||||||
local directions = {
|
|
||||||
{x = 1, y = 0, z = 0},
|
|
||||||
{x = 0, y = 0, z = 1},
|
|
||||||
{x = -1, y = 0, z = 0},
|
|
||||||
{x = 0, y = 0, z = -1},
|
|
||||||
}
|
|
||||||
|
|
||||||
local function update_pane(pos, name)
|
|
||||||
if not minetest.get_node(pos).name:find("^xpanes:"..name) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local sum = 0
|
|
||||||
for i, dir in pairs(directions) do
|
|
||||||
local node = minetest.get_node({
|
|
||||||
x = pos.x + dir.x,
|
|
||||||
y = pos.y + dir.y,
|
|
||||||
z = pos.z + dir.z
|
|
||||||
})
|
|
||||||
local def = minetest.registered_nodes[node.name]
|
|
||||||
local pane_num = def and def.groups.pane or 0
|
|
||||||
if pane_num > 0 or not def or (def.walkable ~= false and
|
|
||||||
def.drawtype ~= "nodebox") then
|
|
||||||
sum = sum + 2 ^ (i - 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if sum == 0 then
|
|
||||||
sum = 15
|
|
||||||
end
|
|
||||||
minetest.set_node(pos, {name = "xpanes:"..name.."_"..sum})
|
|
||||||
end
|
|
||||||
|
|
||||||
local function update_nearby(pos, node)
|
|
||||||
node = node or minetest.get_node(pos)
|
|
||||||
local name = node.name
|
|
||||||
if not name or node.name:sub(1, 7) ~= "xpanes:" then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local underscore_pos = string.find(name, "_[^_]*$") or 0
|
|
||||||
local len = name:len()
|
|
||||||
local num = tonumber(name:sub(underscore_pos+1, len))
|
|
||||||
if not num or num < 1 or num > 15 then
|
|
||||||
name = name:sub(8)
|
|
||||||
else
|
|
||||||
name = name:sub(8, underscore_pos - 1)
|
|
||||||
end
|
|
||||||
for i, dir in pairs(directions) do
|
|
||||||
update_pane({
|
|
||||||
x = pos.x + dir.x,
|
|
||||||
y = pos.y + dir.y,
|
|
||||||
z = pos.z + dir.z
|
|
||||||
}, name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local half_boxes = {
|
|
||||||
{0, -0.5, -1/32, 0.5, 0.5, 1/32},
|
|
||||||
{-1/32, -0.5, 0, 1/32, 0.5, 0.5},
|
|
||||||
{-0.5, -0.5, -1/32, 0, 0.5, 1/32},
|
|
||||||
{-1/32, -0.5, -0.5, 1/32, 0.5, 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
local full_boxes = {
|
|
||||||
{-0.5, -0.5, -1/32, 0.5, 0.5, 1/32},
|
|
||||||
{-1/32, -0.5, -0.5, 1/32, 0.5, 0.5}
|
|
||||||
}
|
|
||||||
|
|
||||||
local sb_half_boxes = {
|
|
||||||
{0, -0.5, -0.06, 0.5, 0.5, 0.06},
|
|
||||||
{-0.06, -0.5, 0, 0.06, 0.5, 0.5},
|
|
||||||
{-0.5, -0.5, -0.06, 0, 0.5, 0.06},
|
|
||||||
{-0.06, -0.5, -0.5, 0.06, 0.5, 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
local sb_full_boxes = {
|
|
||||||
{-0.5, -0.5, -0.06, 0.5, 0.5, 0.06},
|
|
||||||
{-0.06, -0.5, -0.5, 0.06, 0.5, 0.5}
|
|
||||||
}
|
|
||||||
|
|
||||||
function xpanes.register_pane(name, def)
|
|
||||||
for i = 1, 15 do
|
|
||||||
local need = {}
|
|
||||||
local cnt = 0
|
|
||||||
for j = 1, 4 do
|
|
||||||
if rshift(i, j - 1) % 2 == 1 then
|
|
||||||
need[j] = true
|
|
||||||
cnt = cnt + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local take = {}
|
|
||||||
local take2 = {}
|
|
||||||
if need[1] == true and need[3] == true then
|
|
||||||
need[1] = nil
|
|
||||||
need[3] = nil
|
|
||||||
table.insert(take, full_boxes[1])
|
|
||||||
table.insert(take2, sb_full_boxes[1])
|
|
||||||
end
|
|
||||||
if need[2] == true and need[4] == true then
|
|
||||||
need[2] = nil
|
|
||||||
need[4] = nil
|
|
||||||
table.insert(take, full_boxes[2])
|
|
||||||
table.insert(take2, sb_full_boxes[2])
|
|
||||||
end
|
|
||||||
for k in pairs(need) do
|
|
||||||
table.insert(take, half_boxes[k])
|
|
||||||
table.insert(take2, sb_half_boxes[k])
|
|
||||||
end
|
|
||||||
local texture = def.textures[1]
|
|
||||||
if cnt == 1 then
|
|
||||||
texture = def.textures[1].."^"..def.textures[2]
|
|
||||||
end
|
|
||||||
minetest.register_node(":xpanes:"..name.."_"..i, {
|
|
||||||
drawtype = "nodebox",
|
|
||||||
tiles = {def.textures[3], def.textures[3], texture},
|
|
||||||
paramtype = "light",
|
|
||||||
groups = def.groups,
|
|
||||||
drop = "xpanes:"..name,
|
|
||||||
sounds = def.sounds,
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = take
|
|
||||||
},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = take2
|
|
||||||
}
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
def.on_construct = function(pos)
|
|
||||||
update_pane(pos, name)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node(":xpanes:"..name, def)
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "xpanes:"..name.." 16",
|
|
||||||
recipe = def.recipe
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_on_placenode(update_nearby)
|
|
||||||
minetest.register_on_dignode(update_nearby)
|
|
||||||
|
|
||||||
xpanes.register_pane("pane", {
|
|
||||||
description = "Glass Pane",
|
|
||||||
tiles = {"xpanes_space.png"},
|
|
||||||
drawtype = "airlike",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
air_equivalent = true,
|
|
||||||
textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"},
|
|
||||||
inventory_image = "default_glass.png",
|
|
||||||
wield_image = "default_glass.png",
|
|
||||||
sounds = default.node_sound_glass_defaults(),
|
|
||||||
groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1},
|
|
||||||
recipe = {
|
|
||||||
{'default:glass', 'default:glass', 'default:glass'},
|
|
||||||
{'default:glass', 'default:glass', 'default:glass'}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
xpanes.register_pane("bar", {
|
|
||||||
description = "Iron bar",
|
|
||||||
tiles = {"xpanes_space.png"},
|
|
||||||
drawtype = "airlike",
|
|
||||||
paramtype = "light",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
air_equivalent = true,
|
|
||||||
textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"},
|
|
||||||
inventory_image = "xpanes_bar.png",
|
|
||||||
wield_image = "xpanes_bar.png",
|
|
||||||
groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1},
|
|
||||||
sounds = default.node_sound_stone_defaults(),
|
|
||||||
recipe = {
|
|
||||||
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
|
|
||||||
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
Before Width: | Height: | Size: 383 B |
Before Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 149 B |
Before Width: | Height: | Size: 148 B |