Merge branch 'master' into buckets

This commit is contained in:
AFCMS 2021-07-14 15:12:53 +02:00
commit 8958aa7b12
39 changed files with 278 additions and 102 deletions

View File

@ -149,7 +149,7 @@ These groups are used mostly for informational purposes
* `trapdoor=2`: Open trapdoor * `trapdoor=2`: Open trapdoor
* `glass=1`: Glass (full cubes only) * `glass=1`: Glass (full cubes only)
* `rail=1`: Rail * `rail=1`: Rail
* `music_record`: Music Disc (rating is track ID) * `music_record`: Item is Music Disc
* `tnt=1`: Block is TNT * `tnt=1`: Block is TNT
* `boat=1`: Boat * `boat=1`: Boat
* `minecart=1`: Minecart * `minecart=1`: Minecart

View File

@ -1,5 +1,3 @@
# (Currently in feature freeze)
# MineClone 2 # MineClone 2
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
Developed by many people. Not developed or endorsed by Mojang AB. Developed by many people. Not developed or endorsed by Mojang AB.
@ -77,15 +75,16 @@ To install MineClone 2 (if you haven't already), move this directory into the
“games” directory of your Minetest data directory. Consult the help of “games” directory of your Minetest data directory. Consult the help of
Minetest to learn more. Minetest to learn more.
## Reporting bugs ## Useful links
Please report all bugs and missing Minecraft features here: The MineClone2 repository is hosted at Mesehub. To contribute or report issues, head there.
<https://git.minetest.land/MineClone2/MineClone2/issues> * Mesehub: <https://git.minetest.land/MineClone2/MineClone2>
* Discord: <https://discord.gg/xE4z8EEpDC>
## Chatting with the community * YouTube <https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A>
Join our discord server at: * IRC: <https://web.libera.chat/#mineclone2>
* Matrix: <https://app.element.io/#/room/#mc2:matrix.org>
<https://discord.gg/xE4z8EEpDC> * Reddit: <https://www.reddit.com/r/MineClone2/>
* Minetest forums: <https://forum.minetest.net/viewtopic.php?f=50&t=16407>
## Project description ## Project description
The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software. The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software.

View File

@ -207,6 +207,10 @@ end
function mcl_autogroup.can_harvest(nodename, toolname) function mcl_autogroup.can_harvest(nodename, toolname)
local ndef = minetest.registered_nodes[nodename] local ndef = minetest.registered_nodes[nodename]
if not ndef then
return false
end
if minetest.get_item_group(nodename, "dig_immediate") >= 2 then if minetest.get_item_group(nodename, "dig_immediate") >= 2 then
return true return true
end end

View File

@ -19,7 +19,10 @@ local function deal_falling_damage(self, dtime)
end end
self._hit = self._hit or {} self._hit = self._hit or {}
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
if mcl_util.get_hp(obj) > 0 and not self._hit[obj] then local entity = obj:get_luaentity()
if entity and entity.name == "__builtin:item" then
obj:remove()
elseif mcl_util.get_hp(obj) > 0 and not self._hit[obj] then
self._hit[obj] = true self._hit[obj] = true
local way = self._startpos.y - pos.y local way = self._startpos.y - pos.y
local damage = (way - 1) * 2 local damage = (way - 1) * 2

View File

@ -129,6 +129,7 @@ end
local api_path = minetest.get_modpath(minetest.get_current_modname()).."/api/mob_functions/" local api_path = minetest.get_modpath(minetest.get_current_modname()).."/api/mob_functions/"
--ignite all parts of the api --ignite all parts of the api
dofile(api_path .. "flow_lib.lua")
dofile(api_path .. "ai.lua") dofile(api_path .. "ai.lua")
dofile(api_path .. "animation.lua") dofile(api_path .. "animation.lua")
dofile(api_path .. "collision.lua") dofile(api_path .. "collision.lua")

View File

@ -9,6 +9,8 @@ local minetest_get_item_group = minetest.get_item_group
local minetest_get_node = minetest.get_node local minetest_get_node = minetest.get_node
local minetest_line_of_sight = minetest.line_of_sight local minetest_line_of_sight = minetest.line_of_sight
local minetest_get_node_light = minetest.get_node_light local minetest_get_node_light = minetest.get_node_light
local minetest_registered_nodes = minetest.registered_nodes
local flow = mobs.get_flowing_dir
local DOUBLE_PI = math.pi * 2 local DOUBLE_PI = math.pi * 2
local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125
@ -1011,6 +1013,19 @@ function mobs.mob_step(self, dtime)
end end
end end
--mobs flow from Crafter
local pos = self.object:get_pos()
if pos then
local flow_dir = flow(pos)
if flow_dir then
flow_dir = vector.multiply(flow_dir,10)
local vel = self.object:get_velocity()
local acceleration = vector.new(flow_dir.x-vel.x,flow_dir.y-vel.y,flow_dir.z-vel.z)
acceleration = vector.multiply(acceleration, 0.01)
self.object:add_velocity(acceleration)
end
end
--mob is stunned after being hit --mob is stunned after being hit
if self.pause_timer > 0 then if self.pause_timer > 0 then
self.pause_timer = self.pause_timer - dtime self.pause_timer = self.pause_timer - dtime

View File

@ -0,0 +1,78 @@
--this is from https://github.com/HybridDog/builtin_item/blob/e6dfd9dce86503b3cbd1474257eca5f6f6ca71c2/init.lua#L50
local
minetest,vector,math,pairs,minetest_get_node,vector_subtract,minetest_registered_nodes
=
minetest,vector,math,pairs,minetest.get_node,vector.subtract,minetest.registered_nodes
local tab
local n
local function get_nodes(pos)
tab,n = {},1
for i = -1,1,2 do
for _,p in pairs({
{x=pos.x+i, y=pos.y, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+i}
}) do
tab[n] = {p, minetest_get_node(p)}
n = n+1
end
end
return tab
end
local data
local param2
local nd
local par2
local name
local tmp
local c_node
function mobs.get_flowing_dir(pos)
c_node = minetest_get_node(pos).name
if c_node ~= "mcl_core:water_flowing" and c_node ~= "mcl_core:water" then
return nil
end
data = get_nodes(pos)
param2 = minetest_get_node(pos).param2
if param2 > 7 then
return nil
end
if c_node == "mcl_core:water" then
for _,i in pairs(data) do
nd = i[2]
name = nd.name
par2 = nd.param2
if name == "mcl_core:water_flowing" and par2 == 7 then
return(vector_subtract(i[1],pos))
end
end
end
for _,i in pairs(data) do
nd = i[2]
name = nd.name
par2 = nd.param2
if name == "mcl_core:water_flowing" and par2 < param2 then
return(vector_subtract(i[1],pos))
end
end
for _,i in pairs(data) do
nd = i[2]
name = nd.name
par2 = nd.param2
if name == "mcl_core:water_flowing" and par2 >= 11 then
return(vector_subtract(i[1],pos))
end
end
for _,i in pairs(data) do
nd = i[2]
name = nd.name
par2 = nd.param2
tmp = minetest_registered_nodes[name]
if tmp and not tmp.walkable and name ~= "mcl_core:water_flowing" and name ~= "mcl_core:water" then
return(vector_subtract(i[1],pos))
end
end
return nil
end

View File

@ -32,12 +32,15 @@ end
mobs.float = function(self) mobs.float = function(self)
local acceleration = self.object:get_acceleration() local acceleration = self.object:get_acceleration()
if acceleration and acceleration.y ~= 0 then
self.object:set_acceleration(vector.new(0,0,0)) if not acceleration then
else
return return
end end
if acceleration.y ~= 0 then
self.object:set_acceleration({x=0, y=0, z=0})
end
local current_velocity = self.object:get_velocity() local current_velocity = self.object:get_velocity()
local goal_velocity = { local goal_velocity = {

View File

@ -155,7 +155,7 @@ end
local custom_crafts, craft_types = {}, {} local custom_crafts, craft_types = {}, {}
function mcl_craftguide.register_craft_type(name, def) function mcl_craftguide.register_craft_type(name, def)
local func = "mcl_craftguide.register_craft_guide(): " local func = "mcl_craftguide.register_craft_type(): "
assert(name, func .. "'name' field missing") assert(name, func .. "'name' field missing")
assert(def.description, func .. "'description' field missing") assert(def.description, func .. "'description' field missing")
assert(def.icon, func .. "'icon' field missing") assert(def.icon, func .. "'icon' field missing")

View File

@ -1,23 +1,26 @@
local modname = minetest.get_current_modname()
local S = minetest.get_translator(modname)
mcl_credits = { mcl_credits = {
players = {}, players = {},
} }
mcl_credits.description = "A faithful Open Source clone of Minecraft" mcl_credits.description = S("A faithful Open Source clone of Minecraft")
-- Sub-lists are sorted by number of commits, but the list should not be rearranged (-> new contributors are just added at the end of the list) -- Sub-lists are sorted by number of commits, but the list should not be rearranged (-> new contributors are just added at the end of the list)
mcl_credits.people = { mcl_credits.people = {
{"Creator of MineClone", 0x0A9400, { { S("Creator of MineClone"), 0x0A9400, {
"davedevils", "davedevils",
}}, }},
{"Creator of MineClone2", 0xFBF837, { { S("Creator of MineClone2"), 0xFBF837, {
"Wuzzy", "Wuzzy",
}}, }},
{"Maintainers", 0xFF51D5, { { S("Maintainers"), 0xFF51D5, {
"Fleckenstein", "Fleckenstein",
"kay27", "kay27",
"oilboi", "oilboi",
}}, }},
{"Developers", 0xF84355, { { S("Developers"), 0xF84355, {
"bzoss", "bzoss",
"AFCMS", "AFCMS",
"epCode", "epCode",
@ -30,7 +33,7 @@ mcl_credits.people = {
"Code-Sploit", "Code-Sploit",
"NO11", "NO11",
}}, }},
{"Contributors", 0x52FF00, { { S("Contributors"), 0x52FF00, {
"Laurent Rocher", "Laurent Rocher",
"HimbeerserverDE", "HimbeerserverDE",
"TechDudie", "TechDudie",
@ -64,7 +67,7 @@ mcl_credits.people = {
"NO11", "NO11",
"j45", "j45",
}}, }},
{"Original Mod Authors", 0x343434, { { S("Original Mod Authors"), 0x343434, {
"Wuzzy", "Wuzzy",
"Fleckenstein", "Fleckenstein",
"BlockMen", "BlockMen",
@ -96,12 +99,12 @@ mcl_credits.people = {
"jordan4ibanez", "jordan4ibanez",
"paramat", "paramat",
}}, }},
{"3D Models", 0x0019FF, { { S("3D Models"), 0x0019FF, {
"22i", "22i",
"tobyplowy", "tobyplowy",
"epCode", "epCode",
}}, }},
{"Textures", 0xFF9705, { { S("Textures"), 0xFF9705, {
"XSSheep", "XSSheep",
"Wuzzy", "Wuzzy",
"kingoscargames", "kingoscargames",
@ -110,7 +113,7 @@ mcl_credits.people = {
"yutyo", "yutyo",
"NO11", "NO11",
}}, }},
{"Translations", 0x00FF60, { { S("Translations"), 0x00FF60, {
"Wuzzy", "Wuzzy",
"Rocher Laurent", "Rocher Laurent",
"wuniversales", "wuniversales",
@ -142,7 +145,7 @@ function mcl_credits.show(player)
ids = { ids = {
player:hud_add({ player:hud_add({
hud_elem_type = "image", hud_elem_type = "image",
text = "menu_bg.png", text = "credits_bg.png",
position = {x = 0, y = 0}, position = {x = 0, y = 0},
alignment = {x = 1, y = 1}, alignment = {x = 1, y = 1},
scale = {x = -100, y = -100}, scale = {x = -100, y = -100},
@ -150,13 +153,22 @@ function mcl_credits.show(player)
}), }),
player:hud_add({ player:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
text = "Sneak to skip", text = S("Sneak to skip"),
position = {x = 1, y = 1}, position = {x = 1, y = 1},
alignment = {x = -1, y = -1}, alignment = {x = -1, y = -1},
offset = {x = -5, y = -5}, offset = {x = -5, y = -5},
z_index = 1001, z_index = 1001,
number = 0xFFFFFF, number = 0xFFFFFF,
}) }),
player:hud_add({
hud_elem_type = "text",
text = " "..S("Jump to speed up (additionally sprint)"),
position = {x = 0, y = 1},
alignment = {x = 1, y = -1},
offset = {x = -5, y = -5},
z_index = 1002,
number = 0xFFFFFF,
}),
}, },
} }
add_hud_element({ add_hud_element({
@ -216,13 +228,22 @@ end)
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
for _, huds in pairs(mcl_credits.players) do for _, huds in pairs(mcl_credits.players) do
local player = huds.player local player = huds.player
if not huds.new and player:get_player_control().sneak then local control = player:get_player_control()
if not huds.new and control.sneak then
mcl_credits.hide(player) mcl_credits.hide(player)
else else
local moving = {} local moving = {}
local any local any
for id, y in pairs(huds.moving) do for id, y in pairs(huds.moving) do
y = y - 1 y = y - 1
if control.jump then
y = y - 2
if control.aux1 then
y = y - 5
end
end
if y > -100 then if y > -100 then
if id == huds.icon then if id == huds.icon then
y = math.max(400, y) y = math.max(400, y)

View File

@ -0,0 +1,13 @@
# textdomain: mcl_credits
3D Models=3D Modelle
A faithful Open Source clone of Minecraft=Ein treuer Open-Source-Klon von Minecraft
Contributors=Mitwirkende
Creator of MineClone=Schöpfer von MineClone
Creator of MineClone2=Schöpfer von MineClone2
Developers=Entwickler
Jump to speed up (additionally sprint)=Springen, um zu beschleunigen (zusätzlich sprinten)
Maintainers=Betreuer
Original Mod Authors=Original-Mod-Autoren
Sneak to skip=Schleichen zum Überspringen
Textures=Texturen
Translations=Übersetzungen

View File

@ -0,0 +1,14 @@
# textdomain: mcl_credits
3D Models=
A faithful Open Source clone of Minecraft=
Contributors=
Creator of MineClone=
Creator of MineClone2=
Developers=
Jump to speed up (additionally sprint)=
Maintainers=
MineClone5=
Original Mod Authors=
Sneak to skip=
Textures=
Translations=

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -27,10 +27,9 @@ local function replace_enchanted_books(tbl)
end end
end end
--[[ Populate all the item tables. We only do this once. Note this mod must be --[[ Populate all the item tables. We only do this once. Note this code must be
loaded after _mcl_autogroup for this to work, because it required certain executed after loading all the other mods in order to work. ]]
groups to be set. ]] minetest.register_on_mods_loaded(function()
do
for name,def in pairs(minetest.registered_items) do for name,def in pairs(minetest.registered_items) do
if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then
local function is_redstone(def) local function is_redstone(def)
@ -108,7 +107,7 @@ do
table.sort(to_sort) table.sort(to_sort)
replace_enchanted_books(to_sort) replace_enchanted_books(to_sort)
end end
end end)
local function filter_item(name, description, lang, filter) local function filter_item(name, description, lang, filter)
local desc local desc

View File

@ -1,6 +1,5 @@
name = mcl_inventory name = mcl_inventory
author = BlockMen author = BlockMen
description = Adds the player inventory and creative inventory. description = Adds the player inventory and creative inventory.
depends = mcl_init, mcl_formspec, mcl_player depends = mcl_init, mcl_formspec, mcl_enchanting
optional_depends = _mcl_autogroup, mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player

View File

@ -129,8 +129,13 @@ local dispenserdef = {
dropitem:set_count(1) dropitem:set_count(1)
local stack_id = stacks[r].stackpos local stack_id = stacks[r].stackpos
local stackdef = stack:get_definition() local stackdef = stack:get_definition()
if not stackdef then
return
end
local iname = stack:get_name() local iname = stack:get_name()
local igroups = minetest.registered_items[iname].groups local igroups = stackdef.groups
--[===[ Dispense item ]===] --[===[ Dispense item ]===]

View File

@ -25,6 +25,8 @@ mcl_player.player_register_model("mcl_armor_character.b3d", {
sit_mount = {x=484, y=484}, sit_mount = {x=484, y=484},
die = {x=498, y=498}, die = {x=498, y=498},
fly = {x=502, y=581}, fly = {x=502, y=581},
bow_walk = {x=650, y=670},
bow_sneak = {x=675, y=695},
}, },
}) })
@ -55,6 +57,8 @@ mcl_player.player_register_model("mcl_armor_character_female.b3d", {
sit_mount = {x=484, y=484}, sit_mount = {x=484, y=484},
die = {x=498, y=498}, die = {x=498, y=498},
fly = {x=502, y=581}, fly = {x=502, y=581},
bow_walk = {x=650, y=670},
bow_sneak = {x=675, y=695},
}, },
}) })

View File

@ -573,7 +573,7 @@ for colorid, colortab in pairs(mcl_banners.colors) do
end, end,
}) })
if mod_mcl_core and minetest.get_modpath("mcl_wool") then if mod_mcl_core and minetest.get_modpath("mcl_wool") and pattern_name == "" then
minetest.register_craft({ minetest.register_craft({
output = itemstring, output = itemstring,
recipe = { recipe = {

View File

@ -8,9 +8,6 @@ local N = function(s) return s end
-- Maximum number of layers which can be put on a banner by crafting. -- Maximum number of layers which can be put on a banner by crafting.
local max_layers_crafting = 12 local max_layers_crafting = 12
-- Maximum number of layers when banner includes a gradient (workaround, see below).
local max_layers_gradient = 3
-- Max. number lines in the descriptions for the banner layers. -- Max. number lines in the descriptions for the banner layers.
-- This is done to avoid huge tooltips. -- This is done to avoid huge tooltips.
local max_layer_lines = 6 local max_layer_lines = 6
@ -398,16 +395,6 @@ local function banner_pattern_craft(itemstack, player, old_craft_grid, craft_inv
if #layers >= max_layers_crafting then if #layers >= max_layers_crafting then
return ItemStack("") return ItemStack("")
end end
-- Lower layer limit when banner includes any gradient.
-- Workaround to circumvent Minetest bug (https://github.com/minetest/minetest/issues/6210)
-- TODO: Remove this restriction when bug #6210 is fixed.
if #layers >= max_layers_gradient then
for l=1, #layers do
if layers[l].pattern == "gradient" or layers[l].pattern == "gradient_up" then
return ItemStack("")
end
end
end
local matching_pattern local matching_pattern
local max_i = player:get_inventory():get_size("craft") local max_i = player:get_inventory():get_size("craft")

View File

@ -221,17 +221,23 @@ Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly
Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Zuckerrohr kann nur auf Zuckerrohr platziert werden und auf Blöcken, auf denen Zuckerrohr wachsen würde. Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Zuckerrohr kann nur auf Zuckerrohr platziert werden und auf Blöcken, auf denen Zuckerrohr wachsen würde.
Sugar comes from sugar canes and is used to make sweet foods.=Zucker kommt von Zuckerrohr und wird benutzt, um süße Lebensmittel zu machen. Sugar comes from sugar canes and is used to make sweet foods.=Zucker kommt von Zuckerrohr und wird benutzt, um süße Lebensmittel zu machen.
The stripped trunk of an acacia tree.=Der entrindete Stamm einer Akazie. The stripped trunk of an acacia tree.=Der entrindete Stamm einer Akazie.
The stripped trunk of an birch tree.=Der entrindete Stamm einer Birke. The stripped trunk of a birch tree.=Der entrindete Stamm einer Birke.
The stripped trunk of an dark oak tree.=Der entrindete Stamm einer Schwarzeiche. The stripped trunk of a dark oak tree.=Der entrindete Stamm einer Schwarzeiche.
The stripped trunk of an jungle tree.=Der entrindete Stamm eines Dschungelbaums. The stripped trunk of a jungle tree.=Der entrindete Stamm eines Dschungelbaums.
The stripped trunk of an oak tree.=Der entrindete Stamm einer Eiche. The stripped trunk of an oak tree.=Der entrindete Stamm einer Eiche.
The stripped trunk of an spruce tree.=Der entrindete Stamm einer Fichte. The stripped trunk of a spruce tree.=Der entrindete Stamm einer Fichte.
The trunk of a birch tree.=Der Baumstamm einer Birke. The trunk of a birch tree.=Der Baumstamm einer Birke.
The trunk of a dark oak tree.=Der Baumstamm einer Schwarzeiche. The trunk of a dark oak tree.=Der Baumstamm einer Schwarzeiche.
The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums. The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums.
The trunk of a spruce tree.=Der Baumstamm einer Fichte. The trunk of a spruce tree.=Der Baumstamm einer Fichte.
The trunk of an acacia.=Der Baumstamm einer Akazie. The trunk of an acacia.=Der Baumstamm einer Akazie.
The trunk of an oak tree.=Der Baumstamm einer Eiche. The trunk of an oak tree.=Der Baumstamm einer Eiche.
The stripped wood of an acacia tree.=Das entrindete Holz einer Akazie.
The stripped wood of a birch tree.=Das entrindete Holz einer Birke.
The stripped wood of a dark oak tree.=Das entrindete Holz einer Schwarzeiche.
The stripped wood of a jungle tree.=Das entrindete Holz eines Dschungelbaums.
The stripped wood of an oak tree.=Das entrindete Holz einer Eiche.
The stripped wood of a spruce tree.=Das entrindete Holz einer Fichte.
This block consists of a couple of loose stones and can't support itself.=Dieser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen. This block consists of a couple of loose stones and can't support itself.=Dieser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen.
This is a decorative block surrounded by the bark of a tree trunk.=Dies ist ein dekorativer Block, der von der Rinde eines Baumstamms umgeben ist. This is a decorative block surrounded by the bark of a tree trunk.=Dies ist ein dekorativer Block, der von der Rinde eines Baumstamms umgeben ist.
This is a decorative block.=Dies ist ein dekorativer Block. This is a decorative block.=Dies ist ein dekorativer Block.

View File

@ -109,7 +109,7 @@ Gold Ore=Minerai d'Or
Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Les pépites d'or sont de très petites pièces d'or en fusion; le but principal est de créer des lingots d'or. Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Les pépites d'or sont de très petites pièces d'or en fusion; le but principal est de créer des lingots d'or.
Golden Apple=Pomme Dorée Golden Apple=Pomme Dorée
Golden apples are precious food items which can be eaten.=Les pommes dorrées sont des aliments précieux qui peuvent être consommés. Golden apples are precious food items which can be eaten.=Les pommes dorrées sont des aliments précieux qui peuvent être consommés.
Granite=Granite Granite=Granit
Grass Block=Bloc d'Herbe Grass Block=Bloc d'Herbe
Grass Path=Chemin d'Herbe Grass Path=Chemin d'Herbe
Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Les chemins d'herbe sont une variante décorative des blocs d'herbe. Leur sommet a une couleur différente et ils sont un peu plus bas que les blocs d'herbe, ce qui les rend utiles pour construire des sentiers. Les chemins d'herbe peuvent être créés avec une pelle. Un chemin d'herbe se transforme en terre quand il est en dessous d'un bloc solide. Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Les chemins d'herbe sont une variante décorative des blocs d'herbe. Leur sommet a une couleur différente et ils sont un peu plus bas que les blocs d'herbe, ce qui les rend utiles pour construire des sentiers. Les chemins d'herbe peuvent être créés avec une pelle. Un chemin d'herbe se transforme en terre quand il est en dessous d'un bloc solide.
@ -165,7 +165,7 @@ Podzol=Podzol
Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Le podzol est un type de terre trouvé dans les forêts de la taïga. Seules quelques plantes peuvent y survivre. Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Le podzol est un type de terre trouvé dans les forêts de la taïga. Seules quelques plantes peuvent y survivre.
Polished Andesite=Andrésite Polie Polished Andesite=Andrésite Polie
Polished Diorite=Diorite Polie Polished Diorite=Diorite Polie
Polished Granite=Granite Polie Polished Granite=Granit Poli
Polished Stone=Roche Polie Polished Stone=Roche Polie
Polished andesite is a decorative building block made from andesite.=L'andésite polie est un bloc de construction décoratif en andésite. Polished andesite is a decorative building block made from andesite.=L'andésite polie est un bloc de construction décoratif en andésite.
Polished diorite is a decorative building block made from diorite.=La diorite polie est un bloc de construction décoratif en diorite. Polished diorite is a decorative building block made from diorite.=La diorite polie est un bloc de construction décoratif en diorite.

View File

@ -221,17 +221,23 @@ Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly
Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.= Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=
Sugar comes from sugar canes and is used to make sweet foods.= Sugar comes from sugar canes and is used to make sweet foods.=
The stripped trunk of an acacia tree.= The stripped trunk of an acacia tree.=
The stripped trunk of an birch tree.= The stripped trunk of a birch tree.=
The stripped trunk of an dark oak tree.= The stripped trunk of a dark oak tree.=
The stripped trunk of an jungle tree.= The stripped trunk of a jungle tree.=
The stripped trunk of an oak tree.= The stripped trunk of an oak tree.=
The stripped trunk of an spruce tree.= The stripped trunk of a spruce tree.=
The trunk of a birch tree.= The trunk of a birch tree.=
The trunk of a dark oak tree.= The trunk of a dark oak tree.=
The trunk of a jungle tree.= The trunk of a jungle tree.=
The trunk of a spruce tree.= The trunk of a spruce tree.=
The trunk of an acacia.= The trunk of an acacia.=
The trunk of an oak tree.= The trunk of an oak tree.=
The stripped wood of an acacia tree.=
The stripped wood of a birch tree.=
The stripped wood of a dark oak tree.=
The stripped wood of a jungle tree.=
The stripped wood of an oak tree.=
The stripped wood of a spruce tree.=
This block consists of a couple of loose stones and can't support itself.= This block consists of a couple of loose stones and can't support itself.=
This is a decorative block surrounded by the bark of a tree trunk.= This is a decorative block surrounded by the bark of a tree trunk.=
This is a decorative block.= This is a decorative block.=

View File

@ -1041,7 +1041,7 @@ for i=1,8 do
drop = "mcl_throwing:snowball "..(i+1), drop = "mcl_throwing:snowball "..(i+1),
_mcl_blast_resistance = 0.1, _mcl_blast_resistance = 0.1,
_mcl_hardness = 0.1, _mcl_hardness = 0.1,
_mcl_silk_touch_drop = {"mcl_core:snow " .. (i+1)}, _mcl_silk_touch_drop = {"mcl_core:snow " .. i},
}) })
end end

View File

@ -9,7 +9,7 @@ if mod_screwdriver then
end end
-- Register tree trunk (wood) and bark -- Register tree trunk (wood) and bark
local function register_tree_trunk(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark, stripped_varient) local function register_tree_trunk(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark, stripped_variant)
minetest.register_node("mcl_core:"..subname, { minetest.register_node("mcl_core:"..subname, {
description = description_trunk, description = description_trunk,
_doc_items_longdesc = longdesc, _doc_items_longdesc = longdesc,
@ -23,7 +23,7 @@ local function register_tree_trunk(subname, description_trunk, description_bark,
on_rotate = on_rotate, on_rotate = on_rotate,
_mcl_blast_resistance = 2, _mcl_blast_resistance = 2,
_mcl_hardness = 2, _mcl_hardness = 2,
_mcl_stripped_varient = stripped_varient, _mcl_stripped_variant = stripped_variant,
}) })
minetest.register_node("mcl_core:"..subname.."_bark", { minetest.register_node("mcl_core:"..subname.."_bark", {
@ -39,7 +39,7 @@ local function register_tree_trunk(subname, description_trunk, description_bark,
on_rotate = on_rotate, on_rotate = on_rotate,
_mcl_blast_resistance = 2, _mcl_blast_resistance = 2,
_mcl_hardness = 2, _mcl_hardness = 2,
_mcl_stripped_varient = stripped_varient.."_bark", _mcl_stripped_variant = stripped_variant.."_bark",
}) })
minetest.register_craft({ minetest.register_craft({
@ -52,7 +52,7 @@ local function register_tree_trunk(subname, description_trunk, description_bark,
end end
-- Register stripped trunk and stripped wood -- Register stripped trunk and stripped wood
local function register_stripped_trunk(subname, description_stripped_trunk, description_stripped_bark, longdesc, tile_stripped_inner, tile_stripped_bark) local function register_stripped_trunk(subname, description_stripped_trunk, description_stripped_bark, longdesc, longdesc_wood, tile_stripped_inner, tile_stripped_bark)
minetest.register_node("mcl_core:"..subname, { minetest.register_node("mcl_core:"..subname, {
description = description_stripped_trunk, description = description_stripped_trunk,
_doc_items_longdesc = longdesc, _doc_items_longdesc = longdesc,
@ -70,7 +70,7 @@ local function register_stripped_trunk(subname, description_stripped_trunk, desc
minetest.register_node("mcl_core:"..subname.."_bark", { minetest.register_node("mcl_core:"..subname.."_bark", {
description = description_stripped_bark, description = description_stripped_bark,
_doc_items_longdesc = S("This is a decorative block."), _doc_items_longdesc = longdesc_wood,
tiles = {tile_stripped_bark}, tiles = {tile_stripped_bark},
paramtype2 = "facedir", paramtype2 = "facedir",
on_place = mcl_util.rotate_axis, on_place = mcl_util.rotate_axis,
@ -223,13 +223,12 @@ register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The tru
register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png", "mcl_core:stripped_birch") register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png", "mcl_core:stripped_birch")
register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png", "mcl_core:stripped_jungle") register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png", "mcl_core:stripped_jungle")
register_stripped_trunk("stripped_oak", S("Stripped Oak Log"), S("Stripped Oak Wood"), S("The stripped trunk of an oak tree."), "mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_side.png") register_stripped_trunk("stripped_oak", S("Stripped Oak Log"), S("Stripped Oak Wood"), S("The stripped trunk of an oak tree."), S("The stripped wood of an oak tree."), "mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_side.png")
register_stripped_trunk("stripped_acacia", S("Stripped Acacia Log"), S("Stripped Acacia Wood"), S("The stripped trunk of an acacia tree."), "mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_side.png") register_stripped_trunk("stripped_acacia", S("Stripped Acacia Log"), S("Stripped Acacia Wood"), S("The stripped trunk of an acacia tree."), S("The stripped wood of an acacia tree."), "mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_side.png")
register_stripped_trunk("stripped_dark_oak", S("Stripped Dark Oak Log"), S("Stripped Dark Oak Wood"), S("The stripped trunk of an dark oak tree."), "mcl_core_stripped_dark_oak_top.png", "mcl_core_stripped_dark_oak_side.png") register_stripped_trunk("stripped_dark_oak", S("Stripped Dark Oak Log"), S("Stripped Dark Oak Wood"), S("The stripped trunk of a dark oak tree."), S("The stripped wood of a dark oak tree."), "mcl_core_stripped_dark_oak_top.png", "mcl_core_stripped_dark_oak_side.png")
register_stripped_trunk("stripped_birch", S("Stripped Birch Log"), S("Stripped Birch Wood"), S("The stripped trunk of an birch tree."), "mcl_core_stripped_birch_top.png", "mcl_core_stripped_birch_side.png") register_stripped_trunk("stripped_birch", S("Stripped Birch Log"), S("Stripped Birch Wood"), S("The stripped trunk of a birch tree."), S("The stripped wood of a birch tree."), "mcl_core_stripped_birch_top.png", "mcl_core_stripped_birch_side.png")
register_stripped_trunk("stripped_spruce", S("Stripped Spruce Log"), S("Stripped Spruce Wood"), S("The stripped trunk of an spruce tree."), "mcl_core_stripped_spruce_top.png", "mcl_core_stripped_spruce_side.png") register_stripped_trunk("stripped_spruce", S("Stripped Spruce Log"), S("Stripped Spruce Wood"), S("The stripped trunk of a spruce tree."), S("The stripped wood of a spruce tree."), "mcl_core_stripped_spruce_top.png", "mcl_core_stripped_spruce_side.png")
register_stripped_trunk("stripped_jungle", S("Stripped Jungle Log"), S("Stripped Jungle Wood"), S("The stripped trunk of an jungle tree."),"mcl_core_stripped_jungle_top.png", "mcl_core_stripped_jungle_side.png") register_stripped_trunk("stripped_jungle", S("Stripped Jungle Log"), S("Stripped Jungle Wood"), S("The stripped trunk of a jungle tree."), S("The stripped wood of a jungle tree."),"mcl_core_stripped_jungle_top.png", "mcl_core_stripped_jungle_side.png")
register_wooden_planks("wood", S("Oak Wood Planks"), {"default_wood.png"}) register_wooden_planks("wood", S("Oak Wood Planks"), {"default_wood.png"})
register_wooden_planks("darkwood", S("Dark Oak Wood Planks"), {"mcl_core_planks_big_oak.png"}) register_wooden_planks("darkwood", S("Dark Oak Wood Planks"), {"mcl_core_planks_big_oak.png"})
register_wooden_planks("junglewood", S("Jungle Wood Planks"), {"default_junglewood.png"}) register_wooden_planks("junglewood", S("Jungle Wood Planks"), {"default_junglewood.png"})

View File

@ -6,6 +6,7 @@ local text_color = "#313131"
local itemslot_bg = mcl_formspec.get_itemslot_bg local itemslot_bg = mcl_formspec.get_itemslot_bg
mcl_crafting_table = {} mcl_crafting_table = {}
function mcl_crafting_table.show_crafting_form(player) function mcl_crafting_table.show_crafting_form(player)
player:get_inventory():set_width("craft", 3) player:get_inventory():set_width("craft", 3)
player:get_inventory():set_size("craft", 9) player:get_inventory():set_size("craft", 9)
@ -30,7 +31,6 @@ function mcl_crafting_table.show_crafting_form(player)
) )
end end
local show_crafting_form = mcl_crafting_table.show_crafting_form --cache function for better performances
minetest.register_node("mcl_crafting_table:crafting_table", { minetest.register_node("mcl_crafting_table:crafting_table", {
description = S("Crafting Table"), description = S("Crafting Table"),
_tt_help = S("3×3 crafting grid"), _tt_help = S("3×3 crafting grid"),
@ -43,7 +43,9 @@ minetest.register_node("mcl_crafting_table:crafting_table", {
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1}, groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1},
on_rightclick = function(pos, node, player, itemstack) on_rightclick = function(pos, node, player, itemstack)
show_crafting_form(player) if not player:get_player_control().sneak then
mcl_crafting_table.show_crafting_form(player)
end
end, end,
sounds = mcl_sounds.node_sound_wood_defaults(), sounds = mcl_sounds.node_sound_wood_defaults(),
_mcl_blast_resistance = 2.5, _mcl_blast_resistance = 2.5,

View File

@ -7,7 +7,7 @@ Blast Protection=Protection contre les explosions
Reduces explosion damage and knockback.=Réduit les dégâts d'explosion et de recul. Reduces explosion damage and knockback.=Réduit les dégâts d'explosion et de recul.
Channeling=Canalisation Channeling=Canalisation
Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canalise un éclair vers une cible. Fonctionne uniquement pendant les orages et si la cible n'est pas obstruée par des blocs opaques. Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canalise un éclair vers une cible. Fonctionne uniquement pendant les orages et si la cible n'est pas obstruée par des blocs opaques.
Curse of Binding=Malédiction du lien éterne Curse of Binding=Malédiction du lien éternel
Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=L'objet ne peut pas être retiré des emplacements d'armure sauf en cas de mort, de rupture ou en mode créatif. Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=L'objet ne peut pas être retiré des emplacements d'armure sauf en cas de mort, de rupture ou en mode créatif.
Curse of Vanishing=Malédiction de disparition Curse of Vanishing=Malédiction de disparition
Item destroyed on death.=Objet détruit à la mort. Item destroyed on death.=Objet détruit à la mort.

View File

@ -94,7 +94,9 @@ minetest.register_craft({
}) })
local function play_record(pos, itemstack, player) local function play_record(pos, itemstack, player)
local name = itemstack:get_name() local item_name = itemstack:get_name()
-- ensure the jukebox uses the new record names for old records
local name = minetest.registered_aliases[item_name] or item_name
if mcl_jukebox.registered_records[name] then if mcl_jukebox.registered_records[name] then
local cname = player:get_player_name() local cname = player:get_player_name()
if active_tracks[cname] then if active_tracks[cname] then

View File

@ -27,7 +27,7 @@ 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. 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=Porc 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. 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=Lapin Cru

View File

@ -307,7 +307,7 @@ minetest.register_node("mcl_portals:end_portal_frame_eye", {
description = S("End Portal Frame with Eye of Ender"), description = S("End Portal Frame with Eye of Ender"),
_tt_help = S("Used to construct end portals"), _tt_help = S("Used to construct end portals"),
_doc_items_create_entry = false, _doc_items_create_entry = false,
groups = { creative_breakable = 1, deco_block = 1, comparator_signal = 15, end_portal_frame = 2 }, groups = { creative_breakable = 1, deco_block = 1, comparator_signal = 15, end_portal_frame = 2, not_in_creative_inventory = 1 },
tiles = { "mcl_portals_endframe_top.png^[lowpart:75:mcl_portals_endframe_eye.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_eye.png^mcl_portals_endframe_side.png" }, tiles = { "mcl_portals_endframe_top.png^[lowpart:75:mcl_portals_endframe_eye.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_eye.png^mcl_portals_endframe_side.png" },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
paramtype2 = "facedir", paramtype2 = "facedir",

View File

@ -30,9 +30,9 @@ Double Polished Stone Slab=Double Dalle en Pierre Polie
Andesite Stairs=Escalier en Andésite Andesite Stairs=Escalier en Andésite
Andesite Slab=Dalle en Andésite Andesite Slab=Dalle en Andésite
Double Andesite Slab=Double Dalle en Andésite Double Andesite Slab=Double Dalle en Andésite
Granite Stairs=Escalier en Granite Granite Stairs=Escalier en Granit
Granite Slab=Dalle en Granite Granite Slab=Dalle en Granit
Double Granite Slab=Double Dalle en Granite Double Granite Slab=Double Dalle en Granit
Diorite Stairs=Escalier en Diorite Diorite Stairs=Escalier en Diorite
Diorite Slab=Dalle en Diorite Diorite Slab=Dalle en Diorite
Double Diorite Slab=Double Dalle en Diorite Double Diorite Slab=Double Dalle en Diorite

View File

@ -368,10 +368,10 @@ local function make_stripped_trunk(itemstack, placer, pointed_thing)
return itemstack return itemstack
end end
if noddef._mcl_stripped_varient == nil then if noddef._mcl_stripped_variant == nil then
return itemstack return itemstack
else else
minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_varient, param2=node.param2}) minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2})
if not minetest.is_creative_enabled(placer:get_player_name()) then if not minetest.is_creative_enabled(placer:get_player_name()) then
-- Add wear (as if digging a axey node) -- Add wear (as if digging a axey node)
local toolname = itemstack:get_name() local toolname = itemstack:get_name()

View File

@ -3,7 +3,7 @@ A piece of wall. It cannot be jumped over with a simple jump. When multiple of t
Cobblestone Wall=Muret de Pierres Cobblestone Wall=Muret de Pierres
Mossy Cobblestone Wall=Muret de Pierres Moussu Mossy Cobblestone Wall=Muret de Pierres Moussu
Andesite Wall=Muret d'Andésite Andesite Wall=Muret d'Andésite
Granite Wall=Muret de Granite Granite Wall=Muret de Granit
Diorite Wall=Muret de Diorite Diorite Wall=Muret de Diorite
Brick Wall=Muret en Brique Brick Wall=Muret en Brique
Sandstone Wall=Muret de Grès Sandstone Wall=Muret de Grès

View File

@ -187,8 +187,6 @@ function mcl_structures.generate_igloo(pos, rotation, pr)
if real_depth <= 6 then if real_depth <= 6 then
return success return success
end end
-- Place hidden trapdoor
minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2
-- Generate ladder to basement -- Generate ladder to basement
for y=1, real_depth-1 do for y=1, real_depth-1 do
set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z })
@ -199,6 +197,10 @@ function mcl_structures.generate_igloo(pos, rotation, pr)
end end
-- Place basement -- Place basement
mcl_structures.generate_igloo_basement(bpos, rotation, pr) mcl_structures.generate_igloo_basement(bpos, rotation, pr)
-- Place hidden trapdoor
minetest.after(5, function(tpos, dir)
minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2
end, tpos, dir)
end end
return success return success
end end

View File

@ -212,6 +212,10 @@ minetest.register_globalstep(function(dtime)
player_set_animation(player, "swim_walk_mine", animation_speed_mod) player_set_animation(player, "swim_walk_mine", animation_speed_mod)
elseif not controls.sneak and head_in_water and is_sprinting == true then elseif not controls.sneak and head_in_water and is_sprinting == true then
player_set_animation(player, "swim_walk", animation_speed_mod) player_set_animation(player, "swim_walk", animation_speed_mod)
elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and controls.sneak then
player_set_animation(player, "bow_sneak", animation_speed_mod)
elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB then
player_set_animation(player, "bow_walk", animation_speed_mod)
elseif is_sprinting == true and get_mouse_button(player) == true and not controls.sneak and not head_in_water then elseif is_sprinting == true and get_mouse_button(player) == true and not controls.sneak and not head_in_water then
player_set_animation(player, "run_walk_mine", animation_speed_mod) player_set_animation(player, "run_walk_mine", animation_speed_mod)
elseif get_mouse_button(player) == true and not controls.sneak then elseif get_mouse_button(player) == true and not controls.sneak then

View File

@ -51,6 +51,15 @@ local function player_collision(player)
return {x,z} return {x,z}
end end
local function walking_player(player, control)
if control.up or control.down or control.left or control.right then
return true
else
return false
end
end
-- converts yaw to degrees -- converts yaw to degrees
local function degrees(rad) local function degrees(rad)
return rad * 180.0 / math.pi return rad * 180.0 / math.pi
@ -217,8 +226,9 @@ minetest.register_globalstep(function(dtime)
player_velocity_old = player:get_velocity() or player:get_player_velocity() player_velocity_old = player:get_velocity() or player:get_player_velocity()
-- controls right and left arms pitch when shooting a bow -- controls right and left arms pitch when shooting a bow
if string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB and not control.LMB and not control.up and not control.down and not control.left and not control.right then if string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB then
player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35))
player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35))
-- when punching -- when punching