merge
|
@ -80,3 +80,8 @@ Depending on what you add, the chances for inclusion vary:
|
|||
Report all bugs and missing Minecraft features here:
|
||||
|
||||
<https://git.minetest.land/Wuzzy/MineClone2/issues>
|
||||
|
||||
## Direct discussion
|
||||
We have an IRC channel! Join us on #mineclone2 in freenode.net.
|
||||
|
||||
<ircs://irc.freenode.net:6697/#mineclone2>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Missing features in Minetest to recreate Minecraft features
|
||||
|
||||
A side goal of the MineClone 2 project is to find any shortcomings of Minetest which make it impossible to recreate a Minecraft feature exactly.
|
||||
This file lists some of the missing features in Minetest which MineClone 2 would require.MineClone 2 would require.MineClone 2 would require.MineClone 2 would require.
|
||||
This file lists some of the missing features in Minetest which MineClone 2 would require.
|
||||
|
||||
## No workaround possible
|
||||
For these features, no easy Lua workaround could be found.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
|
||||
Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB.
|
||||
|
||||
Version: 0.66.2
|
||||
Version: 0.67.2
|
||||
|
||||
### Gameplay
|
||||
You start in a randomly-generated world made entirely of cubes. You can explore
|
||||
|
@ -116,6 +116,8 @@ The following main features are available:
|
|||
* The Nether, a fiery underworld in another dimension
|
||||
* Redstone circuits (partially)
|
||||
* Minecarts (partial)
|
||||
* Status effects (partial)
|
||||
* Brewing, potions, tipped arrow (partial)
|
||||
* Boats
|
||||
* Fire
|
||||
* Buidling blocks: Stairs, slabs, doors, trapdoors, fences, fence gates, walls
|
||||
|
@ -146,8 +148,6 @@ The following features are incomplete:
|
|||
* The End
|
||||
* Enchanting
|
||||
* Experience
|
||||
* Status effects
|
||||
* Brewing, potions, tipped arrows
|
||||
* Special minecarts
|
||||
* A couple of non-trivial blocks and items
|
||||
|
||||
|
@ -203,6 +203,7 @@ There are so many people to list (sorry). Check out the respective mod directori
|
|||
* [ryvnf](https://github.com/ryvnf): Explosion mechanics
|
||||
* MysticTempest: Bugfixes
|
||||
* [bzoss](https://github.com/bzoss): Status effects, potions, brewing stand
|
||||
* kay27 <kay27@bk.ru>: Bugfixes, optimizations
|
||||
* Lots of other people: TO BE WRITTEN (see mod directories for details)
|
||||
|
||||
#### Mod credits (summary)
|
||||
|
|
|
@ -124,7 +124,7 @@ local function add_particles(pos, radius)
|
|||
maxexptime = 1.0,
|
||||
minsize = radius * 0.5,
|
||||
maxsize = radius * 1.0,
|
||||
texture = "tnt_smoke.png",
|
||||
texture = "mcl_particles_smoke.png",
|
||||
})
|
||||
end
|
||||
|
||||
|
@ -195,7 +195,7 @@ local function trace_explode(pos, strength, raydirs, radius, drop_chance, fire,
|
|||
break
|
||||
end
|
||||
|
||||
if cid ~= minetest.CONTENT_AIR then
|
||||
if cid ~= minetest.CONTENT_AIR and not minetest.is_protected({x = npos_x, y = npos_y, z = npos_z}, "") then
|
||||
destroy[hash] = idx
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
name = mcl_explosions
|
||||
description = A common API to create explosions.
|
||||
depends = mcl_particles
|
||||
optional_depends = mcl_fire
|
||||
|
|
|
@ -24,6 +24,25 @@ local mg_name = minetest.get_mapgen_setting("mg_name")
|
|||
local minecraft_height_limit = 256
|
||||
local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true"
|
||||
|
||||
-- Calculate mapgen_edge_min/mapgen_edge_max
|
||||
mcl_vars.chunksize = math.max(1, tonumber(minetest.get_mapgen_setting("chunksize")) or 5)
|
||||
mcl_vars.MAP_BLOCKSIZE = math.max(1, core.MAP_BLOCKSIZE or 16)
|
||||
mcl_vars.mapgen_limit = math.max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000)
|
||||
mcl_vars.MAX_MAP_GENERATION_LIMIT = math.max(1, core.MAX_MAP_GENERATION_LIMIT or 31000)
|
||||
local central_chunk_offset = -math.floor(mcl_vars.chunksize / 2)
|
||||
local chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE
|
||||
local central_chunk_min_pos = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
||||
local central_chunk_max_pos = central_chunk_min_pos + chunk_size_in_nodes - 1
|
||||
local ccfmin = central_chunk_min_pos - mcl_vars.MAP_BLOCKSIZE -- Fullminp/fullmaxp of central chunk, in nodes
|
||||
local ccfmax = central_chunk_max_pos + mcl_vars.MAP_BLOCKSIZE
|
||||
local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) / mcl_vars.MAP_BLOCKSIZE)
|
||||
local mapgen_limit_min = -mapgen_limit_b * mcl_vars.MAP_BLOCKSIZE
|
||||
local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_vars.MAP_BLOCKSIZE - 1
|
||||
local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk
|
||||
local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits.
|
||||
mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * chunk_size_in_nodes
|
||||
mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * chunk_size_in_nodes
|
||||
|
||||
if not superflat then
|
||||
-- Normal mode
|
||||
--[[ Realm stacking (h is for height)
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
mcl_particles = {}
|
||||
|
||||
-- Table of particlespawner IDs on a per-node hash basis
|
||||
-- Keys: node position hashes
|
||||
-- Values: Tables of particlespawner IDs (each node pos can have an arbitrary number of particlespawners)
|
||||
local particle_nodes = {}
|
||||
|
||||
-- Node particles can be disabled via setting
|
||||
local node_particles_allowed = minetest.settings:get("mcl_node_particles") or "none"
|
||||
|
||||
local levels = {
|
||||
high = 3,
|
||||
medium = 2,
|
||||
low = 1,
|
||||
none = 0,
|
||||
}
|
||||
|
||||
allowed_level = levels[node_particles_allowed]
|
||||
if not allowed_level then
|
||||
allowed_level = levels["none"]
|
||||
end
|
||||
|
||||
|
||||
-- Add a particlespawner that is assigned to a given node position.
|
||||
-- * pos: Node positon. MUST use integer values!
|
||||
-- * particlespawner_definition: definition for minetest.add_particlespawner
|
||||
-- * level: detail level of particles. "high", "medium", "low" or "none". High detail levels are for
|
||||
-- CPU-demanding particles, like smoke of fire (which occurs frequently)
|
||||
-- NOTE: All particlespawners are automatically removed on shutdown.
|
||||
-- Returns particlespawner ID on succcess and nil on failure
|
||||
function mcl_particles.add_node_particlespawner(pos, particlespawner_definition, level)
|
||||
if allowed_level == 0 or levels[level] > allowed_level then
|
||||
return
|
||||
end
|
||||
local poshash = minetest.hash_node_position(pos)
|
||||
if not poshash then
|
||||
return
|
||||
end
|
||||
local id = minetest.add_particlespawner(particlespawner_definition)
|
||||
if id == -1 then
|
||||
return
|
||||
end
|
||||
if not particle_nodes[poshash] then
|
||||
particle_nodes[poshash] = {}
|
||||
end
|
||||
table.insert(particle_nodes[poshash], id)
|
||||
return id
|
||||
end
|
||||
|
||||
-- Deletes all particlespawners that are assigned to a node position.
|
||||
-- If no particlespawners exist for this position, nothing happens.
|
||||
-- pos: Node positon. MUST use integer values!
|
||||
-- Returns true if particlespawner could be removed and false if not
|
||||
function mcl_particles.delete_node_particlespawners(pos)
|
||||
if allowed_level == 0 then
|
||||
return false
|
||||
end
|
||||
local poshash = minetest.hash_node_position(pos)
|
||||
local ids = particle_nodes[poshash]
|
||||
if ids then
|
||||
for i=1, #ids do
|
||||
minetest.delete_particlespawner(ids[i])
|
||||
end
|
||||
particle_nodes[poshash] = nil
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 126 B |
After Width: | Height: | Size: 127 B |
After Width: | Height: | Size: 91 B |
After Width: | Height: | Size: 137 B |
After Width: | Height: | Size: 145 B |
After Width: | Height: | Size: 125 B |
After Width: | Height: | Size: 183 B |
After Width: | Height: | Size: 126 B |
After Width: | Height: | Size: 126 B |
After Width: | Height: | Size: 216 B |
|
@ -519,6 +519,7 @@ minetest.register_entity(":__builtin:item", {
|
|||
minetest.log("warning", "Item entity with empty itemstring found at "..minetest.pos_to_string(self.object:get_pos()).. "! Deleting it now.")
|
||||
self._removed = true
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
|
||||
local p = self.object:get_pos()
|
||||
|
|
|
@ -495,6 +495,31 @@ local damage_effect = function(self, damage)
|
|||
end
|
||||
end
|
||||
|
||||
mobs.death_effect = function(pos, collisionbox)
|
||||
local min, max
|
||||
if collisionbox then
|
||||
min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]}
|
||||
max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]}
|
||||
else
|
||||
min = { x = -0.5, y = 0, z = -0.5 }
|
||||
max = { x = 0.5, y = 0.5, z = 0.5 }
|
||||
end
|
||||
|
||||
minetest.add_particlespawner({
|
||||
amount = 40,
|
||||
time = 0.1,
|
||||
minpos = vector.add(pos, min),
|
||||
maxpos = vector.add(pos, max),
|
||||
minvel = {x = -0.2, y = -0.1, z = -0.2},
|
||||
maxvel = {x = 0.2, y = 0.1, z = 0.2},
|
||||
minexptime = 0.5,
|
||||
maxexptime = 1.5,
|
||||
minsize = 0.5,
|
||||
maxsize = 1.5,
|
||||
texture = "mcl_particles_smoke.png",
|
||||
})
|
||||
end
|
||||
|
||||
local update_tag = function(self)
|
||||
self.object:set_properties({
|
||||
nametag = self.nametag,
|
||||
|
@ -629,6 +654,11 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
return true
|
||||
end
|
||||
|
||||
local collisionbox
|
||||
if self.collisionbox then
|
||||
collisionbox = table.copy(self.collisionbox)
|
||||
end
|
||||
|
||||
-- default death function and die animation (if defined)
|
||||
if self.animation
|
||||
and self.animation.die_start
|
||||
|
@ -644,6 +674,9 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
self.blinktimer = 0
|
||||
self.passive = true
|
||||
self.state = "die"
|
||||
self.object:set_properties({
|
||||
pointable = false,
|
||||
})
|
||||
set_velocity(self, 0)
|
||||
set_animation(self, "die")
|
||||
|
||||
|
@ -656,6 +689,7 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
end
|
||||
|
||||
self.object:remove()
|
||||
mobs.death_effect(pos)
|
||||
end, self)
|
||||
else
|
||||
|
||||
|
@ -664,10 +698,9 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
end
|
||||
|
||||
self.object:remove()
|
||||
mobs.death_effect(pos, collisionbox)
|
||||
end
|
||||
|
||||
effect(pos, 20, "tnt_smoke.png")
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
@ -724,6 +757,42 @@ local is_at_cliff_or_danger = function(self)
|
|||
end
|
||||
|
||||
|
||||
-- copy the 'mob facing cliff_or_danger check' from above, and rework to avoid water
|
||||
local is_at_water_danger = function(self)
|
||||
|
||||
|
||||
if not self.object:get_luaentity() then
|
||||
return false
|
||||
end
|
||||
local yaw = self.object:get_yaw()
|
||||
local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5)
|
||||
local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5)
|
||||
local pos = self.object:get_pos()
|
||||
local ypos = pos.y + self.collisionbox[2] -- just above floor
|
||||
|
||||
local free_fall, blocker = minetest.line_of_sight(
|
||||
{x = pos.x + dir_x, y = ypos, z = pos.z + dir_z},
|
||||
{x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z})
|
||||
if free_fall then
|
||||
return true
|
||||
else
|
||||
local bnode = minetest.get_node(blocker)
|
||||
local waterdanger = is_node_waterhazard(self, bnode.name)
|
||||
if
|
||||
waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then
|
||||
return false
|
||||
elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then
|
||||
return true
|
||||
else
|
||||
local def = minetest.registered_nodes[bnode.name]
|
||||
return (not def and def.walkable)
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
-- get node but use fallback for nil or unknown
|
||||
local node_ok = function(pos, fallback)
|
||||
|
||||
|
@ -772,7 +841,7 @@ local do_env_damage = function(self)
|
|||
if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then
|
||||
self.health = self.health - damage
|
||||
|
||||
effect(pos, 5, "tnt_smoke.png")
|
||||
effect(pos, 5, "mcl_particles_smoke.png")
|
||||
|
||||
if check_for_death(self, "light", {type = "light"}) then
|
||||
return true
|
||||
|
@ -838,7 +907,7 @@ local do_env_damage = function(self)
|
|||
|
||||
self.health = self.health - self.water_damage
|
||||
|
||||
effect(pos, 5, "tnt_smoke.png", nil, nil, 1, nil)
|
||||
effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil)
|
||||
|
||||
if check_for_death(self, "water", {type = "environment",
|
||||
pos = pos, node = self.standing_in}) then
|
||||
|
@ -883,7 +952,7 @@ local do_env_damage = function(self)
|
|||
|
||||
self.health = self.health - nodef.damage_per_second
|
||||
|
||||
effect(pos, 5, "tnt_smoke.png")
|
||||
effect(pos, 5, "mcl_particles_smoke.png")
|
||||
|
||||
if check_for_death(self, "dps", {type = "environment",
|
||||
pos = pos, node = self.standing_in}) then
|
||||
|
@ -1895,16 +1964,16 @@ local follow_flop = function(self)
|
|||
|
||||
if p.x > s.x then yaw = yaw + pi end
|
||||
|
||||
set_yaw(self, yaw, 6)
|
||||
set_yaw(self, yaw, 2.35)
|
||||
|
||||
-- anyone but standing npc's can move along
|
||||
if dist > self.reach
|
||||
if dist > 3
|
||||
and self.order ~= "stand" then
|
||||
|
||||
set_velocity(self, self.walk_velocity)
|
||||
set_velocity(self, self.follow_velocity)
|
||||
|
||||
if self.walk_chance ~= 0 then
|
||||
set_animation(self, "walk")
|
||||
set_animation(self, "run")
|
||||
end
|
||||
else
|
||||
set_velocity(self, 0)
|
||||
|
@ -2049,20 +2118,20 @@ local do_states = function(self, dtime)
|
|||
|
||||
local is_in_danger = false
|
||||
if lp then
|
||||
|
||||
local is_in_danger = false
|
||||
|
||||
-- if mob is flying, only check for node it is currently in (no contact with node below)
|
||||
if flight_check(self) then
|
||||
is_in_danger = is_node_dangerous(self, self.standing_in)
|
||||
elseif (is_node_dangerous(self, self.standing_in) or
|
||||
is_node_dangerous(self, self.standing_on)) or (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then
|
||||
-- If mob in or on dangerous block, look for land
|
||||
if (is_node_dangerous(self, self.standing_in) or
|
||||
is_node_dangerous(self, self.standing_on)) or (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) and (not self.fly) then
|
||||
is_in_danger = true
|
||||
end
|
||||
|
||||
-- If mob in or on dangerous block, look for land
|
||||
if is_in_danger then
|
||||
lp = minetest.find_node_near(s, 5, {"group:solid"})
|
||||
-- Better way to find shore - copied from upstream
|
||||
lp = minetest.find_nodes_in_area_under_air(
|
||||
{x = s.x - 5, y = s.y - 0.5, z = s.z - 5},
|
||||
{x = s.x + 5, y = s.y + 1, z = s.z + 5},
|
||||
{"group:solid"})
|
||||
|
||||
lp = #lp > 0 and lp[random(#lp)]
|
||||
|
||||
-- did we find land?
|
||||
if lp then
|
||||
|
@ -2074,14 +2143,14 @@ local do_states = function(self, dtime)
|
|||
|
||||
yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
|
||||
|
||||
|
||||
if lp.x > s.x then yaw = yaw + pi end
|
||||
|
||||
-- look towards land and jump/move in that direction
|
||||
-- look towards land and move in that direction
|
||||
yaw = set_yaw(self, yaw, 6)
|
||||
do_jump(self)
|
||||
set_velocity(self, self.walk_velocity)
|
||||
else
|
||||
yaw = yaw + random(-0.5, 0.5)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
-- A danger is near but mob is not inside
|
||||
|
@ -2143,7 +2212,7 @@ local do_states = function(self, dtime)
|
|||
set_animation(self, "stand")
|
||||
else
|
||||
set_velocity(self, self.run_velocity)
|
||||
set_animation(self, "walk")
|
||||
set_animation(self, "run")
|
||||
end
|
||||
|
||||
-- attack routines (explode, dogfight, shoot, dogshoot)
|
||||
|
@ -2258,7 +2327,7 @@ local do_states = function(self, dtime)
|
|||
}, true)
|
||||
|
||||
entity_physics(pos, entity_damage_radius)
|
||||
effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0)
|
||||
effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0)
|
||||
end
|
||||
end
|
||||
self.object:remove()
|
||||
|
@ -2519,6 +2588,12 @@ local falling = function(self, pos)
|
|||
return
|
||||
end
|
||||
|
||||
if mcl_portals ~= nil then
|
||||
if mcl_portals.nether_portal_cooloff[self.object] then
|
||||
return false -- mob has teleported through Nether portal - it's 99% not falling
|
||||
end
|
||||
end
|
||||
|
||||
-- floating in water (or falling)
|
||||
local v = self.object:get_velocity()
|
||||
|
||||
|
@ -2574,7 +2649,7 @@ local falling = function(self, pos)
|
|||
if damage > 0 then
|
||||
self.health = self.health - damage
|
||||
|
||||
effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil)
|
||||
effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil)
|
||||
|
||||
if check_for_death(self, "fall", {type = "fall"}) then
|
||||
return true
|
||||
|
@ -2603,7 +2678,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
|
|||
if self.do_punch then
|
||||
|
||||
-- when false skip going any further
|
||||
if self.do_punch(self, hitter, tflp, tool_caps, dir) == false then
|
||||
if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
@ -3218,8 +3293,6 @@ local mob_step = function(self, dtime)
|
|||
|
||||
breed(self)
|
||||
|
||||
follow_flop(self)
|
||||
|
||||
if do_states(self, dtime) then
|
||||
return
|
||||
end
|
||||
|
@ -3228,6 +3301,18 @@ local mob_step = function(self, dtime)
|
|||
|
||||
runaway_from(self)
|
||||
|
||||
if is_at_water_danger(self) and self.state ~= "attack" then
|
||||
if random(1, 10) <= 6 then
|
||||
set_velocity(self, 0)
|
||||
self.state = "stand"
|
||||
set_animation(self, "stand")
|
||||
yaw = yaw + random(-0.5, 0.5)
|
||||
yaw = set_yaw(self, yaw, 8)
|
||||
end
|
||||
end
|
||||
|
||||
follow_flop(self)
|
||||
|
||||
if is_at_cliff_or_danger(self) then
|
||||
set_velocity(self, 0)
|
||||
self.state = "stand"
|
||||
|
@ -3426,6 +3511,7 @@ minetest.register_entity(name, {
|
|||
sounds_child = def.sounds_child,
|
||||
explosion_strength = def.explosion_strength,
|
||||
suffocation_timer = 0,
|
||||
follow_velocity = def.follow_velocity or 2.4,
|
||||
-- End of MCL2 extensions
|
||||
|
||||
on_spawn = def.on_spawn,
|
||||
|
@ -3880,7 +3966,7 @@ function mobs:safe_boom(self, pos, strength)
|
|||
}, true)
|
||||
local radius = strength
|
||||
entity_physics(pos, radius)
|
||||
effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0)
|
||||
effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0)
|
||||
end
|
||||
|
||||
|
||||
|
@ -4101,7 +4187,7 @@ function mobs:spawn_child(pos, mob_type)
|
|||
end
|
||||
|
||||
local ent = child:get_luaentity()
|
||||
effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5)
|
||||
effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5)
|
||||
|
||||
ent.child = true
|
||||
|
||||
|
|
|
@ -241,6 +241,7 @@ functions needed for the mob to work properly which contains the following:
|
|||
dir is mob's aiming direction
|
||||
'sounds_child' same as sounds, but for childs. If not defined, childs will use same
|
||||
sound as adults but with higher pitch
|
||||
'follow_velocity' The speed at which a mob moves toward the player when they're holding the appropriate follow item.
|
||||
|
||||
|
||||
Node Replacement
|
||||
|
@ -282,7 +283,9 @@ Along with the above mob registry settings we can also use custom functions to
|
|||
enhance mob functionality and have them do many interesting things:
|
||||
|
||||
'on_die' a function that is called when the mob is killed the
|
||||
parameters are (self, pos)
|
||||
parameters are (self, pos). When this function is used,
|
||||
the death particles will be skipped on death. You can get
|
||||
them back by calling mobs:death_effect manually
|
||||
'on_rightclick' its same as in minetest.register_entity()
|
||||
'on_blast' is called when an explosion happens near mob when using TNT
|
||||
functions, parameters are (object, damage) and returns
|
||||
|
@ -409,6 +412,10 @@ This function spawns a mob as a child. The parameter mob_type is the
|
|||
entitystring of the new mob.
|
||||
This function returns the mob on success and nil otherwise.
|
||||
|
||||
mobs:death_effect(pos, collisionbox)
|
||||
|
||||
Create death particles at pos with the given collisionbox.
|
||||
|
||||
|
||||
Making Arrows
|
||||
-------------
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
name = mcl_mobs
|
||||
optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor
|
||||
depends = mcl_particles
|
||||
optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor, mcl_portals
|
||||
|
|
|
@ -22,7 +22,7 @@ mobs:register_mob("mobs_mc:blaze", {
|
|||
textures = {
|
||||
{"mobs_mc_blaze.png"},
|
||||
},
|
||||
armor = { fleshy = 100, snowball_vulnerable = 100 },
|
||||
armor = { fleshy = 100, snowball_vulnerable = 100, water_vulnerable = 100 },
|
||||
visual_size = {x=3, y=3},
|
||||
sounds = {
|
||||
random = "mobs_mc_blaze_breath",
|
||||
|
|
|
@ -35,10 +35,11 @@ local cow_def = {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
stand_speed = 25, walk_speed = 25, run_speed = 50,
|
||||
stand_start = 0, stand_end = 0,
|
||||
walk_start = 0, walk_end = 40,
|
||||
run_start = 0, run_end = 40,
|
||||
stand_speed = 25, walk_speed = 40,
|
||||
run_speed = 60, stand_start = 0,
|
||||
stand_end = 0, walk_start = 0,
|
||||
walk_end = 40, run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
follow = mobs_mc.follow.cow,
|
||||
on_rightclick = function(self, clicker)
|
||||
|
|
|
@ -81,6 +81,7 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
local r = math.random(1, #mobs_mc.items.music_discs)
|
||||
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[r])
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
maxdrops = 2,
|
||||
drops = {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
mcl_init
|
||||
mcl_particles
|
||||
default?
|
||||
mcl_mobs
|
||||
mcl_tnt?
|
||||
|
|
|
@ -267,8 +267,8 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
self.state = ""
|
||||
else
|
||||
if self.attack then
|
||||
target = self.attack
|
||||
pos = target:get_pos()
|
||||
local target = self.attack
|
||||
local pos = target:get_pos()
|
||||
if pos ~= nil then
|
||||
if vector.distance(self.object:get_pos(), target:get_pos()) > 10 then
|
||||
self:teleport(target)
|
||||
|
@ -507,6 +507,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
if self._taken_node ~= nil and self._taken_node ~= "" then
|
||||
minetest.add_item(pos, self._taken_node)
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
do_punch = function(self, hitter, tflp, tool_caps, dir)
|
||||
-- damage from rain caused by itself so we don't want it to attack itself.
|
||||
|
@ -520,6 +521,7 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
end
|
||||
end
|
||||
end,
|
||||
armor = { fleshy = 100, water_vulnerable = 100 },
|
||||
water_damage = 8,
|
||||
view_range = 64,
|
||||
fear_height = 4,
|
||||
|
|
|
@ -96,7 +96,7 @@ local horse = {
|
|||
walk_speed = 25,
|
||||
walk_start = 0,
|
||||
walk_end = 40,
|
||||
run_speed = 50,
|
||||
run_speed = 60,
|
||||
run_start = 0,
|
||||
run_end = 40,
|
||||
},
|
||||
|
@ -175,6 +175,8 @@ local horse = {
|
|||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
|
||||
end,
|
||||
|
||||
on_rightclick = function(self, clicker)
|
||||
|
|
|
@ -46,6 +46,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
runaway = true,
|
||||
walk_velocity = 1,
|
||||
run_velocity = 4.4,
|
||||
follow_velocity = 4.4,
|
||||
floats = 1,
|
||||
drops = {
|
||||
{name = mobs_mc.items.leather,
|
||||
|
@ -61,6 +62,9 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
},
|
||||
animation = {
|
||||
speed_normal = 24,
|
||||
run_speed = 60,
|
||||
run_start = 0,
|
||||
run_end = 40,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
walk_start = 0,
|
||||
|
@ -107,6 +111,7 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
|
||||
end,
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ local ocelot = {
|
|||
walk_chance = default_walk_chance,
|
||||
walk_velocity = 1,
|
||||
run_velocity = 3,
|
||||
follow_velocity = 1,
|
||||
floats = 1,
|
||||
runaway = true,
|
||||
fall_damage = 0,
|
||||
|
@ -52,7 +53,7 @@ local ocelot = {
|
|||
},
|
||||
animation = {
|
||||
speed_normal = 25,
|
||||
speed_run = 50,
|
||||
run_speed = 50,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
walk_start = 0,
|
||||
|
@ -105,6 +106,7 @@ cat.order = "roam" -- "sit" or "roam"
|
|||
cat.owner_loyal = true
|
||||
cat.tamed = true
|
||||
cat.runaway = false
|
||||
cat.follow_velocity = 2.4
|
||||
-- Automatically teleport cat to owner
|
||||
cat.do_custom = mobs_mc.make_owner_teleport_function(12)
|
||||
cat.sounds = {
|
||||
|
|
|
@ -20,6 +20,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
makes_footstep_sound = true,
|
||||
walk_velocity = 1,
|
||||
run_velocity = 3,
|
||||
follow_velocity = 3.4,
|
||||
drops = {
|
||||
{name = mobs_mc.items.porkchop_raw,
|
||||
chance = 1,
|
||||
|
@ -36,7 +37,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
animation = {
|
||||
stand_speed = 40,
|
||||
walk_speed = 40,
|
||||
run_speed = 50,
|
||||
run_speed = 90,
|
||||
stand_start = 0,
|
||||
stand_end = 0,
|
||||
walk_start = 0,
|
||||
|
@ -45,7 +46,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
run_end = 40,
|
||||
},
|
||||
follow = mobs_mc.follow.pig,
|
||||
view_range = 5,
|
||||
view_range = 8,
|
||||
do_custom = function(self, dtime)
|
||||
|
||||
-- set needed values if not already present
|
||||
|
@ -78,7 +79,7 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
|
||||
on_rightclick = function(self, clicker)
|
||||
|
|
|
@ -27,6 +27,7 @@ local rabbit = {
|
|||
makes_footstep_sound = false,
|
||||
walk_velocity = 1,
|
||||
run_velocity = 3.7,
|
||||
follow_velocity = 1.1,
|
||||
floats = 1,
|
||||
runaway = true,
|
||||
jump = true,
|
||||
|
|
|
@ -76,7 +76,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
distance = 16,
|
||||
},
|
||||
animation = {
|
||||
speed_normal = 25, speed_run = 50,
|
||||
speed_normal = 25, run_speed = 65,
|
||||
stand_start = 40, stand_end = 80,
|
||||
walk_start = 0, walk_end = 40,
|
||||
run_start = 0, run_end = 40,
|
||||
|
|
|
@ -75,6 +75,6 @@ mobs:register_arrow("mobs_mc:shulkerbullet", {
|
|||
})
|
||||
|
||||
|
||||
mobs:register_egg("mobs_mc:shulker", S("Schulker"), "mobs_mc_spawn_icon_shulker.png", 0)
|
||||
mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0)
|
||||
|
||||
mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max)
|
||||
|
|
|
@ -31,6 +31,7 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
fall_damage = 0,
|
||||
water_damage = 4,
|
||||
rain_damage = 4,
|
||||
armor = { fleshy = 100, water_vulnerable = 100 },
|
||||
attacks_monsters = true,
|
||||
collisionbox = {-0.35, -0.01, -0.35, 0.35, 1.89, 0.35},
|
||||
visual = "mesh",
|
||||
|
@ -127,6 +128,26 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
end,
|
||||
})
|
||||
|
||||
local summon_particles = function(obj)
|
||||
local lua = obj:get_luaentity()
|
||||
local min = {x=lua.collisionbox[1], y=lua.collisionbox[2], z=lua.collisionbox[3]}
|
||||
local max = {x=lua.collisionbox[4], y=lua.collisionbox[5], z=lua.collisionbox[6]}
|
||||
local pos = obj:get_pos()
|
||||
minetest.add_particlespawner({
|
||||
amount = 60,
|
||||
time = 0.1,
|
||||
minpos = vector.add(pos, min),
|
||||
maxpos = vector.add(pos, max),
|
||||
minvel = {x = -0.1, y = -0.1, z = -0.1},
|
||||
maxvel = {x = 0.1, y = 0.1, z = 0.1},
|
||||
minexptime = 1.0,
|
||||
maxexptime = 2.0,
|
||||
minsize = 2.0,
|
||||
maxsize = 3.0,
|
||||
texture = "mcl_particles_smoke.png",
|
||||
})
|
||||
end
|
||||
|
||||
-- This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function
|
||||
-- of the node.
|
||||
-- This summons a snow golen when pos is next to a row of two snow blocks.
|
||||
|
@ -156,7 +177,10 @@ mobs_mc.tools.check_snow_golem_summon = function(pos)
|
|||
core.check_for_falling(pos)
|
||||
core.check_for_falling(b1)
|
||||
core.check_for_falling(b2)
|
||||
minetest.add_entity(place, "mobs_mc:snowman")
|
||||
local obj = minetest.add_entity(place, "mobs_mc:snowman")
|
||||
if obj then
|
||||
summon_particles(obj)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1053,6 +1053,7 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
return_fields(player)
|
||||
end
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
})
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ dog.owner = ""
|
|||
-- TODO: Start sitting by default
|
||||
dog.order = "roam"
|
||||
dog.owner_loyal = true
|
||||
dog.follow_velocity = 3.2
|
||||
-- Automatically teleport dog to owner
|
||||
dog.do_custom = mobs_mc.make_owner_teleport_function(12)
|
||||
dog.follow = mobs_mc.follow.dog
|
||||
|
|
|
@ -129,9 +129,10 @@ mobs_mc.override.items = {
|
|||
},
|
||||
}
|
||||
|
||||
--Horses, Llamas, and Wolves shouldn't follow, but leaving this alone until leads are implemented.
|
||||
mobs_mc.override.follow = {
|
||||
chicken = { "mcl_farming:wheat_seeds", "mcl_farming:melon_seeds", "mcl_farming:pumpkin_seeds", "mcl_farming:beetroot_seeds", },
|
||||
parrot = { "mcl_farming:seed_wheat", "mcl_farming:seed_beetroot", "mcl_farming:seed_pumpkin", "mcl_farming:seed_melon" }, -- seeds in general
|
||||
parrot = { "mcl_farming:wheat_seeds", "mcl_farming:melon_seeds", "mcl_farming:pumpkin_seeds", "mcl_farming:beetroot_seeds", },
|
||||
pig = { mobs_mc.override.items.potato, mobs_mc.override.items.carrot, "mcl_farming:beetroot_item", mobs_mc.override.items.carrot_on_a_stick},
|
||||
ocelot = { mobs_mc.override.items.fish_raw, mobs_mc.override.items.salmon_raw, mobs_mc.override.items.clownfish_raw, mobs_mc.override.items.pufferfish_raw, },
|
||||
sheep = { mobs_mc.override.items.wheat },
|
||||
|
|
|
@ -13,8 +13,8 @@ minetest.register_on_mods_loaded(function()
|
|||
if not on_step_old then
|
||||
on_step_old = function() end
|
||||
end
|
||||
local on_step = function(self, dtime)
|
||||
on_step_old(self, dtime)
|
||||
local on_step = function(self, dtime, moveresult)
|
||||
on_step_old(self, dtime, moveresult)
|
||||
local obj = self.object
|
||||
local pos = obj:get_pos()
|
||||
-- Old on_step function might have deleted object,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
local mods_loaded = false
|
||||
local NIGHT_VISION_RATIO = 0.45
|
||||
|
||||
mcl_weather.skycolor = {
|
||||
-- Should be activated before do any effect.
|
||||
|
@ -51,6 +52,27 @@ mcl_weather.skycolor = {
|
|||
end
|
||||
end,
|
||||
|
||||
-- Wrapper for updating day/night ratio that respects night vision
|
||||
override_day_night_ratio = function(player, ratio)
|
||||
local meta = player:get_meta()
|
||||
local has_night_vision = meta:get_int("night_vision") == 1
|
||||
local arg
|
||||
-- Apply night vision only for dark sky
|
||||
local is_dark = minetest.get_timeofday() > 0.8 or minetest.get_timeofday() < 0.2 or mcl_weather.state ~= "none"
|
||||
local pos = player:get_pos()
|
||||
local dim = mcl_worlds.pos_to_dimension(pos)
|
||||
if has_night_vision and is_dark and dim ~= "nether" and dim ~= "end" then
|
||||
if ratio == nil then
|
||||
arg = NIGHT_VISION_RATIO
|
||||
else
|
||||
arg = math.max(ratio, NIGHT_VISION_RATIO)
|
||||
end
|
||||
else
|
||||
arg = ratio
|
||||
end
|
||||
player:override_day_night_ratio(arg)
|
||||
end,
|
||||
|
||||
-- Update sky color. If players not specified update sky for all players.
|
||||
update_sky_color = function(players)
|
||||
-- Override day/night ratio as well
|
||||
|
@ -76,7 +98,7 @@ mcl_weather.skycolor = {
|
|||
player:set_sun({visible = true, sunrise_visible = true})
|
||||
player:set_moon({visible = true})
|
||||
player:set_stars({visible = true})
|
||||
player:override_day_night_ratio(nil)
|
||||
mcl_weather.skycolor.override_day_night_ratio(player, nil)
|
||||
else
|
||||
-- Weather skies
|
||||
local day_color = mcl_weather.skycolor.get_sky_layer_color(0.5)
|
||||
|
@ -99,7 +121,7 @@ mcl_weather.skycolor = {
|
|||
|
||||
local lf = mcl_weather.get_current_light_factor()
|
||||
if mcl_weather.skycolor.current_layer_name() == "lightning" then
|
||||
player:override_day_night_ratio(1)
|
||||
mcl_weather.skycolor.override_day_night_ratio(player, 1)
|
||||
elseif lf then
|
||||
local w = minetest.get_timeofday()
|
||||
local light = (w * (lf*2))
|
||||
|
@ -107,9 +129,9 @@ mcl_weather.skycolor = {
|
|||
light = 1 - (light - 1)
|
||||
end
|
||||
light = (light * lf) + 0.15
|
||||
player:override_day_night_ratio(light)
|
||||
mcl_weather.skycolor.override_day_night_ratio(player, light)
|
||||
else
|
||||
player:override_day_night_ratio(nil)
|
||||
mcl_weather.skycolor.override_day_night_ratio(player, nil)
|
||||
end
|
||||
end
|
||||
elseif dim == "end" then
|
||||
|
@ -122,7 +144,7 @@ mcl_weather.skycolor = {
|
|||
player:set_sun({visible = false , sunrise_visible = false})
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = false})
|
||||
player:override_day_night_ratio(0.5)
|
||||
mcl_weather.skycolor.override_day_night_ratio(player, 0.5)
|
||||
elseif dim == "nether" then
|
||||
player:set_sky({ type = "plain",
|
||||
base_color = "#300808",
|
||||
|
@ -131,7 +153,7 @@ mcl_weather.skycolor = {
|
|||
player:set_sun({visible = false , sunrise_visible = false})
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = false})
|
||||
player:override_day_night_ratio(nil)
|
||||
mcl_weather.skycolor.override_day_night_ratio(player, nil)
|
||||
elseif dim == "void" then
|
||||
player:set_sky({ type = "plain",
|
||||
base_color = "#000000",
|
||||
|
|
|
@ -1,103 +1,2 @@
|
|||
local S = minetest.get_translator("mcl_tt")
|
||||
|
||||
-- Armor
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
local s = ""
|
||||
local head = minetest.get_item_group(itemstring, "armor_head")
|
||||
local torso = minetest.get_item_group(itemstring, "armor_torso")
|
||||
local legs = minetest.get_item_group(itemstring, "armor_legs")
|
||||
local feet = minetest.get_item_group(itemstring, "armor_feet")
|
||||
if head > 0 then
|
||||
s = s .. S("Head armor")
|
||||
end
|
||||
if torso > 0 then
|
||||
s = s .. S("Torso armor")
|
||||
end
|
||||
if legs > 0 then
|
||||
s = s .. S("Legs armor")
|
||||
end
|
||||
if feet > 0 then
|
||||
s = s .. S("Feet armor")
|
||||
end
|
||||
if s == "" then
|
||||
s = nil
|
||||
end
|
||||
return s
|
||||
end)
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
local s = ""
|
||||
local use = minetest.get_item_group(itemstring, "mcl_armor_uses")
|
||||
local pts = minetest.get_item_group(itemstring, "mcl_armor_points")
|
||||
if pts > 0 then
|
||||
s = s .. S("Armor points: @1", pts)
|
||||
s = s .. "\n"
|
||||
end
|
||||
if use > 0 then
|
||||
s = s .. S("Armor durability: @1", use)
|
||||
end
|
||||
if s == "" then
|
||||
s = nil
|
||||
end
|
||||
return s
|
||||
end)
|
||||
-- Horse armor
|
||||
tt.register_snippet(function(itemstring)
|
||||
local armor_g = minetest.get_item_group(itemstring, "horse_armor")
|
||||
if armor_g and armor_g > 0 then
|
||||
return S("Protection: @1%", 100 - armor_g)
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
local s = ""
|
||||
if def.groups.eatable and def.groups.eatable > 0 then
|
||||
s = s .. S("Hunger points: +@1", def.groups.eatable)
|
||||
end
|
||||
if def._mcl_saturation and def._mcl_saturation > 0 then
|
||||
if s ~= "" then
|
||||
s = s .. "\n"
|
||||
end
|
||||
s = s .. S("Saturation points: +@1", string.format("%.1f", def._mcl_saturation))
|
||||
end
|
||||
if s == "" then
|
||||
s = nil
|
||||
end
|
||||
return s
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then
|
||||
return S("Deals damage when falling"), "#FFFF00"
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if def.groups.place_flowerlike == 1 then
|
||||
return S("Grows on grass blocks or dirt")
|
||||
elseif def.groups.place_flowerlike == 2 then
|
||||
return S("Grows on grass blocks, podzol, dirt or coarse dirt")
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if def.groups.flammable then
|
||||
return S("Flammable")
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
if itemstring == "mcl_heads:zombie" then
|
||||
return S("Zombie view range: -50%")
|
||||
elseif itemstring == "mcl_heads:skeleton" then
|
||||
return S("Skeleton view range: -50%")
|
||||
elseif itemstring == "mcl_heads:creeper" then
|
||||
return S("Creeper view range: -50%")
|
||||
end
|
||||
end)
|
||||
|
||||
dofile(minetest.get_modpath("mcl_tt").."/snippets_base.lua")
|
||||
dofile(minetest.get_modpath("mcl_tt").."/snippets_mcl.lua")
|
||||
|
|
|
@ -15,3 +15,33 @@ Flammable=Entzündlich
|
|||
Zombie view range: -50%=Zombiesichtweite: -50%
|
||||
Skeleton view range: -50%=Skelettsichtweite: -50%
|
||||
Creeper view range: -50%=Creepersichtweite: -50%
|
||||
Damage: @1=Schaden: @1
|
||||
Damage (@1): @2=Schaden (@1): @2
|
||||
Healing: @1=Heilung: @1
|
||||
Healing (@1): @2=Heilung (@1): @2
|
||||
Full punch interval: @1s=Zeit zum Ausholen: @1s
|
||||
Contact damage: @1 per second=Kontaktschaden: @1 pro Sekunde
|
||||
Contact healing: @1 per second=Kontaktheilung: @1 pro Sekunde
|
||||
Drowning damage: @1=Ertrinkensschaden: @1
|
||||
Bouncy (@1%)=Sprunghaft (@1%)
|
||||
Luminance: @1=Lichtstärke: @1
|
||||
Slippery=Rutschig
|
||||
Climbable=Erkletterbar
|
||||
Climbable (only downwards)=Erkletterbar (nur nach unten)
|
||||
No jumping=Kein Springen
|
||||
No swimming upwards=Kein nach oben schwimmen
|
||||
No rising=Kein Aufsteigen
|
||||
Fall damage: @1%=Fallschaden: @1%
|
||||
Fall damage: +@1%=Fallschaden: +@1%
|
||||
No fall damage=Kein Fallschaden
|
||||
Mining speed: @1=Grabegeschwindigkeit: @1
|
||||
Very fast=Sehr schnell
|
||||
Extremely fast=Extrem schnell
|
||||
Fast=Schnell
|
||||
Slow=Langsam
|
||||
Very slow=Sehr langsam
|
||||
Painfully slow=Furchtbar langsam
|
||||
Mining durability: @1=Grabehaltbarkeit: @1
|
||||
Block breaking strength: @1=Blockbruchstärke: @1
|
||||
@1 uses=@1 Verwendungen
|
||||
Unlimited uses=Unbegrenzte Verwendungen
|
||||
|
|
|
@ -15,3 +15,33 @@ Flammable=Inflammable
|
|||
Zombie view range: -50%=Distance de vue de Zombie: -50%
|
||||
Skeleton view range: -50%=Distance de vue de Squelette: -50%
|
||||
Creeper view range: -50%=Distance de vue de Creeper: -50%
|
||||
Damage: @1=Dégâts: @1
|
||||
Damage (@1): @2=Dégâts (@1): @2
|
||||
Healing: @1=Guérison: @1
|
||||
Healing (@1): @2=Guérison (@1): @2
|
||||
Full punch interval: @1s=Intervalle de coup: @1s
|
||||
Contact damage: @1 per second=Dégâts de contact: @1 par seconde
|
||||
Contact healing: @1 per second=Guérison de contact: @1 par seconde
|
||||
Drowning damage: @1=Dégâts de noyade: @1
|
||||
Bouncy (@1%)=Rebondissant (@1%)
|
||||
Luminance: @1=Luminance: @1
|
||||
Slippery=Glissant
|
||||
Climbable=Grimpable
|
||||
Climbable (only downwards)=Grimpable (uniquement vers le bas)
|
||||
No jumping=Ne pas sauter
|
||||
No swimming upwards=Ne pas nager vers le haut
|
||||
No rising=Pas de montée
|
||||
Fall damage: @1%=Dégâts de chute: @1%
|
||||
Fall damage: +@1%=Dégâts de chute: +@1%
|
||||
No fall damage=Pas de dégâts de chute
|
||||
Mining speed: @1=Vitesse de minage: @1
|
||||
Very fast=Très rapide
|
||||
Extremely fast=Extremement rapide
|
||||
Fast=Rapide
|
||||
Slow=Lent
|
||||
Very slow=Très lent
|
||||
Painfully slow=Péniblement lent
|
||||
Mining durability: @1=Durabilité de minage: @1
|
||||
Block breaking strength: @1=Résistance à la rupture: @1
|
||||
@1 uses=@1 utilisations
|
||||
Unlimited uses=Utilisations illimitées
|
||||
|
|
|
@ -15,3 +15,33 @@ Flammable=Легковоспламенимо
|
|||
Zombie view range: -50%=Дальность зрения зомби: -50%
|
||||
Skeleton view range: -50%=Дальность зрения скелета: -50%
|
||||
Creeper view range: -50%=Дальность зрения крипера: -50%
|
||||
Damage: @1=Урон: @1
|
||||
Damage (@1): @2=Урон (@1): @2
|
||||
Healing: @1=Исцеление: @1
|
||||
Healing (@1): @2=Исцеление (@1): @2
|
||||
Full punch interval: @1s=Интервал полного удара: @1 с
|
||||
Contact damage: @1 per second=Урон при контакте: @1 в секунду
|
||||
Contact healing: @1 per second=Исцеление при контакте: @1 в секунду
|
||||
Drowning damage: @1=Урон при падении: @1
|
||||
Bouncy (@1%)=Упругость (@1%)
|
||||
Luminance: @1=Свечение: @1
|
||||
Slippery=Скользкость
|
||||
Climbable=Можно карабкаться
|
||||
Climbable (only downwards)=Можно спускаться
|
||||
No jumping=Нельзя прыгать
|
||||
No swimming upwards=Нельзя плыть вверх
|
||||
No rising=Нельзя подниматься
|
||||
Fall damage: @1%=Урон при падении: @1%
|
||||
Fall damage: +@1%=Урон при падении: +@1%
|
||||
No fall damage=Нет урона при падении
|
||||
Mining speed: @1=Скорость добычи: @1
|
||||
Very fast=очень высокая
|
||||
Extremely fast=ужасно высокая
|
||||
Fast=высокая
|
||||
Slow=низкая
|
||||
Very slow=очень низкая
|
||||
Painfully slow=мучительно низкая
|
||||
Mining durability: @1=Долговечность добычи: @1
|
||||
Block breaking strength: @1=Сила разбиения блоков: @1
|
||||
@1 uses=@1 раз(а)
|
||||
Unlimited uses=не ограничено
|
||||
|
|
|
@ -15,3 +15,33 @@ Flammable=
|
|||
Zombie view range: -50%=
|
||||
Skeleton view range: -50%=
|
||||
Creeper view range: -50%=
|
||||
Damage: @1=
|
||||
Damage (@1): @2=
|
||||
Healing: @1=
|
||||
Healing (@1): @2=
|
||||
Full punch interval: @1s=
|
||||
Contact damage: @1 per second=
|
||||
Contact healing: @1 per second=
|
||||
Drowning damage: @1=
|
||||
Bouncy (@1%)=
|
||||
Luminance: @1=
|
||||
Slippery=
|
||||
Climbable=
|
||||
Climbable (only downwards)=
|
||||
No jumping=
|
||||
No swimming upwards=
|
||||
No rising=
|
||||
Fall damage: @1%=
|
||||
Fall damage: +@1%=
|
||||
No fall damage=
|
||||
Mining speed: @1=
|
||||
Very fast=
|
||||
Extremely fast=
|
||||
Fast=
|
||||
Slow=
|
||||
Very slow=
|
||||
Painfully slow=
|
||||
Mining durability: @1=
|
||||
Block breaking strength: @1=
|
||||
@1 uses=
|
||||
Unlimited uses=
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
local S = minetest.get_translator("tt")
|
||||
local S = minetest.get_translator("mcl_tt")
|
||||
|
||||
local function get_min_digtime(caps)
|
||||
local mintime
|
|
@ -0,0 +1,103 @@
|
|||
local S = minetest.get_translator("mcl_tt")
|
||||
|
||||
-- Armor
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
local s = ""
|
||||
local head = minetest.get_item_group(itemstring, "armor_head")
|
||||
local torso = minetest.get_item_group(itemstring, "armor_torso")
|
||||
local legs = minetest.get_item_group(itemstring, "armor_legs")
|
||||
local feet = minetest.get_item_group(itemstring, "armor_feet")
|
||||
if head > 0 then
|
||||
s = s .. S("Head armor")
|
||||
end
|
||||
if torso > 0 then
|
||||
s = s .. S("Torso armor")
|
||||
end
|
||||
if legs > 0 then
|
||||
s = s .. S("Legs armor")
|
||||
end
|
||||
if feet > 0 then
|
||||
s = s .. S("Feet armor")
|
||||
end
|
||||
if s == "" then
|
||||
s = nil
|
||||
end
|
||||
return s
|
||||
end)
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
local s = ""
|
||||
local use = minetest.get_item_group(itemstring, "mcl_armor_uses")
|
||||
local pts = minetest.get_item_group(itemstring, "mcl_armor_points")
|
||||
if pts > 0 then
|
||||
s = s .. S("Armor points: @1", pts)
|
||||
s = s .. "\n"
|
||||
end
|
||||
if use > 0 then
|
||||
s = s .. S("Armor durability: @1", use)
|
||||
end
|
||||
if s == "" then
|
||||
s = nil
|
||||
end
|
||||
return s
|
||||
end)
|
||||
-- Horse armor
|
||||
tt.register_snippet(function(itemstring)
|
||||
local armor_g = minetest.get_item_group(itemstring, "horse_armor")
|
||||
if armor_g and armor_g > 0 then
|
||||
return S("Protection: @1%", 100 - armor_g)
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
local s = ""
|
||||
if def.groups.eatable and def.groups.eatable > 0 then
|
||||
s = s .. S("Hunger points: +@1", def.groups.eatable)
|
||||
end
|
||||
if def._mcl_saturation and def._mcl_saturation > 0 then
|
||||
if s ~= "" then
|
||||
s = s .. "\n"
|
||||
end
|
||||
s = s .. S("Saturation points: +@1", string.format("%.1f", def._mcl_saturation))
|
||||
end
|
||||
if s == "" then
|
||||
s = nil
|
||||
end
|
||||
return s
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then
|
||||
return S("Deals damage when falling"), "#FFFF00"
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if def.groups.place_flowerlike == 1 then
|
||||
return S("Grows on grass blocks or dirt")
|
||||
elseif def.groups.place_flowerlike == 2 then
|
||||
return S("Grows on grass blocks, podzol, dirt or coarse dirt")
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if def.groups.flammable then
|
||||
return S("Flammable")
|
||||
end
|
||||
end)
|
||||
|
||||
tt.register_snippet(function(itemstring)
|
||||
if itemstring == "mcl_heads:zombie" then
|
||||
return S("Zombie view range: -50%")
|
||||
elseif itemstring == "mcl_heads:skeleton" then
|
||||
return S("Skeleton view range: -50%")
|
||||
elseif itemstring == "mcl_heads:creeper" then
|
||||
return S("Creeper view range: -50%")
|
||||
end
|
||||
end)
|
||||
|
|
@ -7,8 +7,6 @@ Add these to the item definition.
|
|||
|
||||
* `_tt_ignore`: If `true`, the `description` of this item won't be altered at all
|
||||
* `_tt_help`: Custom help text
|
||||
* `_tt_food`: If `true`, item is a food item that can be consumed by the player
|
||||
* `_tt_food_hp`: Health increase (in HP) for player when consuming food item
|
||||
|
||||
Once this mod had overwritten the `description` field of an item was overwritten, it will save the original (unaltered) `description` in the `_tt_original_description` field.
|
||||
|
||||
|
|
|
@ -1,12 +1,8 @@
|
|||
# Extended Tooltip (`tt`)
|
||||
This mod extends the tooltip of items to add more informative texts.
|
||||
|
||||
It displays the following useful information:
|
||||
* Weapon damage and speed
|
||||
* Tool properties
|
||||
* Noteworthy block properties
|
||||
* Food satiation
|
||||
* Custom help text (added by mods)
|
||||
The mod itself does nothing and is meant to be integrated into
|
||||
games to use the API to define custom tooltips (see `API.md`).
|
||||
|
||||
## License
|
||||
MIT License.
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
local S = minetest.get_translator("tt")
|
||||
|
||||
tt = {}
|
||||
tt.COLOR_DEFAULT = "#d0ffd0"
|
||||
tt.COLOR_DANGER = "#ffff00"
|
||||
|
@ -12,10 +10,7 @@ tt.register_snippet = function(func)
|
|||
table.insert(tt.registered_snippets, func)
|
||||
end
|
||||
|
||||
-- Register core snippets
|
||||
|
||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets_core.lua")
|
||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets_builtin.lua")
|
||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets.lua")
|
||||
|
||||
-- Apply item description updates
|
||||
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
# textdomain:tt
|
||||
Damage: @1=
|
||||
Damage (@1): @2=
|
||||
Healing: @1=
|
||||
Healing (@1): @2=
|
||||
Full punch interval: @1s=
|
||||
Contact damage: @1 per second=
|
||||
Contact healing: @1 per second=
|
||||
Drowning damage: @1=
|
||||
Bouncy (@1%)=
|
||||
Luminance: @1=
|
||||
Slippery=
|
||||
Climbable=
|
||||
Climbable (only downwards)=
|
||||
No jumping=
|
||||
No swimming upwards=
|
||||
No rising=
|
||||
Fall damage: @1%=
|
||||
Fall damage: +@1%=
|
||||
No fall damage=
|
||||
Mining speed: @1=
|
||||
Very fast=
|
||||
Extremely fast=
|
||||
Fast=
|
||||
Slow=
|
||||
Very slow=
|
||||
Painfully slow=
|
||||
Mining durability: @1=
|
||||
Block breaking strength: @1=
|
||||
@1 uses=
|
||||
Unlimited uses=
|
|
@ -1,31 +0,0 @@
|
|||
# textdomain:tt
|
||||
Damage: @1=Schaden: @1
|
||||
Damage (@1): @2=Schaden (@1): @2
|
||||
Healing: @1=Heilung: @1
|
||||
Healing (@1): @2=Heilung (@1): @2
|
||||
Full punch interval: @1s=Zeit zum Ausholen: @1s
|
||||
Contact damage: @1 per second=Kontaktschaden: @1 pro Sekunde
|
||||
Contact healing: @1 per second=Kontaktheilung: @1 pro Sekunde
|
||||
Drowning damage: @1=Ertrinkensschaden: @1
|
||||
Bouncy (@1%)=Sprunghaft (@1%)
|
||||
Luminance: @1=Lichtstärke: @1
|
||||
Slippery=Rutschig
|
||||
Climbable=Erkletterbar
|
||||
Climbable (only downwards)=Erkletterbar (nur nach unten)
|
||||
No jumping=Kein Springen
|
||||
No swimming upwards=Kein nach oben schwimmen
|
||||
No rising=Kein Aufsteigen
|
||||
Fall damage: @1%=Fallschaden: @1%
|
||||
Fall damage: +@1%=Fallschaden: +@1%
|
||||
No fall damage=Kein Fallschaden
|
||||
Mining speed: @1=Grabegeschwindigkeit: @1
|
||||
Very fast=Sehr schnell
|
||||
Extremely fast=Extrem schnell
|
||||
Fast=Schnell
|
||||
Slow=Langsam
|
||||
Very slow=Sehr langsam
|
||||
Painfully slow=Furchtbar langsam
|
||||
Mining durability: @1=Grabehaltbarkeit: @1
|
||||
Block breaking strength: @1=Blockbruchstärke: @1
|
||||
@1 uses=@1 Verwendungen
|
||||
Unlimited uses=Unbegrenzte Verwendungen
|
|
@ -1,31 +0,0 @@
|
|||
# textdomain:tt
|
||||
Damage: @1=Dégâts: @1
|
||||
Damage (@1): @2=Dégâts (@1): @2
|
||||
Healing: @1=Guérison: @1
|
||||
Healing (@1): @2=Guérison (@1): @2
|
||||
Full punch interval: @1s=Intervalle de coup: @1s
|
||||
Contact damage: @1 per second=Dégâts de contact: @1 par seconde
|
||||
Contact healing: @1 per second=Guérison de contact: @1 par seconde
|
||||
Drowning damage: @1=Dégâts de noyade: @1
|
||||
Bouncy (@1%)=Rebondissant (@1%)
|
||||
Luminance: @1=Luminance: @1
|
||||
Slippery=Glissant
|
||||
Climbable=Grimpable
|
||||
Climbable (only downwards)=Grimpable (uniquement vers le bas)
|
||||
No jumping=Ne pas sauter
|
||||
No swimming upwards=Ne pas nager vers le haut
|
||||
No rising=Pas de montée
|
||||
Fall damage: @1%=Dégâts de chute: @1%
|
||||
Fall damage: +@1%=Dégâts de chute: +@1%
|
||||
No fall damage=Pas de dégâts de chute
|
||||
Mining speed: @1=Vitesse de minage: @1
|
||||
Very fast=Très rapide
|
||||
Extremely fast=Extremement rapide
|
||||
Fast=Rapide
|
||||
Slow=Lent
|
||||
Very slow=Très lent
|
||||
Painfully slow=Péniblement lent
|
||||
Mining durability: @1=Durabilité de minage: @1
|
||||
Block breaking strength: @1=Résistance à la rupture: @1
|
||||
@1 uses=@1 utilisations
|
||||
Unlimited uses=Utilisations illimitées
|
|
@ -1,31 +0,0 @@
|
|||
# textdomain:tt
|
||||
Damage: @1=Урон: @1
|
||||
Damage (@1): @2=Урон (@1): @2
|
||||
Healing: @1=Исцеление: @1
|
||||
Healing (@1): @2=Исцеление (@1): @2
|
||||
Full punch interval: @1s=Интервал полного удара: @1 с
|
||||
Contact damage: @1 per second=Урон при контакте: @1 в секунду
|
||||
Contact healing: @1 per second=Исцеление при контакте: @1 в секунду
|
||||
Drowning damage: @1=Урон при падении: @1
|
||||
Bouncy (@1%)=Упругость (@1%)
|
||||
Luminance: @1=Свечение: @1
|
||||
Slippery=Скользкость
|
||||
Climbable=Можно карабкаться
|
||||
Climbable (only downwards)=Можно спускаться
|
||||
No jumping=Нельзя прыгать
|
||||
No swimming upwards=Нельзя плыть вверх
|
||||
No rising=Нельзя подниматься
|
||||
Fall damage: @1%=Урон при падении: @1%
|
||||
Fall damage: +@1%=Урон при падении: +@1%
|
||||
No fall damage=Нет урона при падении
|
||||
Mining speed: @1=Скорость добычи: @1
|
||||
Very fast=очень высокая
|
||||
Extremely fast=ужасно высокая
|
||||
Fast=высокая
|
||||
Slow=низкая
|
||||
Very slow=очень низкая
|
||||
Painfully slow=мучительно низкая
|
||||
Mining durability: @1=Долговечность добычи: @1
|
||||
Block breaking strength: @1=Сила разбиения блоков: @1
|
||||
@1 uses=@1 раз(а)
|
||||
Unlimited uses=не ограничено
|
|
@ -1,2 +1,2 @@
|
|||
name = tt
|
||||
description = Appends a helpful tooltip to the item description
|
||||
description = Support for custom tooltip extensions for items
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
-- CORE SNIPPETS --
|
||||
-- CUSTOM SNIPPETS --
|
||||
|
||||
-- Custom text (_tt_help)
|
||||
tt.register_snippet(function(itemstring)
|
|
@ -7,6 +7,7 @@ Building Blocks=Baublöcke
|
|||
Decoration Blocks=Dekoblöcke
|
||||
Redstone=Redstone
|
||||
Transportation=Transport
|
||||
Brewing=Gebräu
|
||||
Miscellaneous=Sonstiges
|
||||
Search Items=Gegenstände durchsuchen
|
||||
Foodstuffs=Lebensmittel
|
||||
|
|
|
@ -7,6 +7,7 @@ Building Blocks=Bloques de construcción
|
|||
Decoration Blocks=Bloques de decoración
|
||||
Redstone=Redstone
|
||||
Transportation=Transporte
|
||||
Brewing=
|
||||
Miscellaneous=Variado
|
||||
Search Items=Buscar artículos
|
||||
Foodstuffs=Productos alimenticios
|
||||
|
|
|
@ -7,6 +7,7 @@ Building Blocks=Blocs de Construction
|
|||
Decoration Blocks=Blocs de Décoration
|
||||
Redstone=Redstone
|
||||
Transportation=Transport
|
||||
Brewing=
|
||||
Miscellaneous=Divers
|
||||
Search Items=Rechercher des objets
|
||||
Foodstuffs=Denrées alimentaires
|
||||
|
|
|
@ -7,6 +7,7 @@ Building Blocks=Строительные блоки
|
|||
Decoration Blocks=Декоративные блоки
|
||||
Redstone=Редстоун (красный камень)
|
||||
Transportation=Транспорт
|
||||
Brewing=Зелья
|
||||
Miscellaneous=Прочее
|
||||
Search Items=Искать предметы
|
||||
Foodstuffs=Продовольствие
|
||||
|
|
|
@ -7,6 +7,7 @@ Building Blocks=
|
|||
Decoration Blocks=
|
||||
Redstone=
|
||||
Transportation=
|
||||
Brewing=
|
||||
Miscellaneous=
|
||||
Search Items=
|
||||
Foodstuffs=
|
||||
|
|
|
@ -120,11 +120,13 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
|
|||
while #frontiers > 0 do
|
||||
local np = frontiers[1]
|
||||
local nn = minetest.get_node(np)
|
||||
|
||||
if nn.name == "ignore" then
|
||||
minetest.get_voxel_manip():read_from_map(np, np)
|
||||
nn = minetest.get_node(np)
|
||||
end
|
||||
if not node_replaceable(nn.name) then
|
||||
|
||||
if #nodes >= maximum then return nil end
|
||||
table.insert(nodes, {node = nn, pos = np})
|
||||
if #nodes > maximum then return nil end
|
||||
|
||||
-- add connected nodes to frontiers, connected is a vector list
|
||||
-- the vectors must be absolute positions
|
||||
|
@ -246,13 +248,6 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
|
|||
minetest.get_meta(np):from_table(n.meta)
|
||||
end
|
||||
|
||||
for i in ipairs(nodes) do
|
||||
if first_dropper and i >= first_dropper then
|
||||
break
|
||||
end
|
||||
nodes[i].pos = vector.add(nodes[i].pos, movedir)
|
||||
end
|
||||
|
||||
local moved_nodes = {}
|
||||
local oldstack = mesecon.tablecopy(nodes)
|
||||
for i in ipairs(nodes) do
|
||||
|
@ -272,12 +267,6 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
|
|||
return true, nodes, oldstack
|
||||
end
|
||||
|
||||
mesecon.register_on_mvps_move(function(moved_nodes)
|
||||
for _, n in ipairs(moved_nodes) do
|
||||
mesecon.on_placenode(n.pos, n.node)
|
||||
end
|
||||
end)
|
||||
|
||||
function mesecon.mvps_move_objects(pos, dir, nodestack)
|
||||
local objects_to_move = {}
|
||||
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
mesecons
|
||||
mcl_particles
|
||||
|
|
|
@ -98,6 +98,32 @@ local soundnames_piano = {
|
|||
"mesecons_noteblock_b2",
|
||||
}
|
||||
|
||||
local function param2_to_note_color(param2)
|
||||
local r, g, b
|
||||
if param2 < 8 then -- 0..7
|
||||
-- More red, less green
|
||||
r = param2 / 8 * 255
|
||||
g = (8-param2) / 8 * 255
|
||||
b = 0
|
||||
elseif param2 < 16 then -- 0..15
|
||||
-- More blue, less red
|
||||
r = (8-(param2 - 8)) / 8 * 255
|
||||
g = 0
|
||||
b = (param2 - 8) / 8 * 255
|
||||
else -- 16..24
|
||||
-- More green, less blue
|
||||
r = 0
|
||||
g = (param2 - 16) / 9 * 255
|
||||
b = (9-(param2 - 16)) / 9 * 255
|
||||
end
|
||||
r = math.floor(r)
|
||||
g = math.floor(g)
|
||||
b = math.floor(b)
|
||||
local color = 0x10000 * r + 0x100 * g + b
|
||||
-- Convert to ColorString
|
||||
return string.format("#%06X", color)
|
||||
end
|
||||
|
||||
mesecon.noteblock_play = function (pos, param2)
|
||||
local block_above_name = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name
|
||||
if block_above_name ~= "air" then
|
||||
|
@ -154,6 +180,17 @@ mesecon.noteblock_play = function (pos, param2)
|
|||
pitch = param2_to_pitch(param2)
|
||||
end
|
||||
|
||||
local note_color = param2_to_note_color(param2)
|
||||
|
||||
minetest.add_particle({
|
||||
texture = "mcl_particles_note.png^[colorize:"..note_color..":92",
|
||||
pos = { x = pos.x, y = pos.y + 0.35, z = pos.z },
|
||||
velocity = { x = 0, y = 2, z = 0 },
|
||||
acceleration = { x = 0, y = -2, z = 0 },
|
||||
expirationtime = 1.0,
|
||||
collisiondetection = false,
|
||||
size = 3,
|
||||
})
|
||||
minetest.sound_play(soundname,
|
||||
{pos = pos, gain = 1.0, max_hear_distance = 48, pitch = pitch})
|
||||
end
|
||||
|
|
|
@ -56,7 +56,7 @@ local torch_overheated = function(pos)
|
|||
velocity = {x = 0, y = 0.6, z = 0},
|
||||
expirationtime = 1.2,
|
||||
size = 1.5,
|
||||
texture = "tnt_smoke.png",
|
||||
texture = "mcl_particles_smoke.png",
|
||||
})
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(TORCH_COOLOFF)
|
||||
|
|
|
@ -212,6 +212,46 @@ local function drop_anvil_items(pos, meta)
|
|||
end
|
||||
end
|
||||
|
||||
local function damage_particles(pos, node)
|
||||
minetest.add_particlespawner({
|
||||
amount = 30,
|
||||
time = 0.1,
|
||||
minpos = vector.add(pos, {x=-0.5, y=-0.5, z=-0.5}),
|
||||
maxpos = vector.add(pos, {x=0.5, y=-0.25, z=0.5}),
|
||||
minvel = {x=-0.5, y=0.05, z=-0.5},
|
||||
maxvel = {x=0.5, y=0.3, z=0.5},
|
||||
minacc = {x=0, y=-9.81, z=0},
|
||||
maxacc = {x=0, y=-9.81, z=0},
|
||||
minexptime = 0.1,
|
||||
maxexptime = 0.5,
|
||||
minsize = 0.4,
|
||||
maxsize = 0.5,
|
||||
collisiondetection = true,
|
||||
vertical = false,
|
||||
node = node,
|
||||
})
|
||||
end
|
||||
|
||||
local function destroy_particles(pos, node)
|
||||
minetest.add_particlespawner({
|
||||
amount = math.random(20, 30),
|
||||
time = 0.1,
|
||||
minpos = vector.add(pos, {x=-0.4, y=-0.4, z=-0.4}),
|
||||
maxpos = vector.add(pos, {x=0.4, y=0.4, z=0.4}),
|
||||
minvel = {x=-0.5, y=-0.1, z=-0.5},
|
||||
maxvel = {x=0.5, y=0.2, z=0.5},
|
||||
minacc = {x=0, y=-9.81, z=0},
|
||||
maxacc = {x=0, y=-9.81, z=0},
|
||||
minexptime = 0.2,
|
||||
maxexptime = 0.65,
|
||||
minsize = 0.8,
|
||||
maxsize = 1.2,
|
||||
collisiondetection = true,
|
||||
vertical = false,
|
||||
node = node,
|
||||
})
|
||||
end
|
||||
|
||||
-- Damage the anvil by 1 level.
|
||||
-- Destroy anvil when at highest damage level.
|
||||
-- Returns true if anvil was destroyed.
|
||||
|
@ -220,10 +260,12 @@ local function damage_anvil(pos)
|
|||
local new
|
||||
if node.name == "mcl_anvils:anvil" then
|
||||
minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_1", param2=node.param2})
|
||||
damage_particles(pos, node)
|
||||
minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, {pos=pos, max_hear_distance=16}, true)
|
||||
return false
|
||||
elseif node.name == "mcl_anvils:anvil_damage_1" then
|
||||
minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_2", param2=node.param2})
|
||||
damage_particles(pos, node)
|
||||
minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, {pos=pos, max_hear_distance=16}, true)
|
||||
return false
|
||||
elseif node.name == "mcl_anvils:anvil_damage_2" then
|
||||
|
@ -232,6 +274,7 @@ local function damage_anvil(pos)
|
|||
drop_anvil_items(pos, meta)
|
||||
minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dug, {pos=pos, max_hear_distance=16}, true)
|
||||
minetest.remove_node(pos)
|
||||
destroy_particles(pos, node)
|
||||
minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z})
|
||||
return true
|
||||
end
|
||||
|
@ -261,6 +304,7 @@ end
|
|||
local anvildef = {
|
||||
groups = {pickaxey=1, falling_node=1, falling_node_damage=1, crush_after_fall=1, deco_block=1, anvil=1},
|
||||
tiles = {"mcl_anvils_anvil_top_damaged_0.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"},
|
||||
_tt_help = S("Repair and rename items"),
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
|
@ -453,7 +497,6 @@ S("• Tool + Tool: Place two tools of the same type in the input slots. The “
|
|||
S("• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.").."\n"..
|
||||
S("Armor counts as a tool. It is possible to repair and rename a tool in a single step.").."\n\n"..
|
||||
S("The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.")
|
||||
anvildef0._tt_help = S("Repair and rename items")
|
||||
|
||||
local anvildef1 = table.copy(anvildef)
|
||||
anvildef1.description = S("Slightly Damaged Anvil")
|
||||
|
@ -493,7 +536,7 @@ end
|
|||
|
||||
-- Legacy
|
||||
minetest.register_lbm({
|
||||
label = "Update anvil formspecs (0.60.0",
|
||||
label = "Update anvil formspecs (0.60.0)",
|
||||
name = "mcl_anvils:update_formspec_0_60_0",
|
||||
nodenames = { "group:anvil" },
|
||||
run_at_every_load = false,
|
||||
|
|
|
@ -68,9 +68,15 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
return false
|
||||
end
|
||||
|
||||
local yaw, param2, dir, bed_pos2, bed_center
|
||||
if bed_pos then
|
||||
yaw, param2 = get_look_yaw(bed_pos)
|
||||
dir = minetest.facedir_to_dir(param2)
|
||||
bed_pos2 = {x = bed_pos.x - dir.x, y = bed_pos.y, z = bed_pos.z - dir.z}
|
||||
bed_center = {x = bed_pos.x - dir.x/2, y = bed_pos.y + 0.1, z = bed_pos.z - dir.z/2}
|
||||
|
||||
-- No sleeping if too far away
|
||||
if vector.distance(bed_pos, pos) > 2 then
|
||||
if vector.distance(bed_pos, pos) > 2 and vector.distance(bed_pos2, pos) > 2 then
|
||||
minetest.chat_send_player(name, S("You can't sleep, the bed's too far away!"))
|
||||
return false
|
||||
end
|
||||
|
@ -83,6 +89,9 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
end
|
||||
|
||||
-- No sleeping while moving. Slightly different behaviour than in MC.
|
||||
-- FIXME: Velocity threshold should be 0.01 but Minetest 5.3.0
|
||||
-- sometimes reports incorrect Y speed. A velocity threshold
|
||||
-- of 0.125 still seems good enough.
|
||||
if vector.length(player:get_player_velocity()) > 0.125 then
|
||||
minetest.chat_send_player(name, S("You have to stop moving before going to bed!"))
|
||||
return false
|
||||
|
@ -129,7 +138,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
-- physics, eye_offset, etc
|
||||
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
|
||||
if player:get_look_vertical() > 0 then
|
||||
player:set_look_vertical(0)
|
||||
player:set_look_vertical(0) -- this doesn't work :(
|
||||
end
|
||||
mcl_player.player_attached[name] = false
|
||||
playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping")
|
||||
|
@ -140,11 +149,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
|
||||
-- lay down
|
||||
else
|
||||
local yaw, param2 = get_look_yaw(bed_pos)
|
||||
local dir = minetest.facedir_to_dir(param2)
|
||||
local p = {x = bed_pos.x - dir.x/2, y = bed_pos.y, z = bed_pos.z - dir.z/2}
|
||||
local n1 = minetest.get_node({x = bed_pos.x, y = bed_pos.y + 1, z = bed_pos.z})
|
||||
local n2 = minetest.get_node({x=bed_pos.x, y=bed_pos.y+2, z=bed_pos.z})
|
||||
local n2 = minetest.get_node({x = bed_pos2.x, y = bed_pos2.y + 1, z = bed_pos2.z})
|
||||
local def1 = minetest.registered_nodes[n1.name]
|
||||
local def2 = minetest.registered_nodes[n2.name]
|
||||
if def1.walkable or def2.walkable then
|
||||
|
@ -157,9 +163,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
|
||||
local spawn_changed = false
|
||||
if minetest.get_modpath("mcl_spawn") then
|
||||
local spos = table.copy(bed_pos)
|
||||
spos.y = spos.y + 0.1
|
||||
spawn_changed = mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed
|
||||
-- save respawn position when entering bed
|
||||
spawn_changed = mcl_spawn.set_spawn_pos(player, bed_pos, false)
|
||||
end
|
||||
|
||||
-- Check day of time and weather
|
||||
|
@ -189,7 +194,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
player:get_meta():set_string("mcl_beds:sleeping", "true")
|
||||
playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0)
|
||||
playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0)
|
||||
player:set_pos(p)
|
||||
player:set_pos(bed_center)
|
||||
mcl_player.player_attached[name] = true
|
||||
hud_flags.wielditem = false
|
||||
mcl_player.player_set_animation(player, "lay" , 0)
|
||||
|
@ -199,8 +204,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||
return true
|
||||
end
|
||||
|
||||
local function update_formspecs(finished)
|
||||
local ges = #minetest.get_connected_players()
|
||||
local function update_formspecs(finished, ges)
|
||||
local ges = ges or #minetest.get_connected_players()
|
||||
local form_n = "size[6,5;true]"
|
||||
local all_in_bed = ges == player_in_bed
|
||||
local night_skip = is_night_skip_enabled()
|
||||
|
@ -361,7 +366,14 @@ end)
|
|||
minetest.register_on_leaveplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
lay_down(player, nil, nil, false, true)
|
||||
if check_in_beds() then
|
||||
local players = minetest.get_connected_players()
|
||||
for n, player in ipairs(players) do
|
||||
if player:get_player_name() == name then
|
||||
players[n] = nil
|
||||
break
|
||||
end
|
||||
end
|
||||
if check_in_beds(players) then
|
||||
minetest.after(5, function()
|
||||
if check_in_beds() then
|
||||
update_formspecs(is_night_skip_enabled())
|
||||
|
@ -369,7 +381,7 @@ minetest.register_on_leaveplayer(function(player)
|
|||
end
|
||||
end)
|
||||
end
|
||||
update_formspecs(false)
|
||||
update_formspecs(false, #players)
|
||||
end)
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
|
|
|
@ -87,6 +87,7 @@ local ARROW_ENTITY={
|
|||
_lastpos={},
|
||||
_startpos=nil,
|
||||
_damage=1, -- Damage on impact
|
||||
_is_critical=false, -- Whether this arrow would deal critical damage
|
||||
_stuck=false, -- Whether arrow is stuck
|
||||
_stucktimer=nil,-- Amount of time (in seconds) the arrow has been stuck so far
|
||||
_stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow
|
||||
|
@ -107,6 +108,28 @@ local spawn_item = function(self, pos)
|
|||
self.object:remove()
|
||||
end
|
||||
|
||||
local damage_particles = function(pos, is_critical)
|
||||
if is_critical then
|
||||
minetest.add_particlespawner({
|
||||
amount = 15,
|
||||
time = 0.1,
|
||||
minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5},
|
||||
maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5},
|
||||
minvel = {x=-0.1, y=-0.1, z=-0.1},
|
||||
maxvel = {x=0.1, y=0.1, z=0.1},
|
||||
minacc = {x=0, y=0, z=0},
|
||||
maxacc = {x=0, y=0, z=0},
|
||||
minexptime = 1,
|
||||
maxexptime = 2,
|
||||
minsize = 1.5,
|
||||
maxsize = 1.5,
|
||||
collisiondetection = false,
|
||||
vertical = false,
|
||||
texture = "mcl_particles_crit.png^[colorize:#bc7a57:127",
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
ARROW_ENTITY.on_step = function(self, dtime)
|
||||
local pos = self.object:get_pos()
|
||||
local dpos = table.copy(pos) -- digital pos
|
||||
|
@ -218,18 +241,21 @@ ARROW_ENTITY.on_step = function(self, dtime)
|
|||
-- Punch target object but avoid hurting enderman.
|
||||
if lua then
|
||||
if lua.name ~= "mobs_mc:enderman" then
|
||||
damage_particles(self.object:get_pos(), self._is_critical)
|
||||
obj:punch(self.object, 1.0, {
|
||||
full_punch_interval=1.0,
|
||||
damage_groups={fleshy=self._damage},
|
||||
}, nil)
|
||||
end
|
||||
else
|
||||
damage_particles(self.object:get_pos(), self._is_critical)
|
||||
obj:punch(self.object, 1.0, {
|
||||
full_punch_interval=1.0,
|
||||
damage_groups={fleshy=self._damage},
|
||||
}, nil)
|
||||
end
|
||||
|
||||
|
||||
if is_player then
|
||||
if self._shooter and self._shooter:is_player() then
|
||||
-- “Ding” sound for hitting another player
|
||||
|
@ -352,6 +378,7 @@ ARROW_ENTITY.get_staticdata = function(self)
|
|||
lastpos = self._lastpos,
|
||||
startpos = self._startpos,
|
||||
damage = self._damage,
|
||||
is_critical = self._is_critical,
|
||||
stuck = self._stuck,
|
||||
stuckin = self._stuckin,
|
||||
}
|
||||
|
@ -393,6 +420,7 @@ ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s)
|
|||
self._lastpos = data.lastpos
|
||||
self._startpos = data.startpos
|
||||
self._damage = data.damage
|
||||
self._is_critical = data.is_critical
|
||||
if data.shootername then
|
||||
local shooter = minetest.get_player_by_name(data.shootername)
|
||||
if shooter and shooter:is_player() then
|
||||
|
|
|
@ -33,7 +33,7 @@ local bow_load = {}
|
|||
-- Another player table, this one stores the wield index of the bow being charged
|
||||
local bow_index = {}
|
||||
|
||||
mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage)
|
||||
mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical)
|
||||
local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity")
|
||||
if power == nil then
|
||||
power = BOW_MAX_SPEED --19
|
||||
|
@ -47,6 +47,7 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag
|
|||
local le = obj:get_luaentity()
|
||||
le._shooter = shooter
|
||||
le._damage = damage
|
||||
le._is_critical = is_critical
|
||||
le._startpos = pos
|
||||
minetest.sound_play("mcl_bows_bow_shoot", {pos=pos}, true)
|
||||
if shooter ~= nil and shooter:is_player() then
|
||||
|
@ -72,27 +73,33 @@ local get_arrow = function(player)
|
|||
return arrow_stack, arrow_stack_id
|
||||
end
|
||||
|
||||
local player_shoot_arrow = function(itemstack, player, power, damage)
|
||||
local player_shoot_arrow = function(itemstack, player, power, damage, is_critical)
|
||||
local arrow_stack, arrow_stack_id = get_arrow(player)
|
||||
local arrow_itemstring = arrow_stack:get_name()
|
||||
local arrow_itemstring
|
||||
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
if minetest.is_creative_enabled(player:get_player_name()) then
|
||||
if arrow_stack then
|
||||
arrow_itemstring = arrow_stack:get_name()
|
||||
else
|
||||
arrow_itemstring = "mcl_bows:arrow"
|
||||
end
|
||||
else
|
||||
if not arrow_stack then
|
||||
return false
|
||||
end
|
||||
-- arrow_itemstring = arrow_stack:get_name()
|
||||
arrow_itemstring = arrow_stack:get_name()
|
||||
arrow_stack:take_item()
|
||||
local inv = player:get_inventory()
|
||||
inv:set_stack("main", arrow_stack_id, arrow_stack)
|
||||
end
|
||||
if not arrow_itemstring then
|
||||
return false
|
||||
end
|
||||
local playerpos = player:get_pos()
|
||||
local dir = player:get_look_dir()
|
||||
local yaw = player:get_look_horizontal()
|
||||
|
||||
if not arrow_itemstring then
|
||||
arrow_itemstring = "mcl_bows:arrow"
|
||||
end
|
||||
mcl_bows.shoot_arrow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage)
|
||||
mcl_bows.shoot_arrow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical)
|
||||
return true
|
||||
end
|
||||
|
||||
|
@ -191,12 +198,14 @@ controls.register_on_release(function(player, key, time)
|
|||
|
||||
-- Calculate damage and speed
|
||||
-- Fully charged
|
||||
local is_critical = false
|
||||
if charge >= BOW_CHARGE_TIME_FULL then
|
||||
speed = BOW_MAX_SPEED
|
||||
local r = math.random(1,5)
|
||||
if r == 1 then
|
||||
-- 20% chance for critical hit
|
||||
damage = 10
|
||||
is_critical = true
|
||||
else
|
||||
damage = 9
|
||||
end
|
||||
|
@ -207,7 +216,7 @@ controls.register_on_release(function(player, key, time)
|
|||
damage = math.max(1, math.floor(9 * charge_ratio))
|
||||
end
|
||||
|
||||
has_shot = player_shoot_arrow(wielditem, player, speed, damage)
|
||||
has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical)
|
||||
|
||||
wielditem:set_name("mcl_bows:bow")
|
||||
if has_shot and not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
|
@ -219,14 +228,14 @@ controls.register_on_release(function(player, key, time)
|
|||
end)
|
||||
|
||||
controls.register_on_hold(function(player, key, time)
|
||||
if key ~= "RMB" or not get_arrow(player) then
|
||||
local name = player:get_player_name()
|
||||
local creative = minetest.is_creative_enabled(name)
|
||||
if key ~= "RMB" or not (creative or get_arrow(player)) then
|
||||
return
|
||||
end
|
||||
local name = player:get_player_name()
|
||||
local inv = minetest.get_inventory({type="player", name=name})
|
||||
local wielditem = player:get_wielded_item()
|
||||
local creative = minetest.is_creative_enabled(name)
|
||||
if bow_load[name] == nil and wielditem:get_name()=="mcl_bows:bow" and (creative or get_arrow(player)) then --inv:contains_item("main", "mcl_bows:arrow")) then
|
||||
if bow_load[name] == nil and wielditem:get_name()=="mcl_bows:bow" and (creative or get_arrow(player)) then
|
||||
wielditem:set_name("mcl_bows:bow_0")
|
||||
player:set_wielded_item(wielditem)
|
||||
if minetest.get_modpath("playerphysics") then
|
||||
|
|
|
@ -7,3 +7,4 @@ playerphysics?
|
|||
doc?
|
||||
doc_identifier?
|
||||
mesecons_button?
|
||||
mcl_particles
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
local S = minetest.get_translator("mcl_brewing_stand")
|
||||
local S = minetest.get_translator("mcl_brewing")
|
||||
|
||||
local function active_brewing_formspec(fuel_percent, brew_percent)
|
||||
|
||||
return "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]"..
|
||||
-- "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory_active.png]"..
|
||||
"label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
|
@ -232,7 +231,6 @@ local function brewing_stand_timer(pos, elapsed)
|
|||
meta:set_float("fuel_timer", fuel_timer)
|
||||
meta:set_float("stand_timer", stand_timer)
|
||||
meta:set_float("fuel", fuel)
|
||||
-- meta:set_list("stand_items", stand_list)
|
||||
meta:set_string("formspec", formspec)
|
||||
|
||||
return result
|
||||
|
@ -311,8 +309,11 @@ if minetest.get_modpath("screwdriver") then
|
|||
end
|
||||
|
||||
local doc_string =
|
||||
S("To use an brewing_stand, rightclick it.").."\n"
|
||||
S("To brew, place fuel first and/or your ingredient last!")
|
||||
S("To use a brewing stand, rightclick it.").."\n"..
|
||||
S("To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.").."\n"..
|
||||
S("Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.").."\n"..
|
||||
S("When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.").."\n"..
|
||||
S("Different combinations of brewing materials and liquids will give different results. Try to experiment!")
|
||||
|
||||
local tiles = {"mcl_brewing_top.png", --top
|
||||
"mcl_brewing_base.png", --bottom
|
||||
|
@ -375,7 +376,7 @@ minetest.register_node("mcl_brewing:stand_000", {
|
|||
_doc_items_longdesc = S("The stand allows you to brew potions!"),
|
||||
_doc_items_usagehelp = doc_string,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=1, not_in_creative_inventory = 0, not_in_craft_guide = 0},
|
||||
groups = {pickaxey=1, brewitem=1 },
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -392,42 +393,25 @@ minetest.register_node("mcl_brewing:stand_000", {
|
|||
{-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base
|
||||
{-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base
|
||||
|
||||
-- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1
|
||||
-- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1
|
||||
-- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1
|
||||
-- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1
|
||||
-- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1
|
||||
|
||||
{-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1
|
||||
{-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1
|
||||
{-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1
|
||||
{-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1
|
||||
|
||||
|
||||
-- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2
|
||||
-- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2
|
||||
-- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2
|
||||
-- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2
|
||||
-- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2
|
||||
|
||||
{5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2
|
||||
{4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2
|
||||
{3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2
|
||||
{2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2
|
||||
|
||||
-- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3
|
||||
-- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3
|
||||
|
||||
{0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3
|
||||
{0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3
|
||||
{0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3
|
||||
}
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_glass_defaults(),
|
||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -458,7 +442,7 @@ minetest.register_node("mcl_brewing:stand_100", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -486,21 +470,11 @@ minetest.register_node("mcl_brewing:stand_100", {
|
|||
{-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1
|
||||
{-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1
|
||||
|
||||
|
||||
-- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2
|
||||
-- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2
|
||||
-- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2
|
||||
-- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2
|
||||
-- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2
|
||||
|
||||
{5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2
|
||||
{4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2
|
||||
{3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2
|
||||
{2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2
|
||||
|
||||
-- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3
|
||||
-- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3
|
||||
|
||||
{0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3
|
||||
{0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3
|
||||
{0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3
|
||||
|
@ -510,7 +484,6 @@ minetest.register_node("mcl_brewing:stand_100", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -541,7 +514,7 @@ minetest.register_node("mcl_brewing:stand_010", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -558,12 +531,6 @@ minetest.register_node("mcl_brewing:stand_010", {
|
|||
{-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base
|
||||
{-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base
|
||||
|
||||
-- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1
|
||||
-- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1
|
||||
-- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1
|
||||
-- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1
|
||||
-- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1
|
||||
|
||||
{-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1
|
||||
{-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1
|
||||
{-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1
|
||||
|
@ -581,9 +548,6 @@ minetest.register_node("mcl_brewing:stand_010", {
|
|||
{3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2
|
||||
{2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2
|
||||
|
||||
-- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3
|
||||
-- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3
|
||||
|
||||
{0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3
|
||||
{0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3
|
||||
{0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3
|
||||
|
@ -593,7 +557,6 @@ minetest.register_node("mcl_brewing:stand_010", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -624,7 +587,7 @@ minetest.register_node("mcl_brewing:stand_001", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -641,24 +604,11 @@ minetest.register_node("mcl_brewing:stand_001", {
|
|||
{-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base
|
||||
{-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base
|
||||
|
||||
-- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1
|
||||
-- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1
|
||||
-- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1
|
||||
-- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1
|
||||
-- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1
|
||||
|
||||
{-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1
|
||||
{-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1
|
||||
{-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1
|
||||
{-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1
|
||||
|
||||
|
||||
-- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2
|
||||
-- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2
|
||||
-- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2
|
||||
-- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2
|
||||
-- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2
|
||||
|
||||
{5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2
|
||||
{4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2
|
||||
{3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2
|
||||
|
@ -676,7 +626,6 @@ minetest.register_node("mcl_brewing:stand_001", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -707,7 +656,7 @@ minetest.register_node("mcl_brewing:stand_110", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -747,9 +696,6 @@ minetest.register_node("mcl_brewing:stand_110", {
|
|||
{3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2
|
||||
{2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2
|
||||
|
||||
-- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3
|
||||
-- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3
|
||||
|
||||
{0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3
|
||||
{0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3
|
||||
{0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3
|
||||
|
@ -759,7 +705,6 @@ minetest.register_node("mcl_brewing:stand_110", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -790,7 +735,7 @@ minetest.register_node("mcl_brewing:stand_101", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -818,13 +763,6 @@ minetest.register_node("mcl_brewing:stand_101", {
|
|||
{-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1
|
||||
{-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1
|
||||
|
||||
|
||||
-- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2
|
||||
-- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2
|
||||
-- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2
|
||||
-- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2
|
||||
-- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2
|
||||
|
||||
{5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2
|
||||
{4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2
|
||||
{3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2
|
||||
|
@ -842,7 +780,6 @@ minetest.register_node("mcl_brewing:stand_101", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -873,7 +810,7 @@ minetest.register_node("mcl_brewing:stand_011", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -890,18 +827,11 @@ minetest.register_node("mcl_brewing:stand_011", {
|
|||
{-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base
|
||||
{-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base
|
||||
|
||||
-- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1
|
||||
-- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1
|
||||
-- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1
|
||||
-- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1
|
||||
-- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1
|
||||
|
||||
{-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1
|
||||
{-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1
|
||||
{-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1
|
||||
{-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1
|
||||
|
||||
|
||||
{7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2
|
||||
{6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2
|
||||
{5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2
|
||||
|
@ -925,7 +855,6 @@ minetest.register_node("mcl_brewing:stand_011", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -956,7 +885,7 @@ minetest.register_node("mcl_brewing:stand_111", {
|
|||
description = S("Brewing Stand"),
|
||||
_doc_items_create_entry = false,
|
||||
_tt_help = S("Brew Potions"),
|
||||
groups = {pickaxey=1, falling_node=1, brewitem=0, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1},
|
||||
tiles = tiles,
|
||||
drop = "mcl_brewing:stand",
|
||||
paramtype = "light",
|
||||
|
@ -1008,7 +937,6 @@ minetest.register_node("mcl_brewing:stand_111", {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
on_destruct = on_destruct,
|
||||
-- after_dig_node = after_dig,
|
||||
allow_metadata_inventory_take = allow_take,
|
||||
allow_metadata_inventory_put = allow_put,
|
||||
on_metadata_inventory_put = on_put,
|
||||
|
@ -1055,3 +983,9 @@ if minetest.get_modpath("doc") then
|
|||
doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_110")
|
||||
doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_111")
|
||||
end
|
||||
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
for _, s in ipairs({"000", "001", "010", "011", "100", "101", "110", "111"}) do
|
||||
mesecon.register_mvps_stopper("mcl_brewing:stand_" .. s)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
# textdomain: mcl_brewing
|
||||
Brewing Stand=Braustand
|
||||
Inventory=Inventar
|
||||
To use a brewing stand, rightclick it.=Um einen Braustand zu benutzen, rechtsklicken Sie ihn.
|
||||
To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Zum Brauen benötigt man Lohenstaub als Brennstoff, ein Braumaterial und mindestens 1 Glasflasche, die mit einer Flüssigkeit gefüllt ist.
|
||||
Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Platzieren Sie den Lohenstaub in den linken Plartz, das Braumaterial in den mittleren Platz und 1-3 Glasflaschen in die übrigen Plätze.
|
||||
When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Wenn Sie eine gute Kombination gefunden haben, beginnt der Brauvorgang automatisch, und es entsteht Dampf. Der Brennstoff und das Brühmaterial wird aufbraucht. Die Tränke werden bald fertig sein.
|
||||
Different combinations of brewing materials and liquids will give different results. Try to experiment!=Unterschiedliche Kombinationen von Braumaterialien und Flüssigkeiten werden zu unterschiedlichen Ergebnissen führen. Experimentieren Sie!
|
||||
The stand allows you to brew potions!=Der Stand ermöglicht das Brauen von Tränken.
|
||||
Brew Potions=Tränke brauen
|
|
@ -1,3 +1,10 @@
|
|||
# textdomain: mcl_brewing
|
||||
Brewing Stand=Варочный стенд
|
||||
The brewing stand allows the creating of potions for the benefit of various effects. Stay tuned for developments, as you can only view the stand and interact with it, but not create potions.=Варочный стенд позволяет создавать зелья для достижения различных эффектов. Следите за разработкой, а пока вы можете только просматривать стенд и взаимодействовать с ним, но не создавать зелья.
|
||||
Inventory=Инвентарь
|
||||
To use a brewing stand, rightclick it.=Кликните правой, чтобы использовать варочный стенд.
|
||||
To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Для приготовления зелья вам понадобится огненный порошок в качестве топлива, исходный материал и как минимум 1 стеклянная бутылка, наполненная жидкостью.
|
||||
Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Поместите огненный порошок в левый отсек, исходный материал в средний отсек и 1-3 бутылки в оставшиеся отсеки.
|
||||
When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Когда вы подберёте хорошее сочетание, приготовление зелья начнётся автоматически — появится пар и начнётся расход топлива и исходного материала. Зелья вскоре будут готовы.
|
||||
Different combinations of brewing materials and liquids will give different results. Try to experiment!=Разные сочетания варочных материалов и жидкостей будут давать разные результаты. Поэкспериментируйте!
|
||||
The stand allows you to brew potions!=Стенд позволяет вам варить зелья!
|
||||
Brew Potions=Зельеварение
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
# textdomain: mcl_brewing
|
||||
Brewing Stand=
|
||||
The brewing stand allows the creating of potions for the benefit of various effects. Stay tuned for developments, as you can only view the stand and interact with it, but not create potions.
|
||||
Inventory=
|
||||
To use a brewing stand, rightclick it.=
|
||||
To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=
|
||||
Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=
|
||||
When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=
|
||||
Different combinations of brewing materials and liquids will give different results. Try to experiment!=
|
||||
The stand allows you to brew potions!=
|
||||
Brew Potions=
|
||||
|
|
|
@ -221,7 +221,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", {
|
|||
|
||||
-- Fill bucket, but not in Creative Mode
|
||||
if not minetest.is_creative_enabled(user:get_player_name()) then
|
||||
new_bucket = ItemStack({name = liquiddef.itemname, metadata = tostring(node.param2)})
|
||||
new_bucket = ItemStack({name = liquiddef.itemname})
|
||||
end
|
||||
|
||||
minetest.add_node(pointed_thing.under, {name="air"})
|
||||
|
@ -274,7 +274,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", {
|
|||
local new_bucket
|
||||
if liquiddef ~= nil and liquiddef.itemname ~= nil and (dropnode.name == liquiddef.source_take) then
|
||||
-- Fill bucket
|
||||
new_bucket = ItemStack({name = liquiddef.itemname, metadata = tostring(dropnode.param2)})
|
||||
new_bucket = ItemStack({name = liquiddef.itemname})
|
||||
sound_take(dropnode.name, droppos)
|
||||
collect_liquid = true
|
||||
end
|
||||
|
|
|
@ -197,6 +197,9 @@ minetest.register_node("mcl_chests:"..basename, {
|
|||
minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 })
|
||||
end
|
||||
end,
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name"))
|
||||
end,
|
||||
after_dig_node = drop_items_chest,
|
||||
on_blast = on_chest_blast,
|
||||
allow_metadata_inventory_move = protection_check_move,
|
||||
|
@ -224,10 +227,19 @@ minetest.register_node("mcl_chests:"..basename, {
|
|||
_mcl_hardness = 2.5,
|
||||
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 then
|
||||
-- won't open if there is no space from the top
|
||||
return false
|
||||
end
|
||||
local name = minetest.get_meta(pos):get_string("name")
|
||||
if name == "" then
|
||||
name = S("Chest")
|
||||
end
|
||||
|
||||
minetest.show_formspec(clicker:get_player_name(),
|
||||
"mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z,
|
||||
"size[9,8.75]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Chest"))).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
|
@ -270,6 +282,9 @@ minetest.register_node("mcl_chests:"..basename.."_left", {
|
|||
minetest.swap_node(pos, n)
|
||||
end
|
||||
end,
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name"))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
local n = minetest.get_node(pos)
|
||||
if n.name == "mcl_chests:"..basename then
|
||||
|
@ -345,11 +360,24 @@ minetest.register_node("mcl_chests:"..basename.."_left", {
|
|||
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||
if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1
|
||||
or minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name].groups.opaque == 1 then
|
||||
-- won't open if there is no space from the top
|
||||
return false
|
||||
end
|
||||
|
||||
local name = minetest.get_meta(pos):get_string("name")
|
||||
if name == "" then
|
||||
name = minetest.get_meta(pos_other):get_string("name")
|
||||
end
|
||||
if name == "" then
|
||||
name = S("Large Chest")
|
||||
end
|
||||
|
||||
minetest.show_formspec(clicker:get_player_name(),
|
||||
"mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z,
|
||||
"size[9,11.5]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]"..
|
||||
|
@ -393,6 +421,9 @@ minetest.register_node("mcl_chests:"..basename.."_right", {
|
|||
minetest.swap_node(pos, n)
|
||||
end
|
||||
end,
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name"))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
local n = minetest.get_node(pos)
|
||||
if n.name == "mcl_chests:"..basename then
|
||||
|
@ -469,12 +500,25 @@ minetest.register_node("mcl_chests:"..basename.."_right", {
|
|||
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
||||
if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1
|
||||
or minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name].groups.opaque == 1 then
|
||||
-- won't open if there is no space from the top
|
||||
return false
|
||||
end
|
||||
|
||||
local name = minetest.get_meta(pos_other):get_string("name")
|
||||
if name == "" then
|
||||
name = minetest.get_meta(pos):get_string("name")
|
||||
end
|
||||
if name == "" then
|
||||
name = S("Large Chest")
|
||||
end
|
||||
|
||||
minetest.show_formspec(clicker:get_player_name(),
|
||||
"mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z,
|
||||
|
||||
"size[9,11.5]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]"..
|
||||
|
@ -769,8 +813,12 @@ local shulker_mob_textures = {
|
|||
}
|
||||
local canonical_shulker_color = "violet"
|
||||
|
||||
local formspec_shulker_box = "size[9,8.75]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Shulker Box"))).."]"..
|
||||
local function formspec_shulker_box(name)
|
||||
if name == "" then
|
||||
name = S("Shulker Box")
|
||||
end
|
||||
return "size[9,8.75]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"list[current_name;main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
|
@ -780,6 +828,14 @@ local formspec_shulker_box = "size[9,8.75]"..
|
|||
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
|
||||
"listring[current_name;main]"..
|
||||
"listring[current_player;main]"
|
||||
end
|
||||
|
||||
local function set_shulkerbox_meta(nmeta, imeta)
|
||||
local name = imeta:get_string("name")
|
||||
nmeta:set_string("description", imeta:get_string("description"))
|
||||
nmeta:set_string("name", name)
|
||||
nmeta:set_string("formspec", formspec_shulker_box(name))
|
||||
end
|
||||
|
||||
for color, desc in pairs(boxtypes) do
|
||||
local mob_texture = shulker_mob_textures[color]
|
||||
|
@ -822,7 +878,7 @@ for color, desc in pairs(boxtypes) do
|
|||
-- on_place = minetest.rotate_node,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", formspec_shulker_box)
|
||||
meta:set_string("formspec", formspec_shulker_box(nil))
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("main", 9*3)
|
||||
end,
|
||||
|
@ -835,12 +891,7 @@ for color, desc in pairs(boxtypes) do
|
|||
local iinv_main = minetest.deserialize(imetadata)
|
||||
ninv:set_list("main", iinv_main)
|
||||
ninv:set_size("main", 9*3)
|
||||
|
||||
local imeta = stack:get_meta()
|
||||
local nmeta = minetest.get_meta(droppos)
|
||||
nmeta:set_string("description", imeta:get_string("description"))
|
||||
nmeta:set_string("name", imeta:get_string("name"))
|
||||
|
||||
set_shulkerbox_meta(minetest.get_meta(droppos), stack:get_meta())
|
||||
stack:take_item()
|
||||
end
|
||||
return stack
|
||||
|
@ -852,10 +903,7 @@ for color, desc in pairs(boxtypes) do
|
|||
local ninv = nmeta:get_inventory()
|
||||
ninv:set_list("main", iinv_main)
|
||||
ninv:set_size("main", 9*3)
|
||||
|
||||
local imeta = itemstack:get_meta()
|
||||
nmeta:set_string("description", imeta:get_string("description"))
|
||||
nmeta:set_string("name", imeta:get_string("name"))
|
||||
set_shulkerbox_meta(nmeta, itemstack:get_meta())
|
||||
|
||||
if minetest.is_creative_enabled(placer:get_player_name()) then
|
||||
if not ninv:is_empty("main") then
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
mcl_init
|
||||
mcl_sounds
|
||||
mcl_particles
|
||||
mcl_util
|
||||
mcl_worlds
|
||||
doc_items
|
||||
|
|
|
@ -1092,6 +1092,64 @@ minetest.register_abm({
|
|||
action = grow_acacia,
|
||||
})
|
||||
|
||||
local function leafdecay_particles(pos, node)
|
||||
minetest.add_particlespawner({
|
||||
amount = math.random(10, 20),
|
||||
time = 0.1,
|
||||
minpos = vector.add(pos, {x=-0.4, y=-0.4, z=-0.4}),
|
||||
maxpos = vector.add(pos, {x=0.4, y=0.4, z=0.4}),
|
||||
minvel = {x=-0.2, y=-0.2, z=-0.2},
|
||||
maxvel = {x=0.2, y=0.1, z=0.2},
|
||||
minacc = {x=0, y=-9.81, z=0},
|
||||
maxacc = {x=0, y=-9.81, z=0},
|
||||
minexptime = 0.1,
|
||||
maxexptime = 0.5,
|
||||
minsize = 0.5,
|
||||
maxsize = 1.5,
|
||||
collisiondetection = true,
|
||||
vertical = false,
|
||||
node = node,
|
||||
})
|
||||
end
|
||||
|
||||
local function vinedecay_particles(pos, node)
|
||||
local dir = minetest.wallmounted_to_dir(node.param2)
|
||||
local relpos1, relpos2
|
||||
if dir.x < 0 then
|
||||
relpos1 = { x = -0.45, y = -0.4, z = -0.5 }
|
||||
relpos2 = { x = -0.4, y = 0.4, z = 0.5 }
|
||||
elseif dir.x > 0 then
|
||||
relpos1 = { x = 0.4, y = -0.4, z = -0.5 }
|
||||
relpos2 = { x = 0.45, y = 0.4, z = 0.5 }
|
||||
elseif dir.z < 0 then
|
||||
relpos1 = { x = -0.5, y = -0.4, z = -0.45 }
|
||||
relpos2 = { x = 0.5, y = 0.4, z = -0.4 }
|
||||
elseif dir.z > 0 then
|
||||
relpos1 = { x = -0.5, y = -0.4, z = 0.4 }
|
||||
relpos2 = { x = 0.5, y = 0.4, z = 0.45 }
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
minetest.add_particlespawner({
|
||||
amount = math.random(8, 16),
|
||||
time = 0.1,
|
||||
minpos = vector.add(pos, relpos1),
|
||||
maxpos = vector.add(pos, relpos2),
|
||||
minvel = {x=-0.2, y=-0.2, z=-0.2},
|
||||
maxvel = {x=0.2, y=0.1, z=0.2},
|
||||
minacc = {x=0, y=-9.81, z=0},
|
||||
maxacc = {x=0, y=-9.81, z=0},
|
||||
minexptime = 0.1,
|
||||
maxexptime = 0.5,
|
||||
minsize = 0.5,
|
||||
maxsize = 1.0,
|
||||
collisiondetection = true,
|
||||
vertical = false,
|
||||
node = node,
|
||||
})
|
||||
end
|
||||
|
||||
---------------------
|
||||
-- Vine generating --
|
||||
---------------------
|
||||
|
@ -1105,6 +1163,7 @@ minetest.register_abm({
|
|||
-- First of all, check if we are even supported, otherwise, let's die!
|
||||
if not mcl_core.check_vines_supported(pos, node) then
|
||||
minetest.remove_node(pos)
|
||||
vinedecay_particles(pos, node)
|
||||
core.check_for_falling(pos)
|
||||
return
|
||||
end
|
||||
|
@ -1267,6 +1326,7 @@ minetest.register_abm({
|
|||
end
|
||||
-- Remove node
|
||||
minetest.remove_node(p0)
|
||||
leafdecay_particles(p0, n0)
|
||||
core.check_for_falling(p0)
|
||||
|
||||
-- Kill depending vines immediately to skip the vines decay delay
|
||||
|
@ -1283,6 +1343,7 @@ minetest.register_abm({
|
|||
local surround_inverse = vector.multiply(surround[s], -1)
|
||||
if maybe_vine.name == "mcl_core:vine" and (not mcl_core.check_vines_supported(spos, maybe_vine)) then
|
||||
minetest.remove_node(spos)
|
||||
vinedecay_particles(spos, maybe_vine)
|
||||
core.check_for_falling(spos)
|
||||
end
|
||||
end
|
||||
|
@ -1305,6 +1366,7 @@ minetest.register_abm({
|
|||
if not mcl_core.check_vines_supported(p0, node) then
|
||||
-- Vines must die!
|
||||
minetest.remove_node(p0)
|
||||
vinedecay_particles(p0, node)
|
||||
-- Just in case a falling node happens to float above vines
|
||||
core.check_for_falling(p0)
|
||||
end
|
||||
|
|
|
@ -41,7 +41,7 @@ Block of Gold=Goldblock
|
|||
Block of Iron=Eisenblock
|
||||
Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Kohleblöcke sind für eine kompakte Aufbewahrung von Kohle nützlich und sehr nützlich als Ofenbrennstoff. Ein Kohleblock ist so effizient wie 10 mal Kohle.
|
||||
Blue Stained Glass=Blaues Buntglas
|
||||
Bone Block=Knockenblock
|
||||
Bone Block=Knochenblock
|
||||
Bone blocks are decorative blocks and a compact storage of bone meal.=Knochenblöcke sind Deko-Blöcke und geeignet zur kompakten Aufbewahrung von Knochenmehl.
|
||||
Bowl=Schale
|
||||
Bowls are mainly used to hold tasty soups.=Schalen werden hauptsächlich für leckere Suppen gebraucht.
|
||||
|
|
|
@ -6,6 +6,7 @@ local N = function(s) return s end
|
|||
local WATER_ALPHA = 179
|
||||
local WATER_VISC = 1
|
||||
local LAVA_VISC = 7
|
||||
local LIGHT_LAVA = minetest.LIGHT_MAX
|
||||
|
||||
local lava_death_messages = {
|
||||
N("@1 melted in lava."),
|
||||
|
@ -120,7 +121,7 @@ minetest.register_node("mcl_core:lava_flowing", {
|
|||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "flowingliquid",
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
light_source = LIGHT_LAVA,
|
||||
is_ground_content = false,
|
||||
sounds = mcl_sounds.node_sound_lava_defaults(),
|
||||
walkable = false,
|
||||
|
@ -178,7 +179,7 @@ S("• When lava is directly above water, the water turns into stone."),
|
|||
}
|
||||
},
|
||||
paramtype = "light",
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
light_source = LIGHT_LAVA,
|
||||
is_ground_content = false,
|
||||
sounds = mcl_sounds.node_sound_lava_defaults(),
|
||||
walkable = false,
|
||||
|
@ -197,8 +198,50 @@ S("• When lava is directly above water, the water turns into stone."),
|
|||
_mcl_node_death_message = lava_death_messages,
|
||||
post_effect_color = {a=245, r=208, g=73, b=10},
|
||||
stack_max = 64,
|
||||
groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1},
|
||||
groups = { lava=3, lava_source=1, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1},
|
||||
_mcl_blast_resistance = 100,
|
||||
-- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode
|
||||
_mcl_hardness = -1,
|
||||
})
|
||||
|
||||
local emit_lava_particle = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if minetest.get_item_group(node.name, "lava_source") == 0 then
|
||||
return
|
||||
end
|
||||
local ppos = vector.add(pos, { x = math.random(-7, 7)/16, y = 0.45, z = math.random(-7, 7)/16})
|
||||
local spos = vector.add(ppos, { x = 0, y = -0.2, z = 0 })
|
||||
local vel = { x = math.random(-3, 3)/10, y = math.random(4, 7), z = math.random(-3, 3)/10 }
|
||||
local acc = { x = 0, y = -9.81, z = 0 }
|
||||
-- Lava droplet
|
||||
minetest.add_particle({
|
||||
pos = ppos,
|
||||
velocity = vel,
|
||||
acceleration = acc,
|
||||
expirationtime = 2.5,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
size = math.random(20, 30)/10,
|
||||
texture = "mcl_particles_lava.png",
|
||||
glow = LIGHT_LAVA,
|
||||
})
|
||||
end
|
||||
|
||||
if minetest.settings:get("mcl_node_particles") == "full" then
|
||||
minetest.register_abm({
|
||||
label = "Lava particles",
|
||||
nodenames = {"group:lava_source"},
|
||||
interval = 8.0,
|
||||
chance = 20,
|
||||
action = function(pos, node)
|
||||
local apos = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local anode = minetest.get_node(apos)
|
||||
-- Only emit partiles when directly below lava
|
||||
if anode.name ~= "air" then
|
||||
return
|
||||
end
|
||||
|
||||
minetest.after(math.random(0, 800)*0.01, emit_lava_particle, pos)
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
|
|
@ -52,6 +52,16 @@ minetest.register_node("mcl_core:slimeblock", {
|
|||
},
|
||||
_mcl_blast_resistance = 0,
|
||||
_mcl_hardness = 0,
|
||||
mvps_sticky = function (pos, node)
|
||||
local connected = {}
|
||||
if mesecon.rules.alldirs then
|
||||
for _, r in ipairs(mesecon.rules.alldirs) do
|
||||
table.insert(connected, vector.add(pos, r))
|
||||
end
|
||||
end
|
||||
return connected
|
||||
end,
|
||||
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_core:cobweb", {
|
||||
|
|
|
@ -111,7 +111,7 @@ mcl_end.check_detach_chorus_plant = function(pos, oldnode, oldmetadata, digger)
|
|||
end
|
||||
|
||||
mcl_end.check_blast_chorus_plant = function(pos)
|
||||
minetest.remove(pos)
|
||||
minetest.remove_node(pos)
|
||||
mcl_end.detach_chorus_plant(pos)
|
||||
end
|
||||
|
||||
|
@ -134,7 +134,7 @@ minetest.register_node("mcl_end:chorus_flower", {
|
|||
node_box = chorus_flower_box,
|
||||
selection_box = { type = "regular" },
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
groups = {handy=1,axey=1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1},
|
||||
groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1},
|
||||
|
||||
node_placement_prediction = "",
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
@ -207,7 +207,6 @@ minetest.register_node("mcl_end:chorus_flower", {
|
|||
|
||||
minetest.register_node("mcl_end:chorus_flower_dead", {
|
||||
description = S("Dead Chorus Flower"),
|
||||
_tt_help = S("Grows on end stone"),
|
||||
_doc_items_longdesc = S("This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again."),
|
||||
tiles = {
|
||||
"mcl_end_chorus_flower_dead.png",
|
||||
|
@ -224,7 +223,7 @@ minetest.register_node("mcl_end:chorus_flower_dead", {
|
|||
selection_box = { type = "regular" },
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
drop = "mcl_end:chorus_flower",
|
||||
groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1},
|
||||
groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1, not_in_creative_inventory=1},
|
||||
after_dig_node = mcl_end.check_detach_chorus_plant,
|
||||
on_blast = mcl_end.check_blast_chorus_plant,
|
||||
_mcl_blast_resistance = 2,
|
||||
|
|
|
@ -122,7 +122,6 @@ minetest.register_craftitem("mcl_farming:potato_item_poison", {
|
|||
_doc_items_longdesc = S("This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly."),
|
||||
stack_max = 64,
|
||||
inventory_image = "farming_potato_poison.png",
|
||||
-- TODO: Cause status effects
|
||||
on_place = minetest.item_eat(2),
|
||||
on_secondary_use = minetest.item_eat(2),
|
||||
groups = { food = 2, eatable = 2 },
|
||||
|
@ -138,4 +137,13 @@ minetest.register_craft({
|
|||
|
||||
mcl_farming:add_plant("plant_potato", "mcl_farming:potato", {"mcl_farming:potato_1", "mcl_farming:potato_2", "mcl_farming:potato_3", "mcl_farming:potato_4", "mcl_farming:potato_5", "mcl_farming:potato_6", "mcl_farming:potato_7"}, 19.75, 20)
|
||||
|
||||
minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing)
|
||||
|
||||
-- 60% chance of poisoning with poisonous potato
|
||||
if itemstack:get_name() == "mcl_farming:potato_item_poison" then
|
||||
if math.random(1,10) >= 6 then
|
||||
mcl_potions.poison_func(user, 1, 5)
|
||||
end
|
||||
end
|
||||
|
||||
end )
|
||||
|
|
|
@ -1,22 +1,74 @@
|
|||
local plant_lists = {}
|
||||
local plant_nodename_to_id_list = {}
|
||||
|
||||
local function get_intervals_counter(pos, interval, chance)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local time_speed = tonumber(minetest.settings:get('time_speed') or 72)
|
||||
local current_game_time
|
||||
if time_speed == nil then
|
||||
return 1
|
||||
end
|
||||
if (time_speed < 0.1) then
|
||||
return 1
|
||||
end
|
||||
local time_multiplier = 86400 / time_speed
|
||||
current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier)
|
||||
|
||||
local approx_interval = math.max(interval, 1) * math.max(chance, 1)
|
||||
|
||||
local last_game_time = meta:get_string("last_gametime")
|
||||
if last_game_time then
|
||||
last_game_time = tonumber(last_game_time)
|
||||
end
|
||||
if not last_game_time or last_game_time < 1 then
|
||||
last_game_time = current_game_time - approx_interval / 10
|
||||
elseif last_game_time == current_game_time then
|
||||
current_game_time = current_game_time + approx_interval
|
||||
end
|
||||
|
||||
local elapsed_game_time = .0 + current_game_time - last_game_time
|
||||
|
||||
meta:set_string("last_gametime", tostring(current_game_time))
|
||||
|
||||
return elapsed_game_time / approx_interval
|
||||
end
|
||||
|
||||
local function get_avg_light_level(pos)
|
||||
local node_light = tonumber(minetest.get_node_light(pos) or 0)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local counter = meta:get_int("avg_light_count")
|
||||
local summary = meta:get_int("avg_light_summary")
|
||||
if counter > 99 then
|
||||
counter = 51
|
||||
summary = math.ceil((summary + 0.0) / 2.0)
|
||||
else
|
||||
counter = counter + 1
|
||||
end
|
||||
summary = summary + node_light
|
||||
meta:set_int("avg_light_count", counter)
|
||||
meta:set_int("avg_light_summary", summary)
|
||||
return math.ceil((summary + 0.0) / counter)
|
||||
end
|
||||
|
||||
function mcl_farming:add_plant(identifier, full_grown, names, interval, chance)
|
||||
plant_lists[identifier] = {}
|
||||
plant_lists[identifier].full_grown = full_grown
|
||||
plant_lists[identifier].names = names
|
||||
plant_lists[identifier].interval = interval
|
||||
plant_lists[identifier].chance = chance
|
||||
minetest.register_abm({
|
||||
label = string.format("Farming plant growth (%s)", identifier),
|
||||
nodenames = names,
|
||||
interval = interval,
|
||||
chance = chance,
|
||||
action = function(pos, node)
|
||||
if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "mcl_farming:soil_wet" and math.random(0, 9) > 0 then
|
||||
return
|
||||
else
|
||||
mcl_farming:grow_plant(identifier, pos, node)
|
||||
end
|
||||
local low_speed = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "mcl_farming:soil_wet"
|
||||
mcl_farming:grow_plant(identifier, pos, node, false, false, low_speed)
|
||||
end,
|
||||
})
|
||||
for _, nodename in pairs(names) do
|
||||
plant_nodename_to_id_list[nodename] = identifier
|
||||
end
|
||||
end
|
||||
|
||||
-- Attempts to advance a plant at pos by one or more growth stages (if possible)
|
||||
|
@ -28,15 +80,34 @@ end
|
|||
|
||||
-- Returns true if plant has been grown by 1 or more stages.
|
||||
-- Returns false if nothing changed.
|
||||
function mcl_farming:grow_plant(identifier, pos, node, stages, ignore_light)
|
||||
if not minetest.get_node_light(pos) and not ignore_light then
|
||||
function mcl_farming:grow_plant(identifier, pos, node, stages, ignore_light, low_speed)
|
||||
local average_light_level = get_avg_light_level(pos)
|
||||
local plant_info = plant_lists[identifier]
|
||||
local intervals_counter = get_intervals_counter(pos, plant_info.interval, plant_info.chance)
|
||||
local low_speed = low_speed or false
|
||||
if low_speed then
|
||||
if intervals_counter < 1.01 and math.random(0, 9) > 0 then
|
||||
return
|
||||
else
|
||||
intervals_counter = intervals_counter / 10
|
||||
end
|
||||
end
|
||||
if not minetest.get_node_light(pos) and not ignore_light and intervals_counter < 1.5 then
|
||||
return false
|
||||
end
|
||||
if minetest.get_node_light(pos) < 10 and not ignore_light then
|
||||
if minetest.get_node_light(pos) < 10 and not ignore_light and intervals_counter < 1.5 then
|
||||
return false
|
||||
end
|
||||
|
||||
local plant_info = plant_lists[identifier]
|
||||
if intervals_counter >= 1.5 then
|
||||
if average_light_level < 0.1 then
|
||||
return false
|
||||
end
|
||||
if average_light_level < 10 then
|
||||
intervals_counter = intervals_counter * average_light_level / 10
|
||||
end
|
||||
end
|
||||
|
||||
local step = nil
|
||||
|
||||
for i, name in ipairs(plant_info.names) do
|
||||
|
@ -51,6 +122,7 @@ function mcl_farming:grow_plant(identifier, pos, node, stages, ignore_light)
|
|||
if not stages then
|
||||
stages = 1
|
||||
end
|
||||
stages = stages + math.ceil(intervals_counter)
|
||||
local new_node = {name = plant_info.names[step+stages]}
|
||||
if new_node.name == nil then
|
||||
new_node.name = plant_info.full_grown
|
||||
|
@ -86,6 +158,7 @@ function mcl_farming:place_seed(itemstack, placer, pointed_thing, plantname)
|
|||
if string.find(farmland.name, "mcl_farming:soil") and string.find(place_s.name, "air") then
|
||||
minetest.sound_play(minetest.registered_nodes[plantname].sounds.place, {pos = pos}, true)
|
||||
minetest.add_node(pos, {name=plantname, param2 = minetest.registered_nodes[plantname].place_param2})
|
||||
local intervals_counter = get_intervals_counter(pos, 1, 1)
|
||||
else
|
||||
return
|
||||
end
|
||||
|
@ -379,3 +452,18 @@ function mcl_farming:stem_color(startcolor, endcolor, step, step_count)
|
|||
local colorstring = string.format("#%02X%02X%02X", color.r, color.g, color.b)
|
||||
return colorstring
|
||||
end
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Add growth for unloaded farming plants",
|
||||
name = "mcl_farming:growth",
|
||||
nodenames = {"group:plant"},
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
local identifier = plant_nodename_to_id_list[node.name]
|
||||
if not identifier then
|
||||
return
|
||||
end
|
||||
local low_speed = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "mcl_farming:soil_wet"
|
||||
mcl_farming:grow_plant(identifier, pos, node, false, false, low_speed)
|
||||
end,
|
||||
})
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
mcl_core
|
||||
mcl_worlds
|
||||
mcl_sounds
|
||||
mcl_particles
|
||||
mcl_portals?
|
||||
|
|
|
@ -5,6 +5,28 @@ mcl_fire = {}
|
|||
local S = minetest.get_translator("mcl_fire")
|
||||
local N = function(s) return s end
|
||||
|
||||
local spawn_smoke = function(pos)
|
||||
mcl_particles.add_node_particlespawner(pos, {
|
||||
amount = 0.1,
|
||||
time = 0,
|
||||
minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 }),
|
||||
maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 }),
|
||||
minvel = { x = 0, y = 0.5, z = 0 },
|
||||
maxvel = { x = 0, y = 0.6, z = 0 },
|
||||
minexptime = 2.0,
|
||||
maxexptime = 2.0,
|
||||
minsize = 3.0,
|
||||
maxsize = 4.0,
|
||||
texture = "mcl_particles_smoke_anim.png^[colorize:#000000:127",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 8,
|
||||
aspect_h = 8,
|
||||
length = 2.1,
|
||||
},
|
||||
}, "high")
|
||||
end
|
||||
|
||||
--
|
||||
-- Items
|
||||
--
|
||||
|
@ -172,6 +194,10 @@ minetest.register_node("mcl_fire:fire", {
|
|||
end
|
||||
|
||||
fire_timer(pos)
|
||||
spawn_smoke(pos)
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
mcl_particles.delete_node_particlespawners(pos)
|
||||
end,
|
||||
_mcl_blast_resistance = 0,
|
||||
})
|
||||
|
@ -212,6 +238,9 @@ minetest.register_node("mcl_fire:eternal_fire", {
|
|||
while #airs > 0 do
|
||||
local r = math.random(1, #airs)
|
||||
if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then
|
||||
local node = minetest.get_node(airs[r])
|
||||
local age = node.param2
|
||||
local age_next = math.min(15, age + math.random(0, 1))
|
||||
spawn_fire(airs[r], age_next)
|
||||
break
|
||||
else
|
||||
|
@ -229,6 +258,10 @@ minetest.register_node("mcl_fire:eternal_fire", {
|
|||
if minetest.get_modpath("mcl_portals") then
|
||||
mcl_portals.light_nether_portal(pos)
|
||||
end
|
||||
spawn_smoke(pos)
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
mcl_particles.delete_node_particlespawners(pos)
|
||||
end,
|
||||
sounds = {},
|
||||
drop = "",
|
||||
|
@ -448,9 +481,19 @@ mcl_fire.set_fire = function(pointed_thing, player, allow_on_fire)
|
|||
end
|
||||
end
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Smoke particles from fire",
|
||||
name = "mcl_fire:smoke",
|
||||
nodenames = {"group:fire"},
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
spawn_smoke(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_alias("mcl_fire:basic_flame", "mcl_fire:fire")
|
||||
minetest.register_alias("fire:basic_flame", "mcl_fire:fire")
|
||||
minetest.register_alias("fire:permanent_flame", "mcl_fire:eternal_flame")
|
||||
minetest.register_alias("fire:permanent_flame", "mcl_fire:eternal_fire")
|
||||
|
||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/flint_and_steel.lua")
|
||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/fire_charge.lua")
|
||||
|
|
|
@ -69,7 +69,7 @@ local fish = function(itemstack, player)
|
|||
{ itemstring = "mcl_mobitems:rotten_flesh", weight = 10 },
|
||||
{ itemstring = "mcl_core:stick", weight = 5 },
|
||||
{ itemstring = "mcl_mobitems:string", weight = 5 },
|
||||
{ itemstring = "mcl_potions:potion_water", weight = 10 },
|
||||
{ itemstring = "mcl_potions:water", weight = 10 },
|
||||
{ itemstring = "mcl_mobitems:bone", weight = 10 },
|
||||
{ itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 },
|
||||
{ itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook
|
||||
|
@ -238,7 +238,7 @@ local bobber_on_step = function(self, dtime)
|
|||
end
|
||||
else if self._waittick == nil then
|
||||
-- wait for random number of ticks.
|
||||
self._waittick = math.random(50,800)
|
||||
self._waittick = math.random(50,333)
|
||||
else
|
||||
if self._tick ~= self._waittick then
|
||||
self._tick = self._tick + 1
|
||||
|
@ -417,8 +417,7 @@ minetest.register_craftitem("mcl_fishing:clownfish_raw", {
|
|||
_mcl_saturation = 0.2,
|
||||
})
|
||||
|
||||
-- Pufferfish
|
||||
-- TODO: Add real status effect
|
||||
|
||||
minetest.register_craftitem("mcl_fishing:pufferfish_raw", {
|
||||
description = S("Pufferfish"),
|
||||
_tt_help = minetest.colorize("#FFFF00", S("Very poisonous")),
|
||||
|
@ -428,5 +427,14 @@ minetest.register_craftitem("mcl_fishing:pufferfish_raw", {
|
|||
on_secondary_use = minetest.item_eat(1),
|
||||
stack_max = 64,
|
||||
groups = { food=2, eatable=1, brewitem = 1 },
|
||||
_mcl_saturation = 0.2,
|
||||
-- _mcl_saturation = 0.2,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing)
|
||||
|
||||
if itemstack:get_name() == "mcl_fishing:pufferfish_raw" then
|
||||
mcl_potions.poison_func(user, 1/3, 60)
|
||||
end
|
||||
|
||||
end )
|
||||
|
|
|
@ -4,5 +4,6 @@ mcl_core
|
|||
mcl_sounds
|
||||
mcl_craftguide
|
||||
mcl_achievements
|
||||
mcl_particles
|
||||
doc?
|
||||
screwdriver?
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
local S = minetest.get_translator("mcl_furnaces")
|
||||
|
||||
local LIGHT_ACTIVE_FURNACE = 13
|
||||
|
||||
--
|
||||
-- Formspecs
|
||||
--
|
||||
|
@ -144,6 +146,40 @@ local function on_metadata_inventory_take(pos, listname, index, stack, player)
|
|||
end
|
||||
end
|
||||
|
||||
local function spawn_flames(pos, param2)
|
||||
local minrelpos, maxrelpos
|
||||
local dir = minetest.facedir_to_dir(param2)
|
||||
if dir.x > 0 then
|
||||
minrelpos = { x = -0.6, y = -0.05, z = -0.25 }
|
||||
maxrelpos = { x = -0.55, y = -0.45, z = 0.25 }
|
||||
elseif dir.x < 0 then
|
||||
minrelpos = { x = 0.55, y = -0.05, z = -0.25 }
|
||||
maxrelpos = { x = 0.6, y = -0.45, z = 0.25 }
|
||||
elseif dir.z > 0 then
|
||||
minrelpos = { x = -0.25, y = -0.05, z = -0.6 }
|
||||
maxrelpos = { x = 0.25, y = -0.45, z = -0.55 }
|
||||
elseif dir.z < 0 then
|
||||
minrelpos = { x = -0.25, y = -0.05, z = 0.55 }
|
||||
maxrelpos = { x = 0.25, y = -0.45, z = 0.6 }
|
||||
else
|
||||
return
|
||||
end
|
||||
mcl_particles.add_node_particlespawner(pos, {
|
||||
amount = 4,
|
||||
time = 0,
|
||||
minpos = vector.add(pos, minrelpos),
|
||||
maxpos = vector.add(pos, maxrelpos),
|
||||
minvel = { x = -0.01, y = 0, z = -0.01 },
|
||||
maxvel = { x = 0.01, y = 0.1, z = 0.01 },
|
||||
minexptime = 0.3,
|
||||
maxexptime = 0.6,
|
||||
minsize = 0.4,
|
||||
maxsize = 0.8,
|
||||
texture = "mcl_particles_flame.png",
|
||||
glow = LIGHT_ACTIVE_FURNACE,
|
||||
}, "low")
|
||||
end
|
||||
|
||||
local function swap_node(pos, name)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == name then
|
||||
|
@ -151,37 +187,79 @@ local function swap_node(pos, name)
|
|||
end
|
||||
node.name = name
|
||||
minetest.swap_node(pos, node)
|
||||
if name == "mcl_furnaces:furnace_active" then
|
||||
spawn_flames(pos, node.param2)
|
||||
else
|
||||
mcl_particles.delete_node_particlespawners(pos)
|
||||
end
|
||||
end
|
||||
|
||||
local function furnace_reset_delta_time(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local time_speed = tonumber(minetest.settings:get('time_speed') or 72)
|
||||
if (time_speed < 0.1) then
|
||||
return
|
||||
end
|
||||
local time_multiplier = 86400 / time_speed
|
||||
local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier)
|
||||
|
||||
-- TODO: Change meta:get/set_string() to get/set_float() for 'last_gametime'.
|
||||
-- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000
|
||||
local last_game_time = meta:get_string("last_gametime")
|
||||
if last_game_time then
|
||||
last_game_time = tonumber(last_game_time)
|
||||
end
|
||||
if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then
|
||||
return
|
||||
end
|
||||
|
||||
meta:set_string("last_gametime", tostring(current_game_time))
|
||||
end
|
||||
|
||||
local function furnace_get_delta_time(pos, elapsed)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local time_speed = tonumber(minetest.settings:get('time_speed') or 72)
|
||||
local current_game_time
|
||||
if (time_speed < 0.1) then
|
||||
return meta, elapsed
|
||||
else
|
||||
local time_multiplier = 86400 / time_speed
|
||||
current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier)
|
||||
end
|
||||
|
||||
local last_game_time = meta:get_string("last_gametime")
|
||||
if last_game_time then
|
||||
last_game_time = tonumber(last_game_time)
|
||||
end
|
||||
if not last_game_time or last_game_time < 1 then
|
||||
last_game_time = current_game_time - 0.1
|
||||
elseif last_game_time == current_game_time then
|
||||
current_game_time = current_game_time + 1.0
|
||||
end
|
||||
|
||||
local elapsed_game_time = .0 + current_game_time - last_game_time
|
||||
|
||||
meta:set_string("last_gametime", tostring(current_game_time))
|
||||
|
||||
return meta, elapsed_game_time
|
||||
end
|
||||
|
||||
local function furnace_node_timer(pos, elapsed)
|
||||
--
|
||||
-- Inizialize metadata
|
||||
--
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta, elapsed_game_time = furnace_get_delta_time(pos, elapsed)
|
||||
|
||||
local fuel_time = meta:get_float("fuel_time") or 0
|
||||
local src_time = meta:get_float("src_time") or 0
|
||||
local src_item = meta:get_string("src_item") or ""
|
||||
local fuel_totaltime = meta:get_float("fuel_totaltime") or 0
|
||||
|
||||
local time_multiplier = 86400 / (minetest.settings:get('time_speed') or 72)
|
||||
local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier)
|
||||
|
||||
local last_game_time = meta:get_string("last_gametime") -- FIXME: In Windows s(g)et_float() works OK but under Linux it returns rounded 2-byte values like 449540.000000000 which are unusable
|
||||
if last_game_time then
|
||||
last_game_time = tonumber(last_game_time)
|
||||
end
|
||||
if not last_game_time or last_game_time < 1 then
|
||||
last_game_time = current_game_time
|
||||
elseif last_game_time == current_game_time then
|
||||
current_game_time = current_game_time + 1.0
|
||||
end
|
||||
local elapsed_game_time = .0 + current_game_time - last_game_time
|
||||
|
||||
local inv = meta:get_inventory()
|
||||
local srclist, fuellist
|
||||
|
||||
local cookable, cooked
|
||||
local active
|
||||
local active = true
|
||||
local fuel
|
||||
|
||||
srclist = inv:get_list("src")
|
||||
|
@ -192,8 +270,6 @@ local function furnace_node_timer(pos, elapsed)
|
|||
-- Reset cooking progress in this case
|
||||
src_time = 0
|
||||
src_item = srclist[1]:get_name()
|
||||
elapsed_game_time = 1 -- ?FIXME? Can break mechanics if it loads furnaces during 'skip the night'
|
||||
-- added to prevent instant cooking when we didn't touch the furnace for a long time and then load it
|
||||
end
|
||||
|
||||
local update = true
|
||||
|
@ -294,7 +370,10 @@ local function furnace_node_timer(pos, elapsed)
|
|||
local result = false
|
||||
|
||||
if active then
|
||||
local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
|
||||
local fuel_percent = 0
|
||||
if fuel_totaltime > 0 then
|
||||
fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
|
||||
end
|
||||
formspec = active_formspec(fuel_percent, item_percent)
|
||||
swap_node(pos, "mcl_furnaces:furnace_active")
|
||||
-- make sure timer restarts automatically
|
||||
|
@ -317,14 +396,21 @@ local function furnace_node_timer(pos, elapsed)
|
|||
meta:set_string("src_item", "")
|
||||
end
|
||||
meta:set_string("formspec", formspec)
|
||||
meta:set_string("last_gametime", tostring(current_game_time)) -- FIXME: In Windows s(g)et_float() works OK but under Linux it returns rounded 2-byte values like 449540.000000000 which are unusable
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
local on_rotate
|
||||
local on_rotate, after_rotate_active
|
||||
if minetest.get_modpath("screwdriver") then
|
||||
on_rotate = screwdriver.rotate_simple
|
||||
after_rotate_active = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
mcl_particles.delete_node_particlespawners(pos)
|
||||
if node.name == "mcl_furnaces:furnace" then
|
||||
return
|
||||
end
|
||||
spawn_flames(pos, node.param2)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("mcl_furnaces:furnace", {
|
||||
|
@ -369,19 +455,31 @@ minetest.register_node("mcl_furnaces:furnace", {
|
|||
inv:set_size('fuel', 1)
|
||||
inv:set_size('dst', 1)
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
mcl_particles.delete_node_particlespawners(pos)
|
||||
end,
|
||||
|
||||
on_metadata_inventory_move = function(pos)
|
||||
-- Reset accumulated game time when player works with furnace:
|
||||
furnace_reset_delta_time(pos)
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
on_metadata_inventory_put = function(pos)
|
||||
-- Reset accumulated game time when player works with furnace:
|
||||
furnace_reset_delta_time(pos)
|
||||
-- start timer function, it will sort out whether furnace can burn or not.
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
on_metadata_inventory_take = function(pos)
|
||||
-- Reset accumulated game time when player works with furnace:
|
||||
furnace_reset_delta_time(pos)
|
||||
-- start timer function, it will helpful if player clears dst slot
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
on_metadata_inventory_take = on_metadata_inventory_take,
|
||||
on_receive_fields = receive_fields,
|
||||
_mcl_blast_resistance = 3.5,
|
||||
_mcl_hardness = 3.5,
|
||||
|
@ -398,7 +496,7 @@ minetest.register_node("mcl_furnaces:furnace_active", {
|
|||
},
|
||||
paramtype2 = "facedir",
|
||||
paramtype = "light",
|
||||
light_source = 13,
|
||||
light_source = LIGHT_ACTIVE_FURNACE,
|
||||
drop = "mcl_furnaces:furnace",
|
||||
groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1},
|
||||
is_ground_content = false,
|
||||
|
@ -420,6 +518,13 @@ minetest.register_node("mcl_furnaces:furnace_active", {
|
|||
meta:from_table(meta2:to_table())
|
||||
end,
|
||||
|
||||
on_construct = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
spawn_flames(pos, node.param2)
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
mcl_particles.delete_node_particlespawners(pos)
|
||||
end,
|
||||
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
|
@ -429,6 +534,7 @@ minetest.register_node("mcl_furnaces:furnace_active", {
|
|||
_mcl_blast_resistance = 3.5,
|
||||
_mcl_hardness = 3.5,
|
||||
on_rotate = on_rotate,
|
||||
after_rotate = after_rotate_active,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -445,9 +551,19 @@ if minetest.get_modpath("doc") then
|
|||
doc.add_entry_alias("nodes", "mcl_furnaces:furnace", "nodes", "mcl_furnaces:furnace_active")
|
||||
end
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Active furnace flame particles",
|
||||
name = "mcl_furnaces:flames",
|
||||
nodenames = {"mcl_furnaces:furnace_active"},
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
spawn_flames(pos, node.param2)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Legacy
|
||||
minetest.register_lbm({
|
||||
label = "Update furnace formspecs (0.60.0",
|
||||
label = "Update furnace formspecs (0.60.0)",
|
||||
name = "mcl_furnaces:update_formspecs_0_60_0",
|
||||
-- Only update inactive furnaces because active ones should update themselves
|
||||
nodenames = { "mcl_furnaces:furnace" },
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
-- TODO: Add special status effects for raw flesh
|
||||
|
||||
local S = minetest.get_translator("mcl_mobitems")
|
||||
|
||||
minetest.register_craftitem("mcl_mobitems:rotten_flesh", {
|
||||
|
@ -136,6 +134,7 @@ minetest.register_craftitem("mcl_mobitems:cooked_rabbit", {
|
|||
stack_max = 64,
|
||||
})
|
||||
|
||||
-- Reset food poisoning and status effects
|
||||
local drink_milk = function(itemstack, player, pointed_thing)
|
||||
local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing)
|
||||
-- Check if we were allowed to drink this (eat delay check)
|
||||
|
@ -146,15 +145,13 @@ local drink_milk = function(itemstack, player, pointed_thing)
|
|||
return bucket
|
||||
end
|
||||
|
||||
-- TODO: Clear *all* status effects
|
||||
minetest.register_craftitem("mcl_mobitems:milk_bucket", {
|
||||
description = S("Milk"),
|
||||
_tt_help = minetest.colorize("#00FF00", S("Cures poison and removes all potion effects")),
|
||||
_doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning and removes potion effects, but restores no hunger points."),
|
||||
_doc_items_usagehelp = "Rightclick to drink the milk.",
|
||||
_tt_help = minetest.colorize("#00FF00", S("Removes all status effects")),
|
||||
_doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points."),
|
||||
_doc_items_usagehelp = S("Use the placement key to drink the milk."),
|
||||
inventory_image = "mcl_mobitems_bucket_milk.png",
|
||||
wield_image = "mcl_mobitems_bucket_milk.png",
|
||||
-- Clear poisoning when used
|
||||
on_place = drink_milk,
|
||||
on_secondary_use = drink_milk,
|
||||
stack_max = 1,
|
||||
|
@ -223,8 +220,7 @@ minetest.register_craftitem("mcl_mobitems:ghast_tear", {
|
|||
_doc_items_longdesc = S("Place this item in an item frame as decoration."),
|
||||
wield_image = "mcl_mobitems_ghast_tear.png",
|
||||
inventory_image = "mcl_mobitems_ghast_tear.png",
|
||||
-- TODO: Reveal item when it's useful
|
||||
groups = { brewitem = 1, not_in_creative_inventory = 0 },
|
||||
groups = { brewitem = 1 },
|
||||
stack_max = 64,
|
||||
})
|
||||
|
||||
|
@ -270,8 +266,7 @@ minetest.register_craftitem("mcl_mobitems:rabbit_foot", {
|
|||
_doc_items_longdesc = S("Must be your lucky day! Place this item in an item frame for decoration."),
|
||||
wield_image = "mcl_mobitems_rabbit_foot.png",
|
||||
inventory_image = "mcl_mobitems_rabbit_foot.png",
|
||||
-- TODO: Reveal item when it's useful
|
||||
groups = { brewitem = 1, not_in_creative_inventory = 0 },
|
||||
groups = { brewitem = 1 },
|
||||
stack_max = 64,
|
||||
})
|
||||
|
||||
|
@ -279,7 +274,7 @@ minetest.register_craftitem("mcl_mobitems:saddle", {
|
|||
description = S("Saddle"),
|
||||
_tt_help = S("Can be placed on animals to ride them"),
|
||||
_doc_items_longdesc = S("Saddles can be put on some animals in order to mount them."),
|
||||
_doc_items_usagehelp = "Rightclick an animal (with the saddle in your hand) to try put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by rightclicking them again.",
|
||||
_doc_items_usagehelp = S("Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again."),
|
||||
wield_image = "mcl_mobitems_saddle.png",
|
||||
inventory_image = "mcl_mobitems_saddle.png",
|
||||
groups = { transport = 1 },
|
||||
|
@ -440,3 +435,12 @@ minetest.register_craft({
|
|||
{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",},
|
||||
{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}},
|
||||
})
|
||||
|
||||
minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing)
|
||||
|
||||
-- poisoning with spider eye
|
||||
if itemstack:get_name() == "mcl_mobitems:spider_eye" then
|
||||
mcl_potions.poison_func(user, 1, 4)
|
||||
end
|
||||
|
||||
end )
|
||||
|
|
|
@ -1,32 +1,57 @@
|
|||
# textdomain: mcl_mobitems
|
||||
Rotten Flesh=Gammelfleisch
|
||||
80% chance of food poisoning=80% Wahrscheinlichkeit von Lebensmittelvergiftung
|
||||
|
||||
Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Igitt! Dieses Stück Fleisch hat wohl bessere Tage gesehen. Wenn Sie es essen, werden Sie sofort vergiftet und erleiden einen Schaden von 4 Trefferpunkten. Aber gezähmte Wölfe können es problemlos fressen.
|
||||
|
||||
Raw Mutton=Rohes Hammelfleisch
|
||||
|
||||
Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Rohes Hammelfleisch ist das Fleisch eines Schafes und ein Lebensmittel, welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen Nährwert deutlich zu erhöhen.
|
||||
|
||||
Cooked Mutton=Gebratenes Hammelfleisch
|
||||
Cooked mutton is the cooked flesh from a sheep and is used as food.=Gebratenes Hammelfleisch ist das gebratene Fleisch eines Schafs und dient als Lebensmittel.
|
||||
Raw Beef=Rohes Rindfleisch
|
||||
|
||||
Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Rohes Rindfleisch ist das Fleisch von Kühen und kann problemlos gegessen werden. Es kann gegart werden, um den Nährwert deutlich zu erhöhen.
|
||||
|
||||
Steak=Steak
|
||||
Steak is cooked beef from cows and can be eaten.=Steak ist gebratenes Rindfleisch und kann gegessen werden.
|
||||
Raw Chicken=Rohes Hühnchen
|
||||
30% chance of food poisoning=30% Wahrscheinlichkeit von Lebensmittelvergiftung
|
||||
|
||||
Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Rohes Hühnchen ist ein Lebensmittel, das nicht sicher für den Verzehr ist. Sie können es essen, um ein paar Hungerpunkte zu erhalten, aber mit einer Wahrscheinlichkeit von 30% erleiden Sie eine Lebensmittelvergiftung, die Ihre Hungerrate für eine Weile erhöht. Braten Sie ein rohes Hühnchen, um es sicher zuzubereiten und den Nährwert zu erhöhen.
|
||||
|
||||
Cooked Chicken=Gebratenes Hühnchen
|
||||
A cooked chicken is a healthy food item which can be eaten.=Ein gebratenes Hühnchen ist ein gesundes essbares Lebensmittel.
|
||||
Raw Porkchop=Rohes Schweinefleisch
|
||||
|
||||
A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Ein rohes Stück Schweinefleisch kann bedenkenlos gegessen werden. Man kann es braten, um seinen Nährwert stark zu erhöhen.
|
||||
|
||||
Cooked Porkchop=Gebratenes Schweinefleisch
|
||||
Cooked porkchop is the cooked flesh of a pig and is used as food.=Ein gebratenes Stück Schweinefleisch ist ein gutes Lebensmittel.
|
||||
Raw Rabbit=Rohes Kaninchen
|
||||
|
||||
Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Rohes Kaninchenfleisch ist ein Lebensmittel, welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen Nährwert zu erhöhen.
|
||||
|
||||
Cooked Rabbit=Gebratenes Kaninchen
|
||||
This is a food item which can be eaten.=Dies ist ein essbares Lebensmittel.
|
||||
Milk=Milch
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Milch ist sehr erfrischend und wird erhalten, wenn ein Eimer an einer Kuh benutzt wird. Wenn es getrunken wird, werden alle Vergiftungserscheinungen kuriert, aber es werden keine Hungerpunkte wiederhergestellt.
|
||||
Removes all status effects=Entfernt alle Statuseffekte
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Milch ist sehr erfrischend. Milch erhält man, indem man einen Eimer an einer Kuh benutzt. Wenn die Milch getrunken wird, werden alle Statuseffekte entfernt, aber es werden keine Hungerpunkte wiederhergestellt.
|
||||
|
||||
Use the placement key to drink the milk.=Platzierungstaste benutzen, um Milch zu trinken.
|
||||
Spider Eye=Spinnenauge
|
||||
Poisonous=Giftig
|
||||
|
||||
Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Spinnenaugen werden hauptsächlich in der Fertigung benutzt. Wenn Sie wirklich verzweifelt sind, können sie es essen, aber das wird Sie kurz vergiften.
|
||||
|
||||
Bone=Knochen
|
||||
|
||||
Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Knochen können benutzt werden, um Wölfe zu zähmen, damit sie einen beschützen. Sie außerdem nützlich in der Fertigung.
|
||||
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Halten Sie den Knochen in der Nähe von Wölfen, um sie anzulocken. Benutzen Sie die „Platzieren“-Taste auf dem Wolf, um ihm den Knochen zu geben und ihn zu zähmen. Sie können dem gezähmten Wolf Befehle erteilen, indem Sie die „Platzieren“-Taste auf ihm benutzen.
|
||||
|
||||
String=Faden
|
||||
Strings are used in crafting.=Fäden sind nützlich in der Fertigung.
|
||||
Blaze Rod=Lohenrute
|
||||
|
@ -38,7 +63,9 @@ Magma cream is a crafting component.=Magmacreme ist eine Fertigungskomponente.
|
|||
Ghast Tear=Ghast-Träne
|
||||
Place this item in an item frame as decoration.=Platzieren Sie diesen Gegenstand in einem Rahmel als Deko.
|
||||
Nether Star=Nether-Stern
|
||||
|
||||
A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Ein Netherstern wird abgeworfen, wenn der Wither stirbt. Platzieren Sie ihn in einen Rahmen, um der Welt zu zeigen, wie großartig Sie sind!
|
||||
|
||||
Leather=Leder
|
||||
Leather is a versatile crafting component.=Leder ist eine vielseitige Fertigungskomponente.
|
||||
Feather=Feder
|
||||
|
@ -48,7 +75,11 @@ Rabbit hide is used to create leather.=Kaninchenfell wird zur Herstellung von Le
|
|||
Rabbit's Foot=Hasenpfote
|
||||
Must be your lucky day! Place this item in an item frame for decoration.=Muss wohl Ihr Glückstag sein! Platzieren Sie diesen Gegenstand in einen Rahmen zur Dekoration.
|
||||
Saddle=Sattel
|
||||
Can be placed on animals to ride them=Kann auf Tieren platziert werden, um sie zu reiten
|
||||
Saddles can be put on some animals in order to mount them.=Sattel können auf einigen Tieren platziert werden, um sich aufzusatteln.
|
||||
|
||||
Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Platzierungstaste benutzen, während man den Sattel in der Hand hält, um zu versuchen, den Sattel anzulegen. Sattel passen auf Pferde, Maultiere, Esel und Schweine. Pferde, Maultiere und Esel müssen zuerst gezähmt werden, sonst werden sie den Sattel abweisen. Mit der Platzierungstaste kann man aufsatteln.
|
||||
|
||||
Rabbit Stew=Kaninchenragout
|
||||
Rabbit stew is a very nutricious food item.=Kaninchenragout ist ein sehr nahrhaftes Lebensmittel.
|
||||
Shulker Shell=Schulkerschale
|
||||
|
@ -57,12 +88,8 @@ Slimeball=Schleimkugel
|
|||
Slimeballs are used in crafting. They are dropped from slimes.=Schleimkugeln werden in der Fertigung verwendet. Sie werden von Schleimen fallen gelassen.
|
||||
Gunpowder=Schießpulver
|
||||
Carrot on a Stick=Karottenrute
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=Eine Karottenrute kann auf gesattelten Schweinen angewendet werden, um sie zu reiten.
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Platzieren Sie sie auf einem Schwein mit Sattel, um sich aufzusatteln. Sie können nun das Schwein wie ein Pferd reiten. Schweine werden auch auf Sie zugehen, wenn Sie einfach nur die Karottenrute halten.
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Halten Sie den Knochen in der Nähe von Wölfen, um sie anzulocken. Benutzen Sie die „Platzieren“-Taste auf dem Wolf, um ihm den Knochen zu geben und ihn zu zähmen. Sie können dem gezähmten Wolf Befehle erteilen, indem Sie die „Platzieren“-Taste auf ihm benutzen.
|
||||
Lets you ride a saddled pig=Um auf gesattelten Schweinen zu reiten
|
||||
30% chance of food poisoning=30% Wahrscheinlichkeit von Lebensmittelvergiftung
|
||||
80% chance of food poisoning=80% Wahrscheinlichkeit von Lebensmittelvergiftung
|
||||
Cures poison=Kuriert Vergiftung
|
||||
Can be placed on animals to ride them=Kann auf Tieren platziert werden, um sie zu reiten
|
||||
Poisonous=Giftig
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=Eine Karottenrute kann auf gesattelten Schweinen angewendet werden, um sie zu reiten.
|
||||
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Platzieren Sie sie auf einem Schwein mit Sattel, um sich aufzusatteln. Sie können nun das Schwein wie ein Pferd reiten. Schweine werden auch auf Sie zugehen, wenn Sie einfach nur die Karottenrute halten.
|
||||
|
||||
|
|
|
@ -1,32 +1,57 @@
|
|||
# textdomain: mcl_mobitems
|
||||
Rotten Flesh=Carne podrida
|
||||
80% chance of food poisoning=
|
||||
|
||||
Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=¡Qué asco! Este pedazo de carne claramente ha tenido días mejores. Si está realmente estas desesperado, puedes comerlo para restablecer algunos puntos de hambre, pero hay un 80% de posibilidades de que cause intoxicación alimentaria, lo que aumenta su hambre por un tiempo.
|
||||
|
||||
Raw Mutton=Cordero crudo
|
||||
|
||||
Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=El cordero crudo es la carne de una oveja y se puede comer de manera segura. Cocinarlo aumentará en gran medida su valor nutricional.
|
||||
|
||||
Cooked Mutton=Cordero cocinado
|
||||
Cooked mutton is the cooked flesh from a sheep and is used as food.=El cordero cocinado es la carne cocinada de oveja y se usa como alimento.
|
||||
Raw Beef=Filete crudo
|
||||
|
||||
Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=La carne cruda es la carne de las vacas y se puede comer de manera segura. Cocinarlo aumentará en gran medida su valor nutricional.
|
||||
|
||||
Steak=Filete cocinado
|
||||
Steak is cooked beef from cows and can be eaten.=El filete cocinado se cocina con filetes crudos de vaca y se puede comer.
|
||||
Raw Chicken=Pollo crudo
|
||||
30% chance of food poisoning=
|
||||
|
||||
Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=El pollo crudo es un alimento que no es seguro consumir. Puedes comerlo para restaurar algunos puntos de hambre, pero hay un 30% de posibilidades de sufrir intoxicación alimentaria, lo que aumenta su tasa de hambre por un tiempo. Cocinar pollo crudo hará que sea seguro comerlo y aumentará su valor nutricional.
|
||||
|
||||
Cooked Chicken=Pollo cocinado
|
||||
A cooked chicken is a healthy food item which can be eaten.=Un pollo cocinado es un alimento saludable que se puede comer.
|
||||
Raw Porkchop=Chuleta de cerdo cruda
|
||||
|
||||
A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Una chuleta de cerdo cruda es la carne de un cerdo y se puede comer de manera segura. Cocinarlo aumentará en gran medida su valor nutricional.
|
||||
|
||||
Cooked Porkchop=Chuleta de cerdo cocinada
|
||||
Cooked porkchop is the cooked flesh of a pig and is used as food.=La chuleta de cerdo cocinada es la carne cocida de un cerdo y se usa como alimento.
|
||||
Raw Rabbit=Conejo crudo
|
||||
|
||||
Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=El conejo crudo es un alimento de un conejo muerto. Se puede comer de forma segura. Cocinar aumentará su valor nutricional.
|
||||
|
||||
Cooked Rabbit=Conejo cocinado
|
||||
This is a food item which can be eaten.=Este es un alimento que se puede comer.
|
||||
Milk=Leche
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=La leche es muy refrescante y se puede obtener usando un cubo en una vaca. Beberlo curará todas las formas de envenenamiento, pero no restaura los puntos de hambre.
|
||||
Removes all status effects=
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=
|
||||
|
||||
Use the placement key to drink the milk.=
|
||||
Spider Eye=Ojo de araña
|
||||
Poisonous=
|
||||
|
||||
Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Los ojos de araña se utilizan principalmente en la elaboración. Si estás realmente desesperado, puedes comerte un ojo de araña, pero te envenenará brevemente.
|
||||
|
||||
Bone=Hueso
|
||||
|
||||
Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Los huesos se pueden usar para domar a los lobos para que te protejan. También son útiles como ingrediente de elaboración.
|
||||
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Empuña el hueso cerca de los lobos para atraerlos. Usa la tecla "Colocar" en el lobo para darle un hueso y domesticarlo. Luego puede dar órdenes al lobo domesticado utilizando la tecla "Colocar".
|
||||
|
||||
String=Cuerda
|
||||
Strings are used in crafting.=Las cuerdas se usan en la elaboración.
|
||||
Blaze Rod=Vara de blaze
|
||||
|
@ -38,7 +63,9 @@ Magma cream is a crafting component.=La crema de magma es un componente de elabo
|
|||
Ghast Tear=Lágrima espectral
|
||||
Place this item in an item frame as decoration.=Coloque este artículo en un marco de artículo como decoración.
|
||||
Nether Star=Estrella del Nether
|
||||
|
||||
A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Se cae una estrella cuando muere un Wither. ¡Colócalo en el marco de un objeto para mostrarle al mundo lo duro que eres! O simplemente como decoración.
|
||||
|
||||
Leather=Cuero
|
||||
Leather is a versatile crafting component.=El cuero es un componente de elaboración versátil.
|
||||
Feather=Pluma
|
||||
|
@ -48,7 +75,11 @@ Rabbit hide is used to create leather.=La piel de conejo se usa para crear cuero
|
|||
Rabbit's Foot=Pata de conejo
|
||||
Must be your lucky day! Place this item in an item frame for decoration.=¡Debe ser tu día de suerte! Coloque este artículo en un marco de artículos para la decoración.
|
||||
Saddle=Montura
|
||||
Can be placed on animals to ride them=
|
||||
Saddles can be put on some animals in order to mount them.=Se pueden poner monturas en algunos animales para montarlos.
|
||||
|
||||
Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=
|
||||
|
||||
Rabbit Stew=Estofado de conejo
|
||||
Rabbit stew is a very nutricious food item.=El estofado de conejo es un alimento muy nutritivo.
|
||||
Shulker Shell=Caparazón de shulker
|
||||
|
@ -57,6 +88,15 @@ Slimeball=Bola de slime
|
|||
Slimeballs are used in crafting. They are dropped from slimes.=Las bolas de slime se usan en la elaboración. Se obtienen de slimes.
|
||||
Gunpowder=Pólvora
|
||||
Carrot on a Stick=Caña con zanahoria
|
||||
Lets you ride a saddled pig=
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=La caña con zanahoria se puede usar en cerdos ensillados para montarlos.
|
||||
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Colóquelo sobre un cerdo ensillado para montarlo. Ahora puedes montar el cerdo como un caballo. Los cerdos también caminarán hacia ti cuando solo manejes la zanahoria en un palo.
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Empuña el hueso cerca de los lobos para atraerlos. Usa la tecla "Colocar" en el lobo para darle un hueso y domesticarlo. Luego puede dar órdenes al lobo domesticado utilizando la tecla "Colocar".
|
||||
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=La leche es muy refrescante y se puede obtener usando un cubo en una vaca. Beberlo curará todas las formas de envenenamiento, pero no restaura los puntos de hambre.
|
||||
|
||||
|
|
|
@ -1,32 +1,57 @@
|
|||
# textdomain: mcl_mobitems
|
||||
Rotten Flesh=Chair Putréfiée
|
||||
80% chance of food poisoning=80% de chances d'intoxication alimentaire
|
||||
|
||||
Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Beurk! Ce morceau de chair a clairement connu des jours meilleurs. Si vous êtes vraiment désespéré, vous pouvez le manger pour restaurer quelques points de faim, mais il y a 80% de chances qu'il provoque une intoxication alimentaire, ce qui augmente votre faim pendant un certain temps.
|
||||
|
||||
Raw Mutton=Mouton Cru
|
||||
|
||||
Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Le mouton cru est la chair d'un mouton et peut être mangé en toute sécurité. La cuisson augmentera considérablement sa valeur nutritive.
|
||||
|
||||
Cooked Mutton=Mouton Cuit
|
||||
Cooked mutton is the cooked flesh from a sheep and is used as food.=Le mouton cuit est la chair cuite d'un mouton et est utilisé comme nourriture.
|
||||
Raw Beef=Boeuf Cru
|
||||
|
||||
Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Le boeuf cru est la chair des vaches et peut être mangé en toute sécurité. La cuisson augmentera considérablement sa valeur nutritive.
|
||||
|
||||
Steak=Steak
|
||||
Steak is cooked beef from cows and can be eaten.=Le steak est du boeuf cuit et peut être mangé.
|
||||
Raw Chicken=Poulet Cru
|
||||
30% chance of food poisoning=30% de chances d'intoxication alimentaire
|
||||
|
||||
Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Le poulet cru est un aliment qui n'est pas sûr à consommer. Vous pouvez le manger pour restaurer quelques points de faim, mais il y a 30% de chances de souffrir d'intoxication alimentaire, ce qui augmente votre taux de faim pendant un certain temps. La cuisson du poulet cru le rendra sûr à manger et augmentera sa valeur nutritive.
|
||||
|
||||
Cooked Chicken=Poulet Cuit
|
||||
A cooked chicken is a healthy food item which can be eaten.=Un poulet cuit est un aliment sain qui peut être mangé.
|
||||
Raw Porkchop=Porc Cru
|
||||
|
||||
A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Un porc cru est la chair d'un porc et peut être mangée en toute sécurité. La cuisson augmentera considérablement sa valeur nutritive.
|
||||
|
||||
Cooked Porkchop=Parc Cuit
|
||||
Cooked porkchop is the cooked flesh of a pig and is used as food.=Le porc cuit est la chair cuite d'un porc et est utilisé comme aliment.
|
||||
Raw Rabbit=Lapin Cru
|
||||
|
||||
Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Le lapin cru est un aliment provenant d'un lapin mort. Il peut être mangé en toute sécurité. La cuisson augmentera sa valeur nutritive.
|
||||
|
||||
Cooked Rabbit=Lapin Cuit
|
||||
This is a food item which can be eaten.=Il s'agit d'un aliment qui peut être mangé.
|
||||
Milk=Lait
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Le lait est très rafraîchissant et peut être obtenu en utilisant un seau sur une vache. Le boire guérira toutes les formes d'empoisonnement, mais ne restaure pas de points de faim.
|
||||
Removes all status effects=
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=
|
||||
|
||||
Use the placement key to drink the milk.=
|
||||
Spider Eye=Oeil d'Araignée
|
||||
Poisonous=Toxique
|
||||
|
||||
Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Les yeux d'araignée sont utilisés principalement dans l'artisanat. Si vous êtes vraiment désespéré, vous pouvez manger un œil d'araignée, mais cela vous empoisonnera brièvement.
|
||||
|
||||
Bone=Os
|
||||
|
||||
Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Les os peuvent être utilisés pour apprivoiser les loups afin de vous protéger. Ils sont également utiles comme ingrédient d'artisanat.
|
||||
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Maniez l'os près des loups pour les attirer. Utilisez la touche «Placer» sur le loup pour lui donner un os et l'apprivoiser. Vous pouvez ensuite donner des commandes au loup apprivoisé en utilisant la touche "Placer" sur celui-ci.
|
||||
|
||||
String=Ficelle
|
||||
Strings are used in crafting.=Les ficelles sont utilisées dans l'artisanat.
|
||||
Blaze Rod=Bâton de Blaze
|
||||
|
@ -38,7 +63,9 @@ Magma cream is a crafting component.=La crème de magma est un composant artisan
|
|||
Ghast Tear=Larme de Ghast
|
||||
Place this item in an item frame as decoration.=Placez cet article dans un cadre d'article comme décoration.
|
||||
Nether Star=Étoile du Nether
|
||||
|
||||
A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Une étoile du Nether est lâchée lorsque le Wither meurt. Placez-le dans un cadre d'objet pour montrer au monde à quel point vous êtes génial! Ou tout simplement comme décoration.
|
||||
|
||||
Leather=Cuir
|
||||
Leather is a versatile crafting component.=Le cuir est un élément d'artisanat polyvalent.
|
||||
Feather=Plume
|
||||
|
@ -48,7 +75,11 @@ Rabbit hide is used to create leather.=La peau de lapin est utilisée pour crée
|
|||
Rabbit's Foot=Patte de Lapin
|
||||
Must be your lucky day! Place this item in an item frame for decoration.=Ce doit être votre jour de chance! Placez cet article dans un cadre d'article pour la décoration.
|
||||
Saddle=Selle
|
||||
Can be placed on animals to ride them=Peut être placé sur les animaux pour les monter
|
||||
Saddles can be put on some animals in order to mount them.=Des selles peuvent être posées sur certains animaux afin de les monter.
|
||||
|
||||
Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=
|
||||
|
||||
Rabbit Stew=Ragout de Lapin
|
||||
Rabbit stew is a very nutricious food item.=Le ragoût de lapin est un aliment très nutritif.
|
||||
Shulker Shell=Carapace de Shulker
|
||||
|
@ -57,12 +88,15 @@ Slimeball=Boule de Slime
|
|||
Slimeballs are used in crafting. They are dropped from slimes.=Les boules de slime sont utilisées dans l'artisanat. Ils sont lâchés par les Slimes.
|
||||
Gunpowder=Poudre à canon
|
||||
Carrot on a Stick=Carotte sur un Batôn
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=Une carotte sur un bâton peut être utilisée sur les porcs sellés pour les monter.
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton.
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Maniez l'os près des loups pour les attirer. Utilisez la touche «Placer» sur le loup pour lui donner un os et l'apprivoiser. Vous pouvez ensuite donner des commandes au loup apprivoisé en utilisant la touche "Placer" sur celui-ci.
|
||||
Lets you ride a saddled pig=Vous permet de monter un cochon sellé
|
||||
30% chance of food poisoning=30% de chances d'intoxication alimentaire
|
||||
80% chance of food poisoning=80% de chances d'intoxication alimentaire
|
||||
Cures poison=Guérit le poison
|
||||
Can be placed on animals to ride them=Peut être placé sur les animaux pour les monter
|
||||
Poisonous=Toxique
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=Une carotte sur un bâton peut être utilisée sur les porcs sellés pour les monter.
|
||||
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton.
|
||||
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Le lait est très rafraîchissant et peut être obtenu en utilisant un seau sur une vache. Le boire guérira toutes les formes d'empoisonnement, mais ne restaure pas de points de faim.
|
||||
|
||||
|
|
|
@ -1,32 +1,57 @@
|
|||
# textdomain: mcl_mobitems
|
||||
Rotten Flesh=Гнилое мясо
|
||||
80% chance of food poisoning=Вероятность отравления 80%
|
||||
|
||||
Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=БУЭ! Этот кусок гнили явно знавал лучшие времена. Если вы отчаялись, то можете съесть его, восстановив несколько очков голода, но с вероятностью 80% вы получите пищевое отравление, которое усилит ваш голод на некоторое время.
|
||||
|
||||
Raw Mutton=Сырая баранина
|
||||
|
||||
Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая баранина это мясо овцы, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность.
|
||||
|
||||
Cooked Mutton=Жареная баранина
|
||||
Cooked mutton is the cooked flesh from a sheep and is used as food.=Жареная баранина это запечённое мясо овцы, употребляемое в пищу.
|
||||
Raw Beef=Сырая говядина
|
||||
|
||||
Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая говядина это мясо коровы, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность.
|
||||
|
||||
Steak=Стейк
|
||||
Steak is cooked beef from cows and can be eaten.=Стейк это приготовленное мясо коровы, его можно есть.
|
||||
Raw Chicken=Сырая курица
|
||||
30% chance of food poisoning=Вероятность отравления 30%
|
||||
|
||||
Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Сырая курица это продуктовый предмет, небезопасный для употребления. Вы можете его съесть для восстановления нескольких очков голода, но с вероятностью 30% вы пострадаете от пищевого отравление, которое усилит ваш голод на некоторое время. Приготовление сырой курицы сделает её безопасной для еды, значительно увеличив питательную ценность.
|
||||
|
||||
Cooked Chicken=Жареный цыплёнок
|
||||
A cooked chicken is a healthy food item which can be eaten.=Жареный цыплёнок это здоровый питательный продукт, его можно есть.
|
||||
Raw Porkchop=Сырая свинина
|
||||
|
||||
A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая свинина это мясо свиньи, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность.
|
||||
|
||||
Cooked Porkchop=Свиная отбивная
|
||||
Cooked porkchop is the cooked flesh of a pig and is used as food.=Свиная отбивная это приготовленное мясо свиньи, его можно есть.
|
||||
Raw Rabbit=Сырая крольчатина
|
||||
|
||||
Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Сырая крольчатина это мясо кролика, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность.
|
||||
|
||||
Cooked Rabbit=Приготовленный кролик
|
||||
This is a food item which can be eaten.=Это пищевой продукт, его можно есть.
|
||||
Milk=Молоко
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Молоко отлично освежает, его можно получить, применив ведро к корове. Выпив молока, вы излечитесь от всех видом отравлений, но не восстановите очков голода.
|
||||
Removes all status effects=Убирает все эффекты состояния
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Молоко отлично освежает, его можно получить, применив ведро к корове. Выпив молока, вы избавитесь от всех эффектов состояния, но не восстановите очков голода.
|
||||
|
||||
Use the placement key to drink the milk.=Используйте клавишу размещения, чтобы выпить молоко.
|
||||
Spider Eye=Паучий глаз
|
||||
Poisonous=Ядовито
|
||||
|
||||
Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Паучьи глаза в основном используются для крафтинга. Если вы отчаялись, то можете съесть их, но они вас на некоторое время отравят.
|
||||
|
||||
Bone=Кость
|
||||
|
||||
Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Кости можно использовать для приручения волков, чтобы они защищали вас.
|
||||
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Положите кость рядом с волками, чтобы привлечь их. Используйте клавишу “Разместить” на волке, чтобы дать ему кость и приручить его. Вы можете командовать приручёнными волками с помощью клавиши “Разместить”.
|
||||
|
||||
String=Нити
|
||||
Strings are used in crafting.=Нити используются для крафтинга
|
||||
Blaze Rod=Огненный стержень
|
||||
|
@ -38,7 +63,9 @@ Magma cream is a crafting component.=Лавовый крем это крафти
|
|||
Ghast Tear=Слеза гаста
|
||||
Place this item in an item frame as decoration.=Поместите это в рамку как украшение.
|
||||
Nether Star=Звезда Ада
|
||||
|
||||
A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Звезда Ада выбрасывается при смерти иссушителя. Поместите её в рамку, чтобы показать миру ваше величие! Либо просто как украшение.
|
||||
|
||||
Leather=Кожа
|
||||
Leather is a versatile crafting component.=Кожа это универсальный крафт-компонент.
|
||||
Feather=Перо
|
||||
|
@ -48,7 +75,11 @@ Rabbit hide is used to create leather.=Кроличья шкурка испол
|
|||
Rabbit's Foot=Кроличья лапка
|
||||
Must be your lucky day! Place this item in an item frame for decoration.=У вас счастливый день! Поместите этот предмет в рамку как украшение.
|
||||
Saddle=Седло
|
||||
Can be placed on animals to ride them=Можно устанавливать на животных, чтобы ездить на них
|
||||
Saddles can be put on some animals in order to mount them.=Седло можно поставить на некоторых животных, чтобы закрепляться на них.
|
||||
|
||||
Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Используйте клавишу размещения, держа седло в руке, чтобы попытаться надеть его. Сёдла подходят для лошадей, мулов, осликов и свиней. Лошади, мулы и ослики должны быть предварительно приручены, иначе они откажутся от седла. На осёдланных животных можно сесть, снова нажав на них клавишу размещения.
|
||||
|
||||
Rabbit Stew=Рагу из кролика
|
||||
Rabbit stew is a very nutricious food item.=Рагу из кролика это очень питательный продукт.
|
||||
Shulker Shell=Панцирь шалкера
|
||||
|
@ -57,12 +88,8 @@ Slimeball=Слизь
|
|||
Slimeballs are used in crafting. They are dropped from slimes.=Слизь используется для крафтинга. Она выпадает из слизняков.
|
||||
Gunpowder=Порох
|
||||
Carrot on a Stick=Удочка с морковью
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=Удочку с морковью можно использовать, чтобы оседлать свинью и поехать на ней.
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью.
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Положите кость рядом с волками, чтобы привлечь их. Используйте клавишу “Разместить” на волке, чтобы дать ему кость и приручить его. Вы можете командовать приручёнными волками с помощью клавиши “Разместить”.
|
||||
Lets you ride a saddled pig=Позволяет вам ездить на осёдланной свинье
|
||||
30% chance of food poisoning=Вероятность отравления 30%
|
||||
80% chance of food poisoning=Вероятность отравления 80%
|
||||
Cures poison=Лечит отравление
|
||||
Can be placed on animals to ride them=Можно устанавливать на животных, чтобы ездить на них
|
||||
Poisonous=Ядовито
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=Удочку с морковью можно использовать, чтобы оседлать свинью и поехать на ней.
|
||||
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью.
|
||||
|
||||
|
|
|
@ -1,32 +1,57 @@
|
|||
# textdomain: mcl_mobitems
|
||||
Rotten Flesh=
|
||||
80% chance of food poisoning=
|
||||
|
||||
Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=
|
||||
|
||||
Raw Mutton=
|
||||
|
||||
Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=
|
||||
|
||||
Cooked Mutton=
|
||||
Cooked mutton is the cooked flesh from a sheep and is used as food.=
|
||||
Raw Beef=
|
||||
|
||||
Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=
|
||||
|
||||
Steak=
|
||||
Steak is cooked beef from cows and can be eaten.=
|
||||
Raw Chicken=
|
||||
30% chance of food poisoning=
|
||||
|
||||
Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=
|
||||
|
||||
Cooked Chicken=
|
||||
A cooked chicken is a healthy food item which can be eaten.=
|
||||
Raw Porkchop=
|
||||
|
||||
A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=
|
||||
|
||||
Cooked Porkchop=
|
||||
Cooked porkchop is the cooked flesh of a pig and is used as food.=
|
||||
Raw Rabbit=
|
||||
|
||||
Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=
|
||||
|
||||
Cooked Rabbit=
|
||||
This is a food item which can be eaten.=
|
||||
Milk=
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=
|
||||
Removes all status effects=
|
||||
|
||||
Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=
|
||||
|
||||
Use the placement key to drink the milk.=
|
||||
Spider Eye=
|
||||
Poisonous=
|
||||
|
||||
Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=
|
||||
|
||||
Bone=
|
||||
|
||||
Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=
|
||||
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=
|
||||
|
||||
String=
|
||||
Strings are used in crafting.=
|
||||
Blaze Rod=
|
||||
|
@ -38,7 +63,9 @@ Magma cream is a crafting component.=
|
|||
Ghast Tear=
|
||||
Place this item in an item frame as decoration.=
|
||||
Nether Star=
|
||||
|
||||
A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=
|
||||
|
||||
Leather=
|
||||
Leather is a versatile crafting component.=
|
||||
Feather=
|
||||
|
@ -48,7 +75,11 @@ Rabbit hide is used to create leather.=
|
|||
Rabbit's Foot=
|
||||
Must be your lucky day! Place this item in an item frame for decoration.=
|
||||
Saddle=
|
||||
Can be placed on animals to ride them=
|
||||
Saddles can be put on some animals in order to mount them.=
|
||||
|
||||
Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=
|
||||
|
||||
Rabbit Stew=
|
||||
Rabbit stew is a very nutricious food item.=
|
||||
Shulker Shell=
|
||||
|
@ -57,12 +88,8 @@ Slimeball=
|
|||
Slimeballs are used in crafting. They are dropped from slimes.=
|
||||
Gunpowder=
|
||||
Carrot on a Stick=
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=
|
||||
Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=
|
||||
Lets you ride a saddled pig=
|
||||
30% chance of food poisoning=
|
||||
80% chance of food poisoning=
|
||||
Cures poison=
|
||||
Can be placed on animals to ride them=
|
||||
Poisonous=
|
||||
A carrot on a stick can be used on saddled pigs to ride them.=
|
||||
|
||||
Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=
|
||||
|
||||
|
|
|
@ -54,3 +54,4 @@ Grows in water on dirt, sand, gravel=Wächst im Wasser auf Erde, Sand, Kies
|
|||
Glows in the water=Leuchtet im Wasser
|
||||
4 possible sizes=4 mögliche Größen
|
||||
Grows on dead brain coral block=Wächst auf totem Hirnkorallenblock
|
||||
Sea Pickle=Meeresgurke
|
||||
|
|
|
@ -48,3 +48,4 @@ Corals fans grow on top of coral blocks and need to be inside a water source to
|
|||
Seagrass grows inside water on top of dirt, sand or gravel.=La hierba marina crece dentro del agua sobre tierra, arena o grava.
|
||||
A decorative block that serves as a great furnace fuel.=Un bloque decorativo que sirve como un gran combustible de horno.
|
||||
Dried kelp is a food item.=Las algas secas son un alimento.
|
||||
Sea Pickle=
|
||||
|
|
|
@ -12,7 +12,7 @@ Nether Portal=Netherportal
|
|||
A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Ein Netherportal teleportiert Kreaturen und Objekte zur heißen und gefährlichen Nether-Dimension (und zurück!). Betreten auf eigene Gefahr!
|
||||
Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Stellen Sie sich ins Portal für einen Moment, um sich zu teleportieren. Beim ersten Mal wird auch ein Portal in der anderen Dimension erschaffen. Wenn ein Netherportal im Nether gebaut wird, wird es zurück zur Oberwelt führen. Ein Netherportal wird zerstört, wenn das Obsidian, das ihn umgibt, zerstört wird, oder, wenn es einer Explosion ausgesetzt war.
|
||||
Obsidian is also used as the frame of Nether portals.=Obsidian wird auch als Rahmen von Netherportalen benutzt.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Um ein Netherportal zu öffnen, platzieren Sie einen aufrechten Rahmen aus Obsidian mit einer Breite von 4 Blöcken und einer Höhe von 5 Blöcken, nur mit Luft in der Mitte. Nachdem Sie den Rahmen gebaut haben, entfachen Sie ein Feuer im Obsidianrahmen. Netherportale funktionieren nur in der Oberwelt und im Nether.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Um ein Netherportal zu öffnen, platzieren Sie einen aufrechten Rahmen aus Obsidian mit einer Breite von mindestens 4 Blöcken und einer Höhe von mindestens 5 Blöcken, nur mit Luft in der Mitte. Nachdem Sie den Rahmen gebaut haben, entfachen Sie ein Feuer im Obsidianrahmen. Netherportale funktionieren nur in der Oberwelt und im Nether.
|
||||
Once placed, an eye of ender can not be taken back.=Sobald platziert, kann ein Enderauge nicht mehr zurück genommen werden.
|
||||
Used to construct end portals=Benutzt zur Konstruktion von Endportalen
|
||||
Liquid container=Flüssigkeitsbehälter
|
||||
|
|
|
@ -12,5 +12,8 @@ Nether Portal=Portal del Nether
|
|||
A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portal Nether teletransporta criaturas y objetos a la dimensión Nether ardiente y peligrosa (¡y viceversa!). ¡Entra bajo tu propio riesgo!
|
||||
Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=SPárate en el portal por un momento para activar la teletransportación. Entrar en un portal Nether por primera vez también creará un nuevo portal en la otra dimensión. Si se ha construido un portal Nether en Nether, conducirá al Overworld. Un portal abisal se destruye si se destruye cualquiera de las obsidianas que lo rodean, o si quedó atrapado en una explosión.
|
||||
Obsidian is also used as the frame of Nether portals.=La obsidiana también se usa como marco de portal del End.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Para abrir un portal Nether, coloque un marco vertical de obsidiana con un ancho de 4 bloques y una altura de 5 bloques, dejando solo aire en el centro. Después de colocar este marco, enciende un fuego en el marco de obsidiana. Los portales de Nether solo funcionan en Overworld y Nether.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=
|
||||
Once placed, an eye of ender can not be taken back.=Una vez colocado, un ojo de ender no puede ser retirado.
|
||||
|
||||
#OUTDATED:
|
||||
#To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Para abrir un portal Nether, coloque un marco vertical de obsidiana con un ancho de 4 bloques y una altura de 5 bloques, dejando solo aire en el centro. Después de colocar este marco, enciende un fuego en el marco de obsidiana. Los portales de Nether solo funcionan en Overworld y Nether.
|
||||
|
|
|
@ -10,6 +10,9 @@ Nether Portal=Portail du Nether
|
|||
A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!
|
||||
Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'autre dimension. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruit, ou s'il a été pris dans une explosion.
|
||||
Obsidian is also used as the frame of Nether portals.=Obsidian is also used as the frame of Nether portals.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur de 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre en obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=
|
||||
Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'ender ne peut pas être repris.
|
||||
Used to construct end portals=Utilisé pour construire des portails d'End
|
||||
|
||||
# OUTDATED:
|
||||
#To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur de 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre en obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether.
|
||||
|
|
|
@ -10,6 +10,9 @@ Nether Portal=Адский портал
|
|||
A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Адский портал переносит создания и объекты в горячее и опасное измерение Ад (и обратно!). Используйте на свой страх и риск!
|
||||
Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Стойте в портале несколько секунд для запуска телепортации. Вход в портал Ада в первый раз приведёт к созданию аналогичного портала в другом измерении. Если Адский портал создан в Аду, он ведёт в Верхний мир. Портал Ада уничтожается, если уничтожается любой блок обсидиана из окружающих его, либо при задевании взрывом.
|
||||
Obsidian is also used as the frame of Nether portals.=Обсидиан также используется в качестве рамки портала Ада
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Чтобы открыть портал Ада, постройте рамку из обсидиана шириной 4 блока и высотой 5, оставляя в центре лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Аду.
|
||||
To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=
|
||||
Once placed, an eye of ender can not be taken back.=Однажды размещённое, око Предела нельзя взять обратно.
|
||||
Used to construct end portals=Используется для создания порталов Предела
|
||||
|
||||
# OUTDATED:
|
||||
#To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Чтобы открыть портал Ада, постройте рамку из обсидиана шириной 4 блока и высотой 5, оставляя в центре лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Аду.
|
||||
|
|