mirror of
https://git.minetest.land/MineClone2/MineClone2.git
synced 2024-12-26 11:17:30 +01:00
Merge pull request 'master' (#9) from MineClone2/MineClone2:master into master
Reviewed-on: https://git.minetest.land/NO11/MineClone2/pulls/9
This commit is contained in:
commit
94e1d82b45
@ -538,3 +538,12 @@ function mcl_util.get_object_name(object)
|
|||||||
return luaentity.nametag and luaentity.nametag ~= "" and luaentity.nametag or luaentity.description or luaentity.name
|
return luaentity.nametag and luaentity.nametag ~= "" and luaentity.nametag or luaentity.description or luaentity.name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function mcl_util.replace_mob(obj, mob)
|
||||||
|
local rot = obj:get_yaw()
|
||||||
|
local pos = obj:get_pos()
|
||||||
|
obj:remove()
|
||||||
|
obj = minetest.add_entity(pos, mob)
|
||||||
|
obj:set_yaw(rot)
|
||||||
|
return obj
|
||||||
|
end
|
||||||
|
31
mods/ENVIRONMENT/lightning/API.md
Normal file
31
mods/ENVIRONMENT/lightning/API.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# lightning
|
||||||
|
Lightning mod for MineClone2 with the following API:
|
||||||
|
|
||||||
|
## lightning.register_on_strike(function(pos, pos2, objects))
|
||||||
|
Custom function called when a lightning strikes.
|
||||||
|
|
||||||
|
* `pos`: impact position
|
||||||
|
* `pos2`: rounded node position where fire is placed
|
||||||
|
* `objects`: table with ObjectRefs of all objects within a radius of 3.5 around pos2
|
||||||
|
|
||||||
|
## lightning.strike(pos)
|
||||||
|
Let a lightning strike.
|
||||||
|
|
||||||
|
* `pos`: optional, if not given a random pos will be chosen
|
||||||
|
* `returns`: bool - success if a strike happened
|
||||||
|
|
||||||
|
|
||||||
|
### Examples:
|
||||||
|
|
||||||
|
```
|
||||||
|
lightning.register_on_strike(function(pos, pos2, objects)
|
||||||
|
for _, obj in pairs(objects) do
|
||||||
|
obj:remove()
|
||||||
|
end
|
||||||
|
minetest.add_entity(pos, "mobs_mc:sheep")
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_respawnplayer(function(player)
|
||||||
|
lightning.strike(player:get_pos())
|
||||||
|
end)
|
||||||
|
```
|
@ -24,13 +24,14 @@ local get_objects_inside_radius = minetest.get_objects_inside_radius
|
|||||||
local get_item_group = minetest.get_item_group
|
local get_item_group = minetest.get_item_group
|
||||||
|
|
||||||
lightning = {
|
lightning = {
|
||||||
interval_low = 17,
|
interval_low = 17,
|
||||||
interval_high = 503,
|
interval_high = 503,
|
||||||
range_h = 100,
|
range_h = 100,
|
||||||
range_v = 50,
|
range_v = 50,
|
||||||
size = 100,
|
size = 100,
|
||||||
-- disable this to stop lightning mod from striking
|
-- disable this to stop lightning mod from striking
|
||||||
auto = true,
|
auto = true,
|
||||||
|
on_strike_functions = {},
|
||||||
}
|
}
|
||||||
|
|
||||||
local rng = PcgRandom(32321123312123)
|
local rng = PcgRandom(32321123312123)
|
||||||
@ -54,6 +55,18 @@ end
|
|||||||
|
|
||||||
minetest.register_globalstep(revertsky)
|
minetest.register_globalstep(revertsky)
|
||||||
|
|
||||||
|
-- lightning strike API
|
||||||
|
|
||||||
|
-- See API.md
|
||||||
|
--[[
|
||||||
|
lightning.register_on_strike(function(pos, pos2, objects)
|
||||||
|
-- code
|
||||||
|
end)
|
||||||
|
]]
|
||||||
|
function lightning.register_on_strike(func)
|
||||||
|
table.insert(lightning.on_strike_functions, func)
|
||||||
|
end
|
||||||
|
|
||||||
-- select a random strike point, midpoint
|
-- select a random strike point, midpoint
|
||||||
local function choose_pos(pos)
|
local function choose_pos(pos)
|
||||||
if not pos then
|
if not pos then
|
||||||
@ -79,14 +92,14 @@ local function choose_pos(pos)
|
|||||||
pos.z = math.floor(pos.z - (lightning.range_h / 2) + rng:next(1, lightning.range_h))
|
pos.z = math.floor(pos.z - (lightning.range_h / 2) + rng:next(1, lightning.range_h))
|
||||||
end
|
end
|
||||||
|
|
||||||
local b, pos2 = line_of_sight(pos, {x = pos.x, y = pos.y - lightning.range_v, z = pos.z}, 1)
|
local b, pos2 = line_of_sight(pos, { x = pos.x, y = pos.y - lightning.range_v, z = pos.z }, 1)
|
||||||
|
|
||||||
-- nothing but air found
|
-- nothing but air found
|
||||||
if b then
|
if b then
|
||||||
return nil, nil
|
return nil, nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local n = get_node({x = pos2.x, y = pos2.y - 1/2, z = pos2.z})
|
local n = get_node({ x = pos2.x, y = pos2.y - 1/2, z = pos2.z })
|
||||||
if n.name == "air" or n.name == "ignore" then
|
if n.name == "air" or n.name == "ignore" then
|
||||||
return nil, nil
|
return nil, nil
|
||||||
end
|
end
|
||||||
@ -94,7 +107,6 @@ local function choose_pos(pos)
|
|||||||
return pos, pos2
|
return pos, pos2
|
||||||
end
|
end
|
||||||
|
|
||||||
-- lightning strike API
|
|
||||||
-- * pos: optional, if not given a random pos will be chosen
|
-- * pos: optional, if not given a random pos will be chosen
|
||||||
-- * returns: bool - success if a strike happened
|
-- * returns: bool - success if a strike happened
|
||||||
function lightning.strike(pos)
|
function lightning.strike(pos)
|
||||||
@ -108,21 +120,28 @@ function lightning.strike(pos)
|
|||||||
if not pos then
|
if not pos then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
local objects = get_objects_inside_radius(pos2, 3.5)
|
||||||
|
if lightning.on_strike_functions then
|
||||||
|
for _, func in pairs(lightning.on_strike_functions) do
|
||||||
|
func(pos, pos2, objects)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
lightning.register_on_strike(function(pos, pos2, objects)
|
||||||
|
local particle_pos = vector.offset(pos2, 0, (lightning.size / 2) + 0.5, 0)
|
||||||
|
local particle_size = lightning.size * 10
|
||||||
|
local time = 0.2
|
||||||
add_particlespawner({
|
add_particlespawner({
|
||||||
amount = 1,
|
amount = 1,
|
||||||
time = 0.2,
|
time = time,
|
||||||
-- make it hit the top of a block exactly with the bottom
|
-- make it hit the top of a block exactly with the bottom
|
||||||
minpos = {x = pos2.x, y = pos2.y + (lightning.size / 2) + 1/2, z = pos2.z },
|
minpos = particle_pos,
|
||||||
maxpos = {x = pos2.x, y = pos2.y + (lightning.size / 2) + 1/2, z = pos2.z },
|
maxpos = particle_pos,
|
||||||
minvel = {x = 0, y = 0, z = 0},
|
minexptime = time,
|
||||||
maxvel = {x = 0, y = 0, z = 0},
|
maxexptime = time,
|
||||||
minacc = {x = 0, y = 0, z = 0},
|
minsize = particle_size,
|
||||||
maxacc = {x = 0, y = 0, z = 0},
|
maxsize = particle_size,
|
||||||
minexptime = 0.2,
|
|
||||||
maxexptime = 0.2,
|
|
||||||
minsize = lightning.size * 10,
|
|
||||||
maxsize = lightning.size * 10,
|
|
||||||
collisiondetection = true,
|
collisiondetection = true,
|
||||||
vertical = true,
|
vertical = true,
|
||||||
-- to make it appear hitting the node that will get set on fire, make sure
|
-- to make it appear hitting the node that will get set on fire, make sure
|
||||||
@ -135,44 +154,27 @@ function lightning.strike(pos)
|
|||||||
sound_play({ name = "lightning_thunder", gain = 10 }, { pos = pos, max_hear_distance = 500 }, true)
|
sound_play({ name = "lightning_thunder", gain = 10 }, { pos = pos, max_hear_distance = 500 }, true)
|
||||||
|
|
||||||
-- damage nearby objects, transform mobs
|
-- damage nearby objects, transform mobs
|
||||||
-- TODO: use an API insteed of hardcoding this behaviour
|
for _, obj in pairs(objects) do
|
||||||
local objs = get_objects_inside_radius(pos2, 3.5)
|
|
||||||
for o=1, #objs do
|
|
||||||
local obj = objs[o]
|
|
||||||
local lua = obj:get_luaentity()
|
local lua = obj:get_luaentity()
|
||||||
-- pig → zombie pigman (no damage)
|
if lua and lua._on_strike then
|
||||||
|
lua._on_strike(lua, pos, pos2, objects)
|
||||||
|
end
|
||||||
|
-- remove this when mob API is done
|
||||||
if lua and lua.name == "mobs_mc:pig" then
|
if lua and lua.name == "mobs_mc:pig" then
|
||||||
local rot = obj:get_yaw()
|
mcl_util.replace_mob(obj, "mobs_mc:pigman")
|
||||||
obj:remove()
|
|
||||||
obj = add_entity(pos2, "mobs_mc:pigman")
|
|
||||||
obj:set_yaw(rot)
|
|
||||||
-- mooshroom: toggle color red/brown (no damage)
|
|
||||||
elseif lua and lua.name == "mobs_mc:mooshroom" then
|
elseif lua and lua.name == "mobs_mc:mooshroom" then
|
||||||
if lua.base_texture[1] == "mobs_mc_mooshroom.png" then
|
if lua.base_texture[1] == "mobs_mc_mooshroom.png" then
|
||||||
lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" }
|
lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" }
|
||||||
else
|
else
|
||||||
lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" }
|
lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" }
|
||||||
end
|
end
|
||||||
obj:set_properties({textures = lua.base_texture})
|
obj:set_properties({ textures = lua.base_texture })
|
||||||
-- villager → witch (no damage)
|
elseif lua and lua.name == "mobs_mc:villager" then
|
||||||
--elseif lua and lua.name == "mobs_mc:villager" then
|
mcl_util.replace_mob(obj, "mobs_mc:witch")
|
||||||
-- Witches are incomplete, this code is unused
|
|
||||||
-- TODO: Enable this code when witches are working.
|
|
||||||
--[[
|
|
||||||
local rot = obj:get_yaw()
|
|
||||||
obj:remove()
|
|
||||||
obj = minetest.add_entity(pos2, "mobs_mc:witch")
|
|
||||||
obj:set_yaw(rot)
|
|
||||||
]]
|
|
||||||
-- charged creeper
|
|
||||||
elseif lua and lua.name == "mobs_mc:creeper" then
|
elseif lua and lua.name == "mobs_mc:creeper" then
|
||||||
local rot = obj:get_yaw()
|
mcl_util.replace_mob(obj, "mobs_mc:creeper_charged")
|
||||||
obj:remove()
|
|
||||||
obj = add_entity(pos2, "mobs_mc:creeper_charged")
|
|
||||||
obj:set_yaw(rot)
|
|
||||||
-- Other objects: Just damage
|
|
||||||
else
|
else
|
||||||
mcl_util.deal_damage(obj, 5, {type = "lightning_bolt"})
|
mcl_util.deal_damage(obj, 5, { type = "lightning_bolt" })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -186,7 +188,7 @@ function lightning.strike(pos)
|
|||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
if ps[name] == nil then
|
if ps[name] == nil then
|
||||||
ps[name] = {p = player, sky = sky}
|
ps[name] = {p = player, sky = sky}
|
||||||
mcl_weather.skycolor.add_layer("lightning", {{r=255,g=255,b=255}}, true)
|
mcl_weather.skycolor.add_layer("lightning", { { r = 255, g = 255, b = 255 } }, true)
|
||||||
mcl_weather.skycolor.active = true
|
mcl_weather.skycolor.active = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -201,7 +203,7 @@ function lightning.strike(pos)
|
|||||||
if rng:next(1,100) <= 3 then
|
if rng:next(1,100) <= 3 then
|
||||||
skeleton_lightning = true
|
skeleton_lightning = true
|
||||||
end
|
end
|
||||||
if get_item_group(get_node({x = pos2.x, y = pos2.y - 1, z = pos2.z}).name, "liquid") < 1 then
|
if get_item_group(get_node({ x = pos2.x, y = pos2.y - 1, z = pos2.z }).name, "liquid") < 1 then
|
||||||
if get_node(pos2).name == "air" then
|
if get_node(pos2).name == "air" then
|
||||||
-- Low chance for a lightning to spawn skeleton horse + skeletons
|
-- Low chance for a lightning to spawn skeleton horse + skeletons
|
||||||
if skeleton_lightning then
|
if skeleton_lightning then
|
||||||
@ -210,7 +212,7 @@ function lightning.strike(pos)
|
|||||||
local angle, posadd
|
local angle, posadd
|
||||||
angle = math.random(0, math.pi*2)
|
angle = math.random(0, math.pi*2)
|
||||||
for i=1,3 do
|
for i=1,3 do
|
||||||
posadd = {x=math.cos(angle),y=0,z=math.sin(angle)}
|
posadd = { x=math.cos(angle),y=0,z=math.sin(angle) }
|
||||||
posadd = vector.normalize(posadd)
|
posadd = vector.normalize(posadd)
|
||||||
local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton")
|
local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton")
|
||||||
mob:set_yaw(angle-math.pi/2)
|
mob:set_yaw(angle-math.pi/2)
|
||||||
@ -219,12 +221,11 @@ function lightning.strike(pos)
|
|||||||
|
|
||||||
-- Cause a fire
|
-- Cause a fire
|
||||||
else
|
else
|
||||||
set_node(pos2, {name = "mcl_fire:fire"})
|
set_node(pos2, { name = "mcl_fire:fire" })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end)
|
||||||
end
|
|
||||||
|
|
||||||
-- if other mods disable auto lightning during initialization, don't trigger the first lightning.
|
-- if other mods disable auto lightning during initialization, don't trigger the first lightning.
|
||||||
after(5, function(dtime)
|
after(5, function(dtime)
|
||||||
|
@ -203,12 +203,8 @@ local dispenserdef = {
|
|||||||
else
|
else
|
||||||
minetest.add_item(droppos, mobs_mc.items.mushroom_red .. " 5")
|
minetest.add_item(droppos, mobs_mc.items.mushroom_red .. " 5")
|
||||||
end
|
end
|
||||||
local oldyaw = obj:get_yaw()
|
obj = mcl_util.replace_mob(obj, "mobs_mc:cow")
|
||||||
obj:remove()
|
entity = obj:get_luaentity()
|
||||||
local cow = minetest.add_entity(pos, "mobs_mc:cow")
|
|
||||||
cow:set_yaw(oldyaw)
|
|
||||||
obj = cow
|
|
||||||
entity = cow:get_luaentity()
|
|
||||||
used = true
|
used = true
|
||||||
end
|
end
|
||||||
if used then
|
if used then
|
||||||
|
@ -12,15 +12,7 @@ Authors of media (textures)
|
|||||||
BlockMen (CC BY-SA 3.0)
|
BlockMen (CC BY-SA 3.0)
|
||||||
|
|
||||||
This mod adds a bed to Minetest which allows to skip the night.
|
This mod adds a bed to Minetest which allows to skip the night.
|
||||||
To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped
|
To sleep, rightclick the bed.
|
||||||
immediately. If playing multiplayer you get shown how many other players are in bed too,
|
Another feature is a controlled respawning. If you have slept in bed your respawn point is set to the beds location and you will respawn there after
|
||||||
if all players are sleeping the night gets skipped. The night skip can be forced if more
|
|
||||||
than 50% of the players are lying in bed and use this option.
|
|
||||||
|
|
||||||
Another feature is a controlled respawning. If you have slept in bed (not just lying in
|
|
||||||
it) your respawn point is set to the beds location and you will respawn there after
|
|
||||||
death.
|
death.
|
||||||
You can disable the respawn at beds by setting "enable_bed_respawn = false" in
|
Use the mcl_playersSleepingPercentage setting to enable/disable night skipping or set a percentage of how many players need to sleep to skip the night.
|
||||||
minetest.conf.
|
|
||||||
You can disable the night skip feature by setting "enable_bed_night_skip = false" in
|
|
||||||
minetest.conf or by using the /set command in-game.
|
|
@ -14,39 +14,34 @@ local worlds_mod = minetest.get_modpath("mcl_worlds")
|
|||||||
|
|
||||||
local function get_look_yaw(pos)
|
local function get_look_yaw(pos)
|
||||||
local n = minetest.get_node(pos)
|
local n = minetest.get_node(pos)
|
||||||
if n.param2 == 1 then
|
local param = n.param2
|
||||||
return math.pi / 2, n.param2
|
if param == 1 then
|
||||||
elseif n.param2 == 3 then
|
return math.pi / 2, param
|
||||||
return -math.pi / 2, n.param2
|
elseif param == 3 then
|
||||||
elseif n.param2 == 0 then
|
return -math.pi / 2, param
|
||||||
return math.pi, n.param2
|
elseif param == 0 then
|
||||||
|
return math.pi, param
|
||||||
else
|
else
|
||||||
return 0, n.param2
|
return 0, param
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function players_in_bed_setting()
|
||||||
|
return tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) or 100
|
||||||
|
end
|
||||||
|
|
||||||
local function is_night_skip_enabled()
|
local function is_night_skip_enabled()
|
||||||
local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip")
|
return players_in_bed_setting() <= 100
|
||||||
if enable_night_skip == nil then
|
|
||||||
enable_night_skip = true
|
|
||||||
end
|
|
||||||
return enable_night_skip
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function check_in_beds(players)
|
local function check_in_beds(players)
|
||||||
local in_bed = mcl_beds.player
|
|
||||||
if not players then
|
if not players then
|
||||||
players = minetest.get_connected_players()
|
players = minetest.get_connected_players()
|
||||||
end
|
end
|
||||||
|
if player_in_bed <= 0 then
|
||||||
for n, player in pairs(players) do
|
return false
|
||||||
local name = player:get_player_name()
|
|
||||||
if not in_bed[name] then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
return players_in_bed_setting() <= (player_in_bed * 100) / #players
|
||||||
return #players > 0
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- These monsters do not prevent sleep
|
-- These monsters do not prevent sleep
|
||||||
@ -198,7 +193,7 @@ end
|
|||||||
local function update_formspecs(finished, ges)
|
local function update_formspecs(finished, ges)
|
||||||
local ges = ges or #minetest.get_connected_players()
|
local ges = ges or #minetest.get_connected_players()
|
||||||
local form_n = "size[12,5;true]"
|
local form_n = "size[12,5;true]"
|
||||||
local all_in_bed = ges == player_in_bed
|
local all_in_bed = players_in_bed_setting() <= (player_in_bed * 100) / ges
|
||||||
local night_skip = is_night_skip_enabled()
|
local night_skip = is_night_skip_enabled()
|
||||||
local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]"
|
local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]"
|
||||||
local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]"
|
local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]"
|
||||||
@ -221,7 +216,13 @@ local function update_formspecs(finished, ges)
|
|||||||
form_n = form_n .. bg_sleep
|
form_n = form_n .. bg_sleep
|
||||||
form_n = form_n .. button_abort
|
form_n = form_n .. button_abort
|
||||||
else
|
else
|
||||||
text = text .. "\n" .. S("You will fall asleep when all players are in bed.")
|
local comment = "You will fall asleep when "
|
||||||
|
if players_in_bed_setting() == 100 then
|
||||||
|
comment = S(comment .. "all players are in bed.")
|
||||||
|
else
|
||||||
|
comment = S(comment .. "@1% of all players are in bed.", players_in_bed_setting())
|
||||||
|
end
|
||||||
|
text = text .. "\n" .. comment
|
||||||
form_n = form_n .. bg_presleep
|
form_n = form_n .. bg_presleep
|
||||||
form_n = form_n .. button_leave
|
form_n = form_n .. button_leave
|
||||||
end
|
end
|
||||||
@ -349,7 +350,6 @@ function mcl_beds.on_rightclick(pos, player, is_top)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Callbacks
|
-- Callbacks
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
local meta = player:get_meta()
|
local meta = player:get_meta()
|
||||||
|
@ -37,5 +37,6 @@ Players in bed: @1/@2=Spieler im Bett: @1/@2
|
|||||||
Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert.
|
Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert.
|
||||||
You're sleeping.=Sie schlafen.
|
You're sleeping.=Sie schlafen.
|
||||||
You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind.
|
You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind.
|
||||||
|
You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind.
|
||||||
You're in bed.=Sie sind im Bett.
|
You're in bed.=Sie sind im Bett.
|
||||||
Allows you to sleep=Zum Einschafen
|
Allows you to sleep=Zum Einschafen
|
||||||
|
@ -37,5 +37,6 @@ Players in bed: @1/@2=
|
|||||||
Note: Night skip is disabled.=
|
Note: Night skip is disabled.=
|
||||||
You're sleeping.=
|
You're sleeping.=
|
||||||
You will fall asleep when all players are in bed.=
|
You will fall asleep when all players are in bed.=
|
||||||
|
You will fall asleep when @1% of all players are in bed.=
|
||||||
You're in bed.=
|
You're in bed.=
|
||||||
Allows you to sleep=
|
Allows you to sleep=
|
||||||
|
@ -93,7 +93,7 @@ minetest.register_craftitem("mcl_core:gold_ingot", {
|
|||||||
|
|
||||||
minetest.register_craftitem("mcl_core:emerald", {
|
minetest.register_craftitem("mcl_core:emerald", {
|
||||||
description = S("Emerald"),
|
description = S("Emerald"),
|
||||||
_doc_items_longdesc = S("Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting."),
|
_doc_items_longdesc = S("Emeralds are used in villager trades as currency."),
|
||||||
inventory_image = "mcl_core_emerald.png",
|
inventory_image = "mcl_core_emerald.png",
|
||||||
stack_max = 64,
|
stack_max = 64,
|
||||||
groups = { craftitem=1 },
|
groups = { craftitem=1 },
|
||||||
|
@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass
|
|||||||
Emerald=Smaragd
|
Emerald=Smaragd
|
||||||
Emerald Ore=Smaragderz
|
Emerald Ore=Smaragderz
|
||||||
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen.
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen.
|
||||||
Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen.
|
Emeralds are used in villager trades as currency.=
|
||||||
Flint=Feuerstein
|
Flint=Feuerstein
|
||||||
Flint is a raw material.=Feuerstein ist ein Rohstoff.
|
Flint is a raw material.=Feuerstein ist ein Rohstoff.
|
||||||
Flowing Lava=Fließende Lava
|
Flowing Lava=Fließende Lava
|
||||||
|
@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass
|
|||||||
Emerald=Esmeralda
|
Emerald=Esmeralda
|
||||||
Emerald Ore=Mena de esmeralda
|
Emerald Ore=Mena de esmeralda
|
||||||
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos.
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos.
|
||||||
Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías.
|
Emeralds are used in villager trades as currency.=
|
||||||
Flint=Pedernal
|
Flint=Pedernal
|
||||||
Flint is a raw material.=El pedernal es una materia prima.
|
Flint is a raw material.=El pedernal es una materia prima.
|
||||||
Flowing Lava=Lava que fluye
|
Flowing Lava=Lava que fluye
|
||||||
|
@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass
|
|||||||
Emerald=Emeraude
|
Emerald=Emeraude
|
||||||
Emerald Ore=Minerai d'Emeraude
|
Emerald Ore=Minerai d'Emeraude
|
||||||
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons.
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons.
|
||||||
Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or.
|
Emeralds are used in villager trades as currency.=Les émeraudes sont utilisées pour faire des échanges avec les villageois.
|
||||||
Flint=Silex
|
Flint=Silex
|
||||||
Flint is a raw material.=Le silex est une matière première.
|
Flint is a raw material.=Le silex est une matière première.
|
||||||
Flowing Lava=Lave qui coule
|
Flowing Lava=Lave qui coule
|
||||||
|
@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass
|
|||||||
Emerald=Szmaragd
|
Emerald=Szmaragd
|
||||||
Emerald Ore=Ruda szmaragdu
|
Emerald Ore=Ruda szmaragdu
|
||||||
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach.
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach.
|
||||||
Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota.
|
Emeralds are used in villager trades as currency.=
|
||||||
Flint=Krzemień
|
Flint=Krzemień
|
||||||
Flint is a raw material.=Krzemień jest surowym materiałem.
|
Flint is a raw material.=Krzemień jest surowym materiałem.
|
||||||
Flowing Lava=Płynąca lawa
|
Flowing Lava=Płynąca lawa
|
||||||
|
@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass
|
|||||||
Emerald=Изумруд
|
Emerald=Изумруд
|
||||||
Emerald Ore=Изумрудная руда
|
Emerald Ore=Изумрудная руда
|
||||||
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку.
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку.
|
||||||
Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки.
|
Emeralds are used in villager trades as currency.=
|
||||||
Flint=Кремень
|
Flint=Кремень
|
||||||
Flint is a raw material.=Кремень это необработанный материал.
|
Flint is a raw material.=Кремень это необработанный материал.
|
||||||
Flowing Lava=Текущая лава
|
Flowing Lava=Текущая лава
|
||||||
|
@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass
|
|||||||
Emerald=
|
Emerald=
|
||||||
Emerald Ore=
|
Emerald Ore=
|
||||||
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=
|
||||||
Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=
|
Emeralds are used in villager trades as currency.=
|
||||||
Flint=
|
Flint=
|
||||||
Flint is a raw material.=
|
Flint is a raw material.=
|
||||||
Flowing Lava=
|
Flowing Lava=
|
||||||
|
@ -270,8 +270,14 @@ function mcl_enchanting.initialize()
|
|||||||
new_def.groups.not_in_creative_inventory = 1
|
new_def.groups.not_in_creative_inventory = 1
|
||||||
new_def.groups.not_in_craft_guide = 1
|
new_def.groups.not_in_craft_guide = 1
|
||||||
new_def.groups.enchanted = 1
|
new_def.groups.enchanted = 1
|
||||||
new_def._mcl_armor_texture = new_def._mcl_armor_texture and new_def._mcl_armor_texture .. mcl_enchanting.overlay
|
|
||||||
new_def._mcl_armor_preview = new_def._mcl_armor_preview and new_def._mcl_armor_preview .. mcl_enchanting.overlay
|
if new_def._mcl_armor_texture and not type(new_def._mcl_armor_texture) == "function" then
|
||||||
|
new_def._mcl_armor_texture = new_def._mcl_armor_texture .. mcl_enchanting.overlay
|
||||||
|
end
|
||||||
|
if new_def._mcl_armor_preview and not type(new_def._mcl_armor_preview) == "function" then
|
||||||
|
new_def._mcl_armor_preview = new_def._mcl_armor_preview .. mcl_enchanting.overlay
|
||||||
|
end
|
||||||
|
|
||||||
new_def._mcl_enchanting_enchanted_tool = new_name
|
new_def._mcl_enchanting_enchanted_tool = new_name
|
||||||
new_def.after_use = get_after_use_callback(itemdef)
|
new_def.after_use = get_after_use_callback(itemdef)
|
||||||
local register_list = register_item_list
|
local register_list = register_item_list
|
||||||
|
@ -3,3 +3,27 @@ local S = minetest.get_translator(minetest.get_current_modname())
|
|||||||
minetest.register_privilege("maphack", {
|
minetest.register_privilege("maphack", {
|
||||||
description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."),
|
description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(player)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local meta = player:get_meta()
|
||||||
|
if meta:get_int("fly_changed") == 1 then return end
|
||||||
|
|
||||||
|
local fly = nil
|
||||||
|
if minetest.is_creative_enabled(name) then
|
||||||
|
fly = true
|
||||||
|
end
|
||||||
|
local player_privs = minetest.get_player_privs(name)
|
||||||
|
player_privs.fly = fly
|
||||||
|
minetest.set_player_privs(name, player_privs)
|
||||||
|
end)
|
||||||
|
|
||||||
|
for _, action in pairs({"grant", "revoke"}) do
|
||||||
|
minetest["register_on_priv_" .. action](function(name, _, priv)
|
||||||
|
if priv == "fly" then
|
||||||
|
local player = minetest.get_player_by_name(name)
|
||||||
|
local meta = player:get_meta()
|
||||||
|
meta:set_int("fly_changed", 1)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
@ -35,40 +35,6 @@ minetest.register_craft({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_armor:helmet_chain",
|
|
||||||
recipe = {
|
|
||||||
{ "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" },
|
|
||||||
{ "xpanes:bar_flat", "", "xpanes:bar_flat" },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_armor:leggings_chain",
|
|
||||||
recipe = {
|
|
||||||
{ "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" },
|
|
||||||
{ "xpanes:bar_flat", "", "xpanes:bar_flat" },
|
|
||||||
{ "xpanes:bar_flat", "", "xpanes:bar_flat" },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_armor:boots_chain",
|
|
||||||
recipe = {
|
|
||||||
{ "xpanes:bar_flat", "", "xpanes:bar_flat" },
|
|
||||||
{ "xpanes:bar_flat", "", "xpanes:bar_flat" },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_armor:chestplate_chain",
|
|
||||||
recipe = {
|
|
||||||
{ "xpanes:bar_flat", "", "xpanes:bar_flat" },
|
|
||||||
{ "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" },
|
|
||||||
{ "xpanes:bar_flat", "xpanes:bar_flat", "xpanes:bar_flat" },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Make red sand, red sandstone and more craftable in v6
|
-- Make red sand, red sandstone and more craftable in v6
|
||||||
-- NOTE: When you change these, also update mcl_craftguide for the "v6" icon in
|
-- NOTE: When you change these, also update mcl_craftguide for the "v6" icon in
|
||||||
-- the craft guide!
|
-- the craft guide!
|
||||||
|
@ -33,9 +33,12 @@ mcl_tnt_griefing (TNT destroys blocks) bool true
|
|||||||
# This setting is only read at startup.
|
# This setting is only read at startup.
|
||||||
enable_bed_respawn (Respawn at bed) bool true
|
enable_bed_respawn (Respawn at bed) bool true
|
||||||
|
|
||||||
# If enabled, the night can be skipped if all players are in bed.
|
# How many players have to sleep to skip the night, in percent.
|
||||||
# This setting is only read at startup.
|
# Setting to 0 will mean 1 player is always enough to skip the night. Setting above 100 will prevent skipping the night.
|
||||||
enable_bed_night_skip (Skip night when sleeping) bool true
|
# 100 by default.
|
||||||
|
# The setting can be changed ingame using `/set mcl_playersSleepingPercentage <number>`
|
||||||
|
mcl_playersSleepingPercentage (Players Sleeping Percentage) int 100
|
||||||
|
|
||||||
# Normally, players drop all their items when they die. Enable this
|
# Normally, players drop all their items when they die. Enable this
|
||||||
# setting, so players always keep their inventory on death.
|
# setting, so players always keep their inventory on death.
|
||||||
mcl_keepInventory (Keep inventory on death) bool false
|
mcl_keepInventory (Keep inventory on death) bool false
|
||||||
|
Loading…
Reference in New Issue
Block a user