This commit is contained in:
kay27 2020-10-09 03:33:43 +04:00
commit 3606d9d43e
147 changed files with 4185 additions and 1646 deletions

View File

@ -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>

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -1,3 +1,4 @@
name = mcl_explosions
description = A common API to create explosions.
depends = mcl_particles
optional_depends = mcl_fire

View File

@ -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)

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 938 B

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

View File

@ -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()

View File

@ -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,40 +2118,40 @@ 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
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"})
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
-- did we find land?
if lp then
-- If mob in or on dangerous block, look for land
if is_in_danger then
-- 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"})
local vec = {
x = lp.x - s.x,
z = lp.z - s.z
}
lp = #lp > 0 and lp[random(#lp)]
yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
-- did we find land?
if lp then
if lp.x > s.x then yaw = yaw + pi end
local vec = {
x = lp.x - s.x,
z = lp.z - s.z
}
-- look towards land and jump/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
yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
if lp.x > s.x then yaw = yaw + pi end
-- look towards land and move in that direction
yaw = set_yaw(self, yaw, 6)
set_velocity(self, self.walk_velocity)
end
end
-- A danger is near but mob is not inside
else
@ -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

View File

@ -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
-------------

View File

@ -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

View File

@ -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",

View File

@ -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)

View File

@ -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 = {

View File

@ -1,4 +1,5 @@
mcl_init
mcl_particles
default?
mcl_mobs
mcl_tnt?

View File

@ -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,

View File

@ -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)

View File

@ -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,

View File

@ -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 = {

View File

@ -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)

View File

@ -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,

View File

@ -76,8 +76,8 @@ mobs:register_mob("mobs_mc:sheep", {
distance = 16,
},
animation = {
speed_normal = 25, speed_run = 50,
stand_start = 40, stand_end = 80,
speed_normal = 25, run_speed = 65,
stand_start = 40, stand_end = 80,
walk_start = 0, walk_end = 40,
run_start = 0, run_end = 40,
},

View File

@ -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)

View File

@ -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

View File

@ -1053,6 +1053,7 @@ mobs:register_mob("mobs_mc:villager", {
return_fields(player)
end
end
mobs.death_effect(pos, self.collisionbox)
end,
})

View File

@ -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

View File

@ -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 },

View File

@ -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,

View File

@ -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",

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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=не ограничено

View File

@ -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=

View File

@ -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

View File

@ -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)

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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=

View File

@ -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

View File

@ -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

View File

@ -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=не ограничено

View File

@ -1,2 +1,2 @@
name = tt
description = Appends a helpful tooltip to the item description
description = Support for custom tooltip extensions for items

View File

@ -1,4 +1,4 @@
-- CORE SNIPPETS --
-- CUSTOM SNIPPETS --
-- Custom text (_tt_help)
tt.register_snippet(function(itemstring)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -7,6 +7,7 @@ Building Blocks=Строительные блоки
Decoration Blocks=Декоративные блоки
Redstone=Редстоун (красный камень)
Transportation=Транспорт
Brewing=Зелья
Miscellaneous=Прочее
Search Items=Искать предметы
Foodstuffs=Продовольствие

View File

@ -7,6 +7,7 @@ Building Blocks=
Decoration Blocks=
Redstone=
Transportation=
Brewing=
Miscellaneous=
Search Items=
Foodstuffs=

View File

@ -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 = {}

View File

@ -1 +1,2 @@
mesecons
mcl_particles

View File

@ -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

View File

@ -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)

View File

@ -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,

View File

@ -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 n1 = minetest.get_node({x = bed_pos.x, y = bed_pos.y + 1, 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)

View File

@ -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

View File

@ -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

View File

@ -7,3 +7,4 @@ playerphysics?
doc?
doc_identifier?
mesecons_button?
mcl_particles

View File

@ -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]"..
@ -153,22 +152,22 @@ local function brewing_stand_timer(pos, elapsed)
d = 0.5
minetest.add_particlespawner({
amount = 4,
time = 1,
minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d},
maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d},
minvel = {x=-0.1, y=0, z=-0.1},
maxvel = {x=0.1, y=0.5, z=0.1},
minacc = {x=-0.05, y=0, z=-0.05},
maxacc = {x=0.05, y=.1, z=0.05},
minexptime = 1,
maxexptime = 2,
minsize = 0.5,
maxsize = 2,
collisiondetection = true,
vertical = false,
texture = "mcl_brewing_bubble_sprite.png",
})
amount = 4,
time = 1,
minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d},
maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d},
minvel = {x=-0.1, y=0, z=-0.1},
maxvel = {x=0.1, y=0.5, z=0.1},
minacc = {x=-0.05, y=0, z=-0.05},
maxacc = {x=0.05, y=.1, z=0.05},
minexptime = 1,
maxexptime = 2,
minsize = 0.5,
maxsize = 2,
collisiondetection = true,
vertical = false,
texture = "mcl_brewing_bubble_sprite.png",
})
-- Replace the stand item with the brew result
if stand_timer >= BREW_TIME then
@ -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,15 +309,18 @@ 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
"mcl_brewing_side.png", --right
"mcl_brewing_side.png", --left
"mcl_brewing_side.png", --back
"mcl_brewing_side.png^[transformFX"} --front
"mcl_brewing_base.png", --bottom
"mcl_brewing_side.png", --right
"mcl_brewing_side.png", --left
"mcl_brewing_side.png", --back
"mcl_brewing_side.png^[transformFX"} --front
local allow_put = function(pos, listname, index, stack, player)
local name = player:get_player_name()
@ -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

View File

@ -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

View File

@ -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=Зельеварение

View File

@ -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=

View File

@ -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

View File

@ -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

View File

@ -1,5 +1,6 @@
mcl_init
mcl_sounds
mcl_particles
mcl_util
mcl_worlds
doc_items

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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", {

View File

@ -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,

View File

@ -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 )

View File

@ -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,
})

View File

@ -1,4 +1,5 @@
mcl_core
mcl_worlds
mcl_sounds
mcl_particles
mcl_portals?

View File

@ -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")

View File

@ -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 )

View File

@ -4,5 +4,6 @@ mcl_core
mcl_sounds
mcl_craftguide
mcl_achievements
mcl_particles
doc?
screwdriver?

View File

@ -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" },

View File

@ -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 )

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью.

View File

@ -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.=

View File

@ -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

View File

@ -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=

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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, оставляя в центре лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Аду.

Some files were not shown because too many files have changed in this diff Show More