Start of the history
|
@ -0,0 +1,11 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local dofile
|
||||||
|
= dofile
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
return {
|
||||||
|
user = "Kimapr",
|
||||||
|
pkg = "nodecore-skyblock",
|
||||||
|
min = "5.0",
|
||||||
|
version = dofile("./mods/nc_api/version.lua")
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
version.lua export-subst
|
||||||
|
.git* export-ignore
|
||||||
|
.lua* export-ignore
|
||||||
|
docs export-ignore
|
||||||
|
src export-ignore
|
|
@ -0,0 +1,3 @@
|
||||||
|
globals = {"minetest", "ItemStack", "VoxelArea", "vector", "nodecore", "include", "SecureRandom"}
|
||||||
|
color = false
|
||||||
|
quiet = 1
|
|
@ -0,0 +1,8 @@
|
||||||
|
~print
|
||||||
|
minetest
|
||||||
|
ItemStack
|
||||||
|
VoxelArea
|
||||||
|
vector
|
||||||
|
nodecore
|
||||||
|
include
|
||||||
|
SecureRandom
|
|
@ -0,0 +1,50 @@
|
||||||
|
========================================================================
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
For your contribution to be included in this project, you must
|
||||||
|
understand and agree to the terms in this document at the time of
|
||||||
|
contribution.
|
||||||
|
|
||||||
|
- A "contribution" consists of all files, patches and changes, source
|
||||||
|
control commits, comments and other metadata submitted to the project
|
||||||
|
maintainer(s) for inclusion or other use in the project.
|
||||||
|
|
||||||
|
- All contributions must consist only of your own original work, to
|
||||||
|
which you retain copyright, or to which copyright is not applicable.
|
||||||
|
|
||||||
|
- All copyrightable portions must be non-exclusively, perpetually and
|
||||||
|
irrevocably licensed under the same license terms as the overall
|
||||||
|
project.
|
||||||
|
|
||||||
|
- You will receive attribution in the project's license, in the form of
|
||||||
|
"Portions (C) ...", which shall cover all portions of all
|
||||||
|
contributions. You agree that this constitutes adequate attribution
|
||||||
|
under the terms of the license.
|
||||||
|
|
||||||
|
- You may request to be attributed pseudonymously at the time of
|
||||||
|
submission. Unless otherwise specified, source control metadata
|
||||||
|
will be used for attribution.
|
||||||
|
|
||||||
|
........................................................................
|
||||||
|
|
||||||
|
Other Guidelines:
|
||||||
|
|
||||||
|
- Non-included contributions to the project, such as hosting or other
|
||||||
|
services, content such as videos/streams, screenshots/galleries,
|
||||||
|
reviews, stories and other publicity do not need to follow the
|
||||||
|
guidelines above unless they are intended to also be eligible for
|
||||||
|
inclusion directly in the project.
|
||||||
|
|
||||||
|
- Keep original media source files that are not directly used by the
|
||||||
|
game engine (e.g. *.blend, *.xcf, *.svg) in folders named "src" in the
|
||||||
|
appropriate mod/area. These will NOT be distributed with the source
|
||||||
|
repo, but will not be packaged by ContentDB to keep download sizes
|
||||||
|
minimal.
|
||||||
|
|
||||||
|
- Lua code indentation style is based on this script:
|
||||||
|
http://notebook.kulchenko.com/programming/lua-beautifier-in-55-lines-of-perl
|
||||||
|
(except with INDENT set to "\t" for tabs instead of spaces)
|
||||||
|
This is very similar to the style used by ZeroBrane Studio.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
========================================================================
|
|
@ -0,0 +1,24 @@
|
||||||
|
Copyright (C)2018-2019 Aaron Suen <warr1024@gmail.com>
|
||||||
|
Portions Copyright (C)2019 LoneWolfHT <lonewolf04361@gmail.com>
|
||||||
|
Portions Copyright (C)2019 Magik Eh
|
||||||
|
Portions Copyright (C)2019 Terifo <terifo1590@gmail.com>
|
||||||
|
Portions Copyright (C)2019 GreenXenith
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject
|
||||||
|
to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||||
|
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,66 @@
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
\ /\
|
||||||
|
\ / \
|
||||||
|
/\ \ /\ |\ / / \ /\ |\ /
|
||||||
|
| \ | / \ | \ / | / \ | \ /
|
||||||
|
| \ | | | | | |__ | | | | / |__
|
||||||
|
\ \/ | | | | | \ / | | |/ |
|
||||||
|
\ \ / | / \ \ / \ / |\ \
|
||||||
|
\ \/ |/ \ \/ \/ | \ \
|
||||||
|
|
||||||
|
========================================================================
|
||||||
|
NodeCore - An original, immersive puzzle/adventure game for Minetest
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NodeCore is a major reconstruction of survival gameplay from the ground
|
||||||
|
up. Relearn much of what you thought you knew about Minetest!
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
- Immersive gameplay. Zero in-game pop-up GUIs. Minimal HUDs.
|
||||||
|
All interactions take place in continuous first-person perspective.
|
||||||
|
Nothing gets between you and the game world.
|
||||||
|
|
||||||
|
- Nearly everything is on the grid. Item stacks settle onto the grid
|
||||||
|
and persist. Complex machines (e.g. furnaces, storage) are built
|
||||||
|
in-world and can be designed, customized, optimized.
|
||||||
|
|
||||||
|
- In-world crafting. Assemble more complex recipes directly on the grid
|
||||||
|
or in-place. Learn how to "pummel" nodes to hammer things together
|
||||||
|
or break things apart.
|
||||||
|
|
||||||
|
- Built-in player guide and hint system provides low-spoiler guidance.
|
||||||
|
|
||||||
|
- Rich and subtle interactions. Some materials dig and transform in
|
||||||
|
stages. Some materials slump into repose when stacked high. Some
|
||||||
|
things transform if conditions are met, but transform faster based
|
||||||
|
on environment. Experiment and see what effects what!
|
||||||
|
|
||||||
|
- Build complex in-game systems. Design your own furnace. Construct
|
||||||
|
digital logic circuits. Build gears and rotary machinery. Assemble
|
||||||
|
portable storage containers.
|
||||||
|
|
||||||
|
- Eggcorns!
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NodeCore is (C)2018-2019 by Aaron Suen <warr1024@gmail.com>
|
||||||
|
MIT License (http://www.opensource.org/licenses/MIT)
|
||||||
|
See included LICENSE file for full details and credits
|
||||||
|
|
||||||
|
Minetest ContentDB Listing:
|
||||||
|
https://content.minetest.net/packages/Warr1024/nodecore/
|
||||||
|
|
||||||
|
GitLab:
|
||||||
|
https://gitlab.com/sztest/nodecore
|
||||||
|
|
||||||
|
Discord:
|
||||||
|
https://discord.gg/SHq2tkb
|
||||||
|
|
||||||
|
IRC:
|
||||||
|
#nodecore on chat.freenode.net
|
||||||
|
(bridged to Discord)
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
========================================================================
|
|
@ -0,0 +1,51 @@
|
||||||
|
========================================================================
|
||||||
|
-----===== PUBLIC CONTRIBUTION WISHLIST =====-----
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Remember, check out the CONTRIBUTING file for guidelines on contributing
|
||||||
|
to the project!
|
||||||
|
|
||||||
|
- Translations:
|
||||||
|
- NodeCore is running Weblate:
|
||||||
|
https://nodecore.mine.nu/trans/projects/nodecore/core/
|
||||||
|
- Contact the NodeCore Developer(s) to get an account if you
|
||||||
|
want to contribute translations.
|
||||||
|
|
||||||
|
- Help (PRs and/or advocacy) with Minetest engine issues:
|
||||||
|
- >5.0.1 Release: Improvements already in the development branch
|
||||||
|
of the engine are expected to benefit NodeCore, e.g. #8701.
|
||||||
|
- #7245: This is blocking making navigation challenges and
|
||||||
|
distinguishing nodes with similar appearance into gameplay
|
||||||
|
elements.
|
||||||
|
- #8952: This causes hidden bases and other items to be visible
|
||||||
|
through walls and other terrain in our MP server.
|
||||||
|
- #8141: We want cleaner player name labels, and to move
|
||||||
|
the touchtip from screen-space into node-space.
|
||||||
|
- #7020: This bug requires NodeCore to maintain a workaround for
|
||||||
|
the engine in its own code.
|
||||||
|
|
||||||
|
- Publicity and player content:
|
||||||
|
- Help spread NodeCore! Share your experiences, screenshots,
|
||||||
|
videos and streams!
|
||||||
|
- Let the developers know if you have shared something about
|
||||||
|
NodeCore, or would like guidance creating something to share.
|
||||||
|
|
||||||
|
- Player model enhancements
|
||||||
|
- Check that UV maps are consistent with existing skins,
|
||||||
|
e.g. MTG Sam or MC Steve, for TP authors to more easily
|
||||||
|
adapt existing skins.
|
||||||
|
|
||||||
|
- Improved versions of any art assets (sounds, textures).
|
||||||
|
- All textures for base inclusion should be 16x (keep
|
||||||
|
high-def textures to texture packs).
|
||||||
|
- It must be practical to maintain a consistent style for
|
||||||
|
other assets, including future related ones.
|
||||||
|
- Animated fluid textures (especially both stationary and
|
||||||
|
flowing water) would be especially appreciated.
|
||||||
|
|
||||||
|
- Help maintaining the hint system.
|
||||||
|
- Development of hints often lags behind development of new
|
||||||
|
features, sometimes significantly.
|
||||||
|
- Hint organization and content is subject to improvement.
|
||||||
|
|
||||||
|
........................................................................
|
||||||
|
========================================================================
|
|
@ -0,0 +1,31 @@
|
||||||
|
========================================================================
|
||||||
|
CORE DESIGN PRINCIPLES
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
- Do as much in node-space in the world as possible.
|
||||||
|
- Minimize use of off-grid entities.
|
||||||
|
- Avoid encapsulating things in inventories, machines, GUIs.
|
||||||
|
- Crafting and transforming in-world.
|
||||||
|
- Minimal set of primitive composable functions.
|
||||||
|
- Each node should do one job (or one part of a job).
|
||||||
|
- Only include the most primitive, fungible components.
|
||||||
|
- Avoid redundant functionality, include fewest possible
|
||||||
|
different elements.
|
||||||
|
- Complex emergent gameplay by combining simple nodes.
|
||||||
|
- Challenging and constrained gameplay.
|
||||||
|
- Limited inventories, very restricted item storage, e.g. one
|
||||||
|
stack per node.
|
||||||
|
- Large, complex machines to design and build for resource
|
||||||
|
transformations.
|
||||||
|
- Subtle environmental hazards, like deadfalls and pestilence.
|
||||||
|
- Rich, subtle interactions.
|
||||||
|
- Digging, placing, punching and battering.
|
||||||
|
- Different effects from different tools (including empty hand).
|
||||||
|
- Different faces of node may have different effects.
|
||||||
|
- Focus on puzzle-oriented single-player/cooperative gameplay.
|
||||||
|
- Avoid dependence on action, combat, PvP.
|
||||||
|
- Slow-moving hazards, players have a chance to think and plan.
|
||||||
|
- Acessible for slow reflexes, slow networks, mobile devices.
|
||||||
|
|
||||||
|
........................................................................
|
||||||
|
========================================================================
|
|
@ -0,0 +1,57 @@
|
||||||
|
========================================================================
|
||||||
|
ICEBOX: Low-Priority Ideas
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#### ##### #### # # ###### ##### ####
|
||||||
|
# # # # # # # # # # #
|
||||||
|
#### # # # # # # ##### # # ####
|
||||||
|
# ##### # # # # # ##### #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
#### # #### # ###### ###### # # ####
|
||||||
|
|
||||||
|
- Release an official beta pack/edition.
|
||||||
|
- Modpack of experimental features vs. alternate game by branch?
|
||||||
|
|
||||||
|
- Flammable/igniter ABM should be reversed, so we scan over few igniters
|
||||||
|
instead of many flammables?
|
||||||
|
|
||||||
|
- Wandering fluids API for concrete, glass?
|
||||||
|
|
||||||
|
- AStMs: Active Stack Modifiers.
|
||||||
|
- Operate on all visinv nodes.
|
||||||
|
- Possibly operate on player inventories?
|
||||||
|
|
||||||
|
- Make separate walkable/non-walkable stack nodes.
|
||||||
|
- Should sticks and eggcorns be non-walkable?
|
||||||
|
|
||||||
|
- Code Quality.
|
||||||
|
- Scripts to validate dependency graph.
|
||||||
|
- Tag deps directly in code at place of use.
|
||||||
|
- Auto-generate mod.conf / depends.txt
|
||||||
|
- Scripts for automatic metapackage mods?
|
||||||
|
- Git hooks (and git hook setup scripts)?
|
||||||
|
|
||||||
|
- API Cleanup
|
||||||
|
- Utils
|
||||||
|
- Box mueller (and repeated box mueller sum) and exporand
|
||||||
|
- Break up the nc_api monstrosity.
|
||||||
|
- nc_api_base to create _G.nodecore and include for all.
|
||||||
|
- nc_api metamod that just depends on ALL other api's.
|
||||||
|
- nc_all metamod for 3rd party mod authors...?
|
||||||
|
- Heat API
|
||||||
|
- Unified heating/cooling number from env.
|
||||||
|
- Proper API for burning up items
|
||||||
|
- on_burn? burns_to?
|
||||||
|
- Unify heat transformations into recipe system with
|
||||||
|
cooking recipes?
|
||||||
|
- Unify nc_items and visinv API.
|
||||||
|
- Stack nodes are "special", get first-class support.
|
||||||
|
|
||||||
|
- Make neighbor/distance calcs consistent.
|
||||||
|
- We're using scan_flood in some places, face checks in others,
|
||||||
|
and find_nodes_in_area (cuboid) in others.
|
||||||
|
- Diamond shape would be most consistent.
|
||||||
|
- Should require face touching, not diagonal.
|
||||||
|
|
||||||
|
........................................................................
|
||||||
|
========================================================================
|
|
@ -0,0 +1,37 @@
|
||||||
|
========================================================================
|
||||||
|
ISSUES: Bugs, Cleanup and Refinements
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#### ##### #### # # ###### ##### ####
|
||||||
|
# # # # # # # # # # #
|
||||||
|
#### # # # # # # ##### # # ####
|
||||||
|
# ##### # # # # # ##### #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
#### # #### # ###### ###### # # ####
|
||||||
|
|
||||||
|
- Design principles doc is badly out of date, needs to reflect lessons
|
||||||
|
learned and things observed about where the game is headed.
|
||||||
|
|
||||||
|
- Less cumbersome scaling controls.
|
||||||
|
- Use loitering or staring, or some other passive input
|
||||||
|
instead of a pummel recipe.
|
||||||
|
- Should hopefully make the process feel more natural.
|
||||||
|
- Need multiple handholds (i.e. ceil+wall version) since
|
||||||
|
player no longer picks the surface.
|
||||||
|
- With no death/respawn, and no fast-travel, we need to
|
||||||
|
buff player movement to balance that out.
|
||||||
|
|
||||||
|
- Hint system updates.
|
||||||
|
- Need a "witness" system for spontaneous in-world processes,
|
||||||
|
such as tree growth or lode cooling. Credit players within
|
||||||
|
a certain distance and line-of-sight.
|
||||||
|
- Feedback/issues URL?
|
||||||
|
- Look for new URL buttons in 5.0+
|
||||||
|
|
||||||
|
- Reinstate and update toolbelt once engine PR #8701 is released
|
||||||
|
- Alternative item strategy with dedicated slots for each
|
||||||
|
inventory space, which can be empty if in hand instead.
|
||||||
|
- Consider a "backpack" approach as opposed to toolbelt.
|
||||||
|
|
||||||
|
........................................................................
|
||||||
|
========================================================================
|
|
@ -0,0 +1,175 @@
|
||||||
|
========================================================================
|
||||||
|
ROADMAP: Large New Development Projects
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#### ##### #### # # ###### ##### ####
|
||||||
|
# # # # # # # # # # #
|
||||||
|
#### # # # # # # ##### # # ####
|
||||||
|
# ##### # # # # # ##### #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
#### # #### # ###### ###### # # ####
|
||||||
|
|
||||||
|
- Split this doc into "core gameplay" and "side quest" forks?
|
||||||
|
|
||||||
|
- Lux Ore
|
||||||
|
- Reconsider mapgen depth; push downwards?
|
||||||
|
- Players accumulate radiation.
|
||||||
|
- Player health API to allow registering multiple reasons
|
||||||
|
for player health loss (injury, radiation)
|
||||||
|
- Radiation fades, washes off faster with water.
|
||||||
|
- Stacks also radioactive. Tools too but less so.
|
||||||
|
- Infuse other materials
|
||||||
|
- Infuse clear glass to make "smoked" glass.
|
||||||
|
- Does not transmit light.
|
||||||
|
- See-thru only from one side.
|
||||||
|
- Infuse chromatic glass to make piezo glass.
|
||||||
|
- Step on it or punch it to emit light.
|
||||||
|
- Button/touchplate for optics.
|
||||||
|
|
||||||
|
- Trees/logs.
|
||||||
|
- Tree trunks as falling nodes, dig as logs.
|
||||||
|
- Logs as non-falling nodes, facedir.
|
||||||
|
|
||||||
|
- Sand renewability.
|
||||||
|
- Dirt turns to sand if left near water.
|
||||||
|
- Stronger near more water.
|
||||||
|
- Stronger near flowing water.
|
||||||
|
|
||||||
|
- Torches
|
||||||
|
- Burning nodes with ash parts, to display torch lifetime
|
||||||
|
- Create a "strike-anywhere match" by adding other
|
||||||
|
materials (sand, and something to react with like
|
||||||
|
gravel or lux infusion) to instantly light on
|
||||||
|
punching a solid enough surface.
|
||||||
|
|
||||||
|
- Advanced Tools
|
||||||
|
- Sickle / kopesh, choppy + snappy, recursive harvesting.
|
||||||
|
- Mop/broom for mass stack pickup.
|
||||||
|
- Sponge on a staff for a mop, thatch on a staff for broom.
|
||||||
|
- Broom recipe feels more right, but requires more work...
|
||||||
|
|
||||||
|
- Tinted glass: can see thru only one way and not others, does not
|
||||||
|
transmit light? Infuse non-chromatic glass w/ lux?
|
||||||
|
|
||||||
|
- Player knockback coming in 5.1+?
|
||||||
|
- Allow players to push others around by punching?
|
||||||
|
- Use for door conveyors?
|
||||||
|
|
||||||
|
- Doors
|
||||||
|
- Automation via laser ablation propulsion.
|
||||||
|
- Some materials cannot be operated by hand?
|
||||||
|
- Stirling engine using light gradient?
|
||||||
|
- Water or steam for rotary power?
|
||||||
|
- Arrangements to auto-return if propulsion removed?
|
||||||
|
- Push fluids, falling_nodes, items, ents as appropriate?
|
||||||
|
- Also move items sitting atop?
|
||||||
|
- Use as press for quick packing recipes?
|
||||||
|
|
||||||
|
- Domain Wall Sensor
|
||||||
|
- Adapt from sztest?
|
||||||
|
- Field Generator?
|
||||||
|
- Power an annealed lode block from 2 opposite faces.
|
||||||
|
- Generates particle effect at mapblock boundary.
|
||||||
|
|
||||||
|
- Thatch
|
||||||
|
- Collect grass and dry in sun, or pummel sticks into wood fiber.
|
||||||
|
- Nodes that reduce fall damage, decorative for building.
|
||||||
|
- Brushes for painting, writing system.
|
||||||
|
- Broom to sweep scattered item stacks together.
|
||||||
|
|
||||||
|
- Water and lava surface springs.
|
||||||
|
- Access to water for forges.
|
||||||
|
- Access to lava for lighting, firestarting, glass?
|
||||||
|
|
||||||
|
- Lava quenching, new material?
|
||||||
|
|
||||||
|
- Lurk Ore
|
||||||
|
- Moves freely among air-exposed stone while no player is looking.
|
||||||
|
- Follows after player, attempting to cause harm.
|
||||||
|
- Weakens nodes above/below player into falling nodes,
|
||||||
|
e.g. loose cobble, gravel?
|
||||||
|
- Steals items from player, drops onto ground or absorbs them
|
||||||
|
into body? Saps tool durability?
|
||||||
|
- Ignites flammables it passes by?
|
||||||
|
- Downgrades or absorbs ores nearby by contact or air floodfill?
|
||||||
|
- Creates illusionary nodes you can fall through?
|
||||||
|
- Cannot be dug or damaged directly.
|
||||||
|
- Digging it yields plain stone, but converts up to 2
|
||||||
|
surrounding stone nodes into Lurk.
|
||||||
|
- Need to dig all around it so it cannot move, then apply Some
|
||||||
|
time-integrated process to convert it to useful form.
|
||||||
|
|
||||||
|
- Threats
|
||||||
|
- Visceral
|
||||||
|
- Flammable/toxic gas?
|
||||||
|
- Monsters: stone-lurkers, mimics.
|
||||||
|
- Lightning, meteor strikes?
|
||||||
|
- Creeping
|
||||||
|
- Cellular automata hazards.
|
||||||
|
- From exploration, delving too deep, leaving things to rot, etc.
|
||||||
|
- Blights, Fungi
|
||||||
|
|
||||||
|
- Social features
|
||||||
|
- Randomize player appearance/colors.
|
||||||
|
- Shirt/pants, possibly w/ stripes/patterns
|
||||||
|
- Skin color, hair color, eye color?
|
||||||
|
- Add more holiday outfits.
|
||||||
|
- Track server lag in metadata?
|
||||||
|
|
||||||
|
- New writing system based on charcoal
|
||||||
|
- Draw a symbol on surfaces by pummeling w/ charcoal
|
||||||
|
- ...or maybe make ink from coal+water, use a brush?
|
||||||
|
- Punch symbol w/ charcoal to rotate thru alphabet
|
||||||
|
- Use a special/reduced alphabet?
|
||||||
|
|
||||||
|
- Smoked glass
|
||||||
|
- Lux-infuse clear glass.
|
||||||
|
- Does not transmit light.
|
||||||
|
- See thru only in one direction.
|
||||||
|
- Useful for hidden bases.
|
||||||
|
|
||||||
|
- Digital logic + lighting via optics.
|
||||||
|
- Piezo Crystal Node
|
||||||
|
- Emits light briefly when punched or stepped on
|
||||||
|
- Need to interpolate player paths for "stepped on" logic
|
||||||
|
- Lux-infused chromatic glass?
|
||||||
|
- Pistons or rack&pinions for affecting world stuff.
|
||||||
|
- Laser ablation propulsion
|
||||||
|
- Gray code absolute game time to determine distance (logarithmic by load)
|
||||||
|
- Advanced optics?
|
||||||
|
- Polarization? Phase? Interference and superposition?
|
||||||
|
|
||||||
|
- Rotary power?
|
||||||
|
- Stirling engine?
|
||||||
|
- Rotors?
|
||||||
|
- Conveyors?
|
||||||
|
- Steam as a classic fluid?
|
||||||
|
|
||||||
|
- New materials to craft with.
|
||||||
|
- Dungeon materials, stonework?
|
||||||
|
- Decorations for dungeons
|
||||||
|
- Tree sap from stumps? Resin? Rubber? Shellac?
|
||||||
|
- Small plants? Reeds? Mallows?
|
||||||
|
- Sea stars, anenome, coral, other underwater things?
|
||||||
|
- Fungi, esp. tree-destroying ones, blight?
|
||||||
|
- Oil, natural gas? Fossils and fossil fuels?
|
||||||
|
- Geode, hydra crystals, radioactives?
|
||||||
|
- Shipwrecks or alien tech
|
||||||
|
- Slow-moving animals? Snails? Miniature spice worms?
|
||||||
|
- Non-portable things, like "spawners" or wormholes
|
||||||
|
- Tubers and taproots, cacti, and other "defensive" plantlife
|
||||||
|
- Plant-like CA animals, like bee nests and clouds of bees?
|
||||||
|
Termine mounds? Ant colonies? Coral?
|
||||||
|
- Popeggcorn?
|
||||||
|
- Ores that smelt via heating and then rapid quenching?
|
||||||
|
|
||||||
|
- System for transporting cargo.
|
||||||
|
- Trains of minecarts?
|
||||||
|
- Conveyors, elevators?
|
||||||
|
|
||||||
|
- Vary player walking speed based on nodes under feet?
|
||||||
|
|
||||||
|
- Use gravity vector to make flowing water push the player?
|
||||||
|
|
||||||
|
........................................................................
|
||||||
|
========================================================================
|
|
@ -0,0 +1,8 @@
|
||||||
|
auth.*
|
||||||
|
env_meta.*
|
||||||
|
force_loaded.*
|
||||||
|
ipban.*
|
||||||
|
mod_storage
|
||||||
|
players.*
|
||||||
|
players
|
||||||
|
world.mt
|
|
@ -0,0 +1,3 @@
|
||||||
|
clean:
|
||||||
|
lua5.1 mapclean.lua | sqlite3 map.sqlite
|
||||||
|
cp world.mt.dist world.mt
|
|
@ -0,0 +1,202 @@
|
||||||
|
mgv7_np_ridge = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.75
|
||||||
|
octaves = 4
|
||||||
|
offset = 0
|
||||||
|
scale = 1
|
||||||
|
flags = defaults
|
||||||
|
spread = (100,100,100)
|
||||||
|
seed = 6467
|
||||||
|
}
|
||||||
|
mgv7_np_mountain = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.63
|
||||||
|
octaves = 5
|
||||||
|
offset = -0.6
|
||||||
|
scale = 1
|
||||||
|
flags = defaults
|
||||||
|
spread = (250,350,250)
|
||||||
|
seed = 5333
|
||||||
|
}
|
||||||
|
mgv7_np_float_base_height = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.7
|
||||||
|
octaves = 4
|
||||||
|
offset = 48
|
||||||
|
scale = 24
|
||||||
|
flags = defaults
|
||||||
|
spread = (300,300,300)
|
||||||
|
seed = 907
|
||||||
|
}
|
||||||
|
mgv7_np_ridge_uwater = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.6
|
||||||
|
octaves = 5
|
||||||
|
offset = 0
|
||||||
|
scale = 1
|
||||||
|
flags = defaults
|
||||||
|
spread = (1000,1000,1000)
|
||||||
|
seed = 85039
|
||||||
|
}
|
||||||
|
mgv7_np_mount_height = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.6
|
||||||
|
octaves = 3
|
||||||
|
offset = 256
|
||||||
|
scale = 112
|
||||||
|
flags = defaults
|
||||||
|
spread = (1000,1000,1000)
|
||||||
|
seed = 72449
|
||||||
|
}
|
||||||
|
mgv7_np_filler_depth = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.7
|
||||||
|
octaves = 3
|
||||||
|
offset = 0
|
||||||
|
scale = 1.2
|
||||||
|
flags = defaults
|
||||||
|
spread = (150,150,150)
|
||||||
|
seed = 261
|
||||||
|
}
|
||||||
|
mgv7_np_height_select = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.7
|
||||||
|
octaves = 6
|
||||||
|
offset = -8
|
||||||
|
scale = 16
|
||||||
|
flags = defaults
|
||||||
|
spread = (500,500,500)
|
||||||
|
seed = 4213
|
||||||
|
}
|
||||||
|
mgv7_dungeon_ymax = 31000
|
||||||
|
mgv7_dungeon_ymin = -31000
|
||||||
|
mgv7_cavern_threshold = 0.7
|
||||||
|
mg_flags = caves, dungeons, light, decorations, biomes
|
||||||
|
seed = 14531853857515683775
|
||||||
|
mgv7_np_cave1 = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.5
|
||||||
|
octaves = 3
|
||||||
|
offset = 0
|
||||||
|
scale = 12
|
||||||
|
flags = defaults
|
||||||
|
spread = (61,61,61)
|
||||||
|
seed = 52534
|
||||||
|
}
|
||||||
|
mg_biome_np_humidity = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.5
|
||||||
|
octaves = 3
|
||||||
|
offset = 50
|
||||||
|
scale = 50
|
||||||
|
flags = defaults
|
||||||
|
spread = (1000,1000,1000)
|
||||||
|
seed = 842
|
||||||
|
}
|
||||||
|
mg_biome_np_humidity_blend = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 1
|
||||||
|
octaves = 2
|
||||||
|
offset = 0
|
||||||
|
scale = 1.5
|
||||||
|
flags = defaults
|
||||||
|
spread = (8,8,8)
|
||||||
|
seed = 90003
|
||||||
|
}
|
||||||
|
mgv7_float_mount_exponent = 0.75
|
||||||
|
mgv7_np_terrain_persist = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.6
|
||||||
|
octaves = 3
|
||||||
|
offset = 0.6
|
||||||
|
scale = 0.1
|
||||||
|
flags = defaults
|
||||||
|
spread = (2000,2000,2000)
|
||||||
|
seed = 539
|
||||||
|
}
|
||||||
|
mg_name = v7
|
||||||
|
mgv7_np_cave2 = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.5
|
||||||
|
octaves = 3
|
||||||
|
offset = 0
|
||||||
|
scale = 12
|
||||||
|
flags = defaults
|
||||||
|
spread = (67,67,67)
|
||||||
|
seed = 10325
|
||||||
|
}
|
||||||
|
water_level = 1
|
||||||
|
mg_biome_np_heat_blend = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 1
|
||||||
|
octaves = 2
|
||||||
|
offset = 0
|
||||||
|
scale = 1.5
|
||||||
|
flags = defaults
|
||||||
|
spread = (8,8,8)
|
||||||
|
seed = 13
|
||||||
|
}
|
||||||
|
mgv7_cavern_limit = -256
|
||||||
|
mgv7_cavern_taper = 256
|
||||||
|
mgv7_np_cavern = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.63
|
||||||
|
octaves = 5
|
||||||
|
offset = 0
|
||||||
|
scale = 1
|
||||||
|
flags = defaults
|
||||||
|
spread = (384,128,384)
|
||||||
|
seed = 723
|
||||||
|
}
|
||||||
|
mgv7_np_floatland_base = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.6
|
||||||
|
octaves = 5
|
||||||
|
offset = -0.6
|
||||||
|
scale = 1.5
|
||||||
|
flags = defaults
|
||||||
|
spread = (600,600,600)
|
||||||
|
seed = 114
|
||||||
|
}
|
||||||
|
mg_biome_np_heat = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.5
|
||||||
|
octaves = 3
|
||||||
|
offset = 50
|
||||||
|
scale = 50
|
||||||
|
flags = defaults
|
||||||
|
spread = (1000,1000,1000)
|
||||||
|
seed = 5349
|
||||||
|
}
|
||||||
|
chunksize = 5
|
||||||
|
mapgen_limit = 31000
|
||||||
|
mgv7_np_terrain_alt = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.6
|
||||||
|
octaves = 5
|
||||||
|
offset = 4
|
||||||
|
scale = 25
|
||||||
|
flags = defaults
|
||||||
|
spread = (600,600,600)
|
||||||
|
seed = 5934
|
||||||
|
}
|
||||||
|
mgv7_mount_zero_level = 0
|
||||||
|
mgv7_spflags = mountains, ridges, nofloatlands, caverns
|
||||||
|
mgv7_large_cave_depth = -33
|
||||||
|
mgv7_float_mount_height = 128
|
||||||
|
mgv7_float_mount_density = 0.6
|
||||||
|
mgv7_cave_width = 0.09
|
||||||
|
mgv7_lava_depth = -256
|
||||||
|
mgv7_floatland_level = 1280
|
||||||
|
mgv7_np_terrain_base = {
|
||||||
|
lacunarity = 2
|
||||||
|
persistence = 0.6
|
||||||
|
octaves = 5
|
||||||
|
offset = 4
|
||||||
|
scale = 70
|
||||||
|
flags = defaults
|
||||||
|
spread = (600,600,600)
|
||||||
|
seed = 82341
|
||||||
|
}
|
||||||
|
mgv7_shadow_limit = 1024
|
||||||
|
[end_of_params]
|
|
@ -0,0 +1,44 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, pairs, table
|
||||||
|
= math, pairs, table
|
||||||
|
local math_ceil, math_floor, table_concat, table_sort
|
||||||
|
= math.ceil, math.floor, table.concat, table.sort
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local min = {
|
||||||
|
x = -192,
|
||||||
|
y = -16,
|
||||||
|
z = -192
|
||||||
|
}
|
||||||
|
local max = {
|
||||||
|
x = 64,
|
||||||
|
y = 32,
|
||||||
|
z = -64
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v in pairs(min) do min[k] = math_floor(v / 80) * 5 end
|
||||||
|
for k, v in pairs(max) do max[k] = math_ceil(v / 80) * 5 end
|
||||||
|
|
||||||
|
local t = {}
|
||||||
|
for x = min.x, max.x do
|
||||||
|
for y = min.y, max.y do
|
||||||
|
for z = min.z, max.z do
|
||||||
|
t[#t + 1] = x + 4096 * y + 16777216 * z
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table_sort(t)
|
||||||
|
|
||||||
|
print("create table if not exists keep(id integer primary key);")
|
||||||
|
print("begin transaction;")
|
||||||
|
for s = 1, #t, 100 do
|
||||||
|
local e = s + 99
|
||||||
|
if e > #t then e = #t end
|
||||||
|
local u = {}
|
||||||
|
for i = s, e do u[#u + 1] = t[i] end
|
||||||
|
print("insert into keep(id) values(" .. table_concat(u, "),(") .. ");")
|
||||||
|
end
|
||||||
|
print("commit;")
|
||||||
|
print("delete from blocks where pos not in (select distinct id from keep);")
|
||||||
|
print("drop table keep;")
|
||||||
|
print("vacuum;")
|
|
@ -0,0 +1,3 @@
|
||||||
|
gameid = nodecore
|
||||||
|
backend = sqlite3
|
||||||
|
load_mod_nc_reative = true
|
|
@ -0,0 +1,23 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest
|
||||||
|
= minetest
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
minetest.settings:set("time_speed", 0)
|
||||||
|
minetest.after(0, function() minetest.set_timeofday(0.5) end)
|
||||||
|
|
||||||
|
local function setup(p)
|
||||||
|
local n = p:get_player_name()
|
||||||
|
|
||||||
|
local v = minetest.get_player_privs(n)
|
||||||
|
v.fly = true
|
||||||
|
v.fast = true
|
||||||
|
v.give = true
|
||||||
|
v.interact = true
|
||||||
|
v.nc_reative = true
|
||||||
|
minetest.set_player_privs(n, v)
|
||||||
|
|
||||||
|
p:set_pos({x = -113, y = 5, z = -93})
|
||||||
|
end
|
||||||
|
minetest.register_on_joinplayer(setup)
|
||||||
|
minetest.register_on_respawnplayer(setup)
|
|
@ -0,0 +1,2 @@
|
||||||
|
name = NodeCore Skyblock
|
||||||
|
description = Skyblock version of an original, immersive puzzle/adventure game with NO popup GUIs, minimal HUDs.
|
After Width: | Height: | Size: 232 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 8.2 KiB |
|
@ -0,0 +1,227 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="625.26715mm"
|
||||||
|
height="134.6713mm"
|
||||||
|
viewBox="0 0 1000.4274 215.47406"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="header.svg"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
inkscape:export-filename="header.png"
|
||||||
|
inkscape:export-xdpi="41.599998"
|
||||||
|
inkscape:export-ydpi="41.599998">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="16.93333 : 181.96188 : 1"
|
||||||
|
inkscape:vp_y="140.18095 : 489.6094 : 1"
|
||||||
|
inkscape:vp_z="328.74288 : 169.26187 : 1"
|
||||||
|
inkscape:persp3d-origin="168 : 158.39997 : 1"
|
||||||
|
id="perspective4485" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.175"
|
||||||
|
inkscape:cx="1208.5144"
|
||||||
|
inkscape:cy="234.92333"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="g4676"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:snap-bbox-midpoints="true"
|
||||||
|
inkscape:snap-object-midpoints="true"
|
||||||
|
inkscape:snap-global="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
scale-x="1.6" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(235.51666,155.09466)">
|
||||||
|
<g
|
||||||
|
id="g4676"
|
||||||
|
transform="matrix(0.94952391,0,0,0.94978823,1.2397197,8.6363235)"
|
||||||
|
style="stroke-width:1.05301285">
|
||||||
|
<g
|
||||||
|
style="stroke:#ffffff;stroke-width:25.27230644;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="g4657-5">
|
||||||
|
<path
|
||||||
|
sodipodi:type="star"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4515-5-48"
|
||||||
|
sodipodi:sides="6"
|
||||||
|
sodipodi:cx="28.273651"
|
||||||
|
sodipodi:cy="-58.95414"
|
||||||
|
sodipodi:r1="64.224815"
|
||||||
|
sodipodi:r2="55.620323"
|
||||||
|
sodipodi:arg1="-1.5707963"
|
||||||
|
sodipodi:arg2="-1.0471976"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
d="m 28.273653,-123.17896 55.620321,32.112414 -2e-6,64.224815 -55.620323,32.1124067 -55.62032,-32.1124097 1e-6,-64.224815 z"
|
||||||
|
inkscape:transform-center-x="1.0101525e-06"
|
||||||
|
inkscape:transform-center-y="-1.3577723e-06" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4516-1"
|
||||||
|
d="M 117.65593,-123.1792 V 5.270433 l 55.62032,-32.11241 v -64.224817 z"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 262.65853,-58.923867 h -55.24781 m 55.24781,-64.224813 -55.62032,32.112404 v 64.224819 l 55.62032,32.1124099"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4520-2" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4515-5-4-8"
|
||||||
|
d="M 467.57949,-9.732521 382.02998,39.489085 296.48047,-9.7325256 V -108.17574 l 85.54951,-49.22163 85.54952,49.22163"
|
||||||
|
inkscape:transform-center-y="-5.1205033e-06"
|
||||||
|
inkscape:transform-center-x="1.5537137e-06"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="star"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4515-5-0-9"
|
||||||
|
sodipodi:sides="6"
|
||||||
|
sodipodi:cx="557.01379"
|
||||||
|
sodipodi:cy="-58.95414"
|
||||||
|
sodipodi:r1="64.224815"
|
||||||
|
sodipodi:r2="55.620323"
|
||||||
|
sodipodi:arg1="-1.5707963"
|
||||||
|
sodipodi:arg2="-1.0471976"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
d="m 557.0138,-123.17896 55.62032,32.112414 -1e-5,64.224815 -55.62032,32.1124067 -55.62032,-32.1124097 0,-64.224815 z"
|
||||||
|
inkscape:transform-center-x="1.0101525e-06"
|
||||||
|
inkscape:transform-center-y="-1.3577723e-06" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4554-3"
|
||||||
|
d="M 646.39652,5.2704448 V -123.1792 l 55.62032,32.112413 -55.62032,32.112412 55.62032,32.11241"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 791.45113,-58.923867 h -55.1483 m 55.1483,-64.224813 -55.62032,32.112402 v 64.224822 l 55.62032,32.1124089"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4520-5-6" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4515-8"
|
||||||
|
d="m -148.90733,-159.66051 87.798708,50.35319 -9e-6,100.7063678 L -236.70605,-109.30733 V -8.6009522 l 87.79871,50.3531812"
|
||||||
|
inkscape:transform-center-y="-3.6452217e-06"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4657">
|
||||||
|
<path
|
||||||
|
sodipodi:type="star"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4515-5"
|
||||||
|
sodipodi:sides="6"
|
||||||
|
sodipodi:cx="28.273651"
|
||||||
|
sodipodi:cy="-58.95414"
|
||||||
|
sodipodi:r1="64.224815"
|
||||||
|
sodipodi:r2="55.620323"
|
||||||
|
sodipodi:arg1="-1.5707963"
|
||||||
|
sodipodi:arg2="-1.0471976"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
d="m 28.273653,-123.17896 55.620321,32.112414 -2e-6,64.224815 -55.620323,32.1124067 -55.62032,-32.1124097 1e-6,-64.224815 z"
|
||||||
|
inkscape:transform-center-x="1.0101525e-06"
|
||||||
|
inkscape:transform-center-y="-1.3577723e-06" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4516"
|
||||||
|
d="M 117.65593,-123.1792 V 5.270433 l 55.62032,-32.11241 v -64.224817 z"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 262.65853,-58.923867 h -55.24781 m 55.24781,-64.224813 -55.62032,32.112404 v 64.224819 l 55.62032,32.1124099"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4520" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4515-5-4"
|
||||||
|
d="M 467.57949,-9.732521 382.02998,39.489085 296.48047,-9.7325256 V -108.17574 l 85.54951,-49.22163 85.54952,49.22163"
|
||||||
|
inkscape:transform-center-y="-5.1205033e-06"
|
||||||
|
inkscape:transform-center-x="1.5537137e-06"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="star"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4515-5-0"
|
||||||
|
sodipodi:sides="6"
|
||||||
|
sodipodi:cx="557.01379"
|
||||||
|
sodipodi:cy="-58.95414"
|
||||||
|
sodipodi:r1="64.224815"
|
||||||
|
sodipodi:r2="55.620323"
|
||||||
|
sodipodi:arg1="-1.5707963"
|
||||||
|
sodipodi:arg2="-1.0471976"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
d="m 557.0138,-123.17896 55.62032,32.112414 -1e-5,64.224815 -55.62032,32.1124067 -55.62032,-32.1124097 0,-64.224815 z"
|
||||||
|
inkscape:transform-center-x="1.0101525e-06"
|
||||||
|
inkscape:transform-center-y="-1.3577723e-06" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4554"
|
||||||
|
d="M 646.39652,5.2704448 V -123.1792 l 55.62032,32.112413 -55.62032,32.112412 55.62032,32.11241"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 791.45113,-58.923867 h -55.1483 m 55.1483,-64.224813 -55.62032,32.112402 v 64.224822 l 55.62032,32.1124089"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4520-5" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4515"
|
||||||
|
d="m -148.90733,-159.66051 87.798708,50.35319 -9e-6,100.7063678 L -236.70605,-109.30733 V -8.6009522 l 87.79871,50.3531812"
|
||||||
|
inkscape:transform-center-y="-3.6452217e-06"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,134 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="134.66922mm"
|
||||||
|
height="134.66922mm"
|
||||||
|
viewBox="0 0 134.66923 134.66922"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="icon.svg"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
inkscape:export-filename="/home/warr/git/gitlab.com/sztest/nodecore/menu/icon.png"
|
||||||
|
inkscape:export-xdpi="24.139999"
|
||||||
|
inkscape:export-ydpi="24.139999">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="10.583334 : 113.72616 : 1"
|
||||||
|
inkscape:vp_y="87.613106 : 306.00588 : 1"
|
||||||
|
inkscape:vp_z="205.46432 : 105.78866 : 1"
|
||||||
|
inkscape:persp3d-origin="105.00001 : 98.999985 : 1"
|
||||||
|
id="perspective4485" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.35"
|
||||||
|
inkscape:cx="41.97112"
|
||||||
|
inkscape:cy="355.38663"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="g89"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:snap-bbox-midpoints="true"
|
||||||
|
inkscape:snap-object-midpoints="true"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="7.730245"
|
||||||
|
fit-margin-right="7.730245"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:pagecheckerboard="true" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-10.038749,-43.6634)">
|
||||||
|
<g
|
||||||
|
id="g4676"
|
||||||
|
transform="matrix(0.94952391,0,0,0.94978823,1.2397197,8.6363235)"
|
||||||
|
style="stroke-width:1.05301285">
|
||||||
|
<path
|
||||||
|
inkscape:transform-center-y="-1.3577723e-06"
|
||||||
|
inkscape:transform-center-x="1.0101525e-06"
|
||||||
|
d="m 80.180857,43.548355 55.620323,32.112409 0,64.224816 -55.620327,32.11241 -55.620321,-32.11241 2e-6,-64.224819 z"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
sodipodi:arg2="-1.0471976"
|
||||||
|
sodipodi:arg1="-1.5707963"
|
||||||
|
sodipodi:r2="55.620323"
|
||||||
|
sodipodi:r1="64.224815"
|
||||||
|
sodipodi:cy="107.77317"
|
||||||
|
sodipodi:cx="80.180855"
|
||||||
|
sodipodi:sides="6"
|
||||||
|
id="path4515-2"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.31807709;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
sodipodi:type="star" />
|
||||||
|
<path
|
||||||
|
inkscape:transform-center-y="-1.3577723e-06"
|
||||||
|
inkscape:transform-center-x="1.0101525e-06"
|
||||||
|
d="m 80.180857,43.548355 55.620323,32.112409 0,64.224816 -55.620327,32.11241 -55.620321,-32.11241 2e-6,-64.224819 z"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
inkscape:rounded="0"
|
||||||
|
inkscape:flatsided="true"
|
||||||
|
sodipodi:arg2="-1.0471976"
|
||||||
|
sodipodi:arg1="-1.5707963"
|
||||||
|
sodipodi:r2="55.620323"
|
||||||
|
sodipodi:r1="64.224815"
|
||||||
|
sodipodi:cy="107.77317"
|
||||||
|
sodipodi:cx="80.180855"
|
||||||
|
sodipodi:sides="6"
|
||||||
|
id="path4515"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.1060257;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
sodipodi:type="star" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 80.180857,43.548355 -10e-7,64.224815 m -55.620324,32.11241 55.620323,-32.11241 55.620325,32.11241"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.1060257;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
|
||||||
|
id="path4515-7" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g89"
|
||||||
|
transform="translate(-2.5234665,-44.723556)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4515-8"
|
||||||
|
d="m 79.896826,95.940486 52.104364,29.890544 -1e-5,59.78108 -104.20872,-59.78109 v 59.78109 l 52.104361,29.89054"
|
||||||
|
inkscape:transform-center-y="-3.6452217e-06"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4515-3"
|
||||||
|
d="m 79.896826,95.940486 52.104364,29.890544 -1e-5,59.78108 -104.20872,-59.78109 v 59.78109 l 52.104361,29.89054"
|
||||||
|
inkscape:transform-center-y="-3.6452217e-06"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.2 KiB |
|
@ -0,0 +1,41 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore, pairs
|
||||||
|
= math, minetest, nodecore, pairs
|
||||||
|
local math_ceil, math_floor, math_random
|
||||||
|
= math.ceil, math.floor, math.random
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
function nodecore.digparticles(nodedef, partdef)
|
||||||
|
if partdef.forcetexture then
|
||||||
|
partdef.texture = partdef.forcetexture
|
||||||
|
local id = minetest.add_particlespawner(partdef)
|
||||||
|
return function() minetest.delete_particlespawner(id) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local img = {}
|
||||||
|
if nodedef.tiles then
|
||||||
|
for i = 1, 6 do
|
||||||
|
img[#img + 1] = nodedef.tiles[i > #nodedef.tiles and #nodedef.tiles or i]
|
||||||
|
end
|
||||||
|
elseif nodedef.inventory_image then
|
||||||
|
img[1] = nodedef.inventory_image
|
||||||
|
end
|
||||||
|
if #img < 1 then return minetest.log("no pummel tile images found!") end
|
||||||
|
img = nodecore.pickrand(img)
|
||||||
|
if img.name then img = img.name end
|
||||||
|
|
||||||
|
partdef.amount = partdef.amount and math_ceil(partdef.amount / 4) or 4
|
||||||
|
|
||||||
|
local t = {}
|
||||||
|
for _ = 1, 4 do
|
||||||
|
partdef.texture = img .. "^[mask:[combine\\:16x16\\:"
|
||||||
|
.. math_floor(math_random() * 12) .. ","
|
||||||
|
.. math_floor(math_random() * 12) .. "=nc_api_pummel.png"
|
||||||
|
t[#t + 1] = minetest.add_particlespawner(partdef)
|
||||||
|
end
|
||||||
|
return function()
|
||||||
|
for _, v in pairs(t) do
|
||||||
|
minetest.delete_particlespawner(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,76 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
-- SKIP: include nodecore
|
||||||
|
local dofile, error, minetest, pairs, rawget, rawset, setmetatable,
|
||||||
|
table, type
|
||||||
|
= dofile, error, minetest, pairs, rawget, rawset, setmetatable,
|
||||||
|
table, type
|
||||||
|
local table_concat, table_insert
|
||||||
|
= table.concat, table.insert
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local nodecore = rawget(_G, "nodecore") or {}
|
||||||
|
rawset(_G, "nodecore", nodecore)
|
||||||
|
|
||||||
|
local include = rawget(_G, "include") or function(...)
|
||||||
|
local parts = {...}
|
||||||
|
table_insert(parts, 1, minetest.get_modpath(minetest.get_current_modname()))
|
||||||
|
if parts[#parts]:sub(-4) ~= ".lua" then
|
||||||
|
parts[#parts] = parts[#parts] .. ".lua"
|
||||||
|
end
|
||||||
|
return dofile(table_concat(parts, "/"))
|
||||||
|
end
|
||||||
|
rawset(_G, "include", include)
|
||||||
|
|
||||||
|
nodecore.product = "NodeCore Skyblock"
|
||||||
|
nodecore.version = include("version")
|
||||||
|
|
||||||
|
local function callguard(n, t, k, v)
|
||||||
|
if type(v) ~= "function" then return v end
|
||||||
|
return function(first, ...)
|
||||||
|
if first == t then
|
||||||
|
error("called " .. n .. ":" .. k .. "() instead of " .. n .. "." .. k .. "()")
|
||||||
|
end
|
||||||
|
return v(first, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for k, v in pairs(minetest) do
|
||||||
|
minetest[k] = callguard("minetest", minetest, k, v)
|
||||||
|
end
|
||||||
|
setmetatable(nodecore, {
|
||||||
|
__newindex = function(t, k, v)
|
||||||
|
rawset(nodecore, k, callguard("nodecore", t, k, v))
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
include("issue7020")
|
||||||
|
|
||||||
|
include("util_misc")
|
||||||
|
include("util_falling")
|
||||||
|
include("util_scan_flood")
|
||||||
|
include("util_node_is")
|
||||||
|
include("util_toolcaps")
|
||||||
|
include("util_stack")
|
||||||
|
include("util_phealth")
|
||||||
|
include("util_facedir")
|
||||||
|
include("util_sound")
|
||||||
|
include("util_translate")
|
||||||
|
include("util_ezschematic")
|
||||||
|
include("match")
|
||||||
|
|
||||||
|
include("fx_digparticles")
|
||||||
|
|
||||||
|
include("register_limited_abm")
|
||||||
|
include("register_soaking_abm")
|
||||||
|
include("register_ambiance")
|
||||||
|
include("register_mods")
|
||||||
|
include("mapgen_shared")
|
||||||
|
|
||||||
|
include("item_on_register")
|
||||||
|
include("item_drop_in_place")
|
||||||
|
include("item_falling_repose")
|
||||||
|
include("item_alternate_loose")
|
||||||
|
include("item_group_visinv")
|
||||||
|
include("item_oldnames")
|
||||||
|
include("item_tool_wears_to")
|
||||||
|
include("item_tool_sounds")
|
||||||
|
include("item_punch_sounds")
|
|
@ -0,0 +1,22 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, pairs, setmetatable, type
|
||||||
|
= minetest, pairs, setmetatable, type
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local bifn = minetest.registered_entities["__builtin:falling_node"]
|
||||||
|
local falling = {
|
||||||
|
set_node = function(self, node, meta, ...)
|
||||||
|
meta = meta or {}
|
||||||
|
if type(meta) ~= "table" then meta = meta:to_table() end
|
||||||
|
for _, v1 in pairs(meta.inventory or {}) do
|
||||||
|
for k2, v2 in pairs(v1) do
|
||||||
|
if type(v2) == "userdata" then
|
||||||
|
v1[k2] = v2:to_string()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return bifn.set_node(self, node, meta, ...)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
setmetatable(falling, bifn)
|
||||||
|
minetest.register_entity(":__builtin:falling_node", falling)
|
|
@ -0,0 +1,109 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore, pairs, type
|
||||||
|
= math, minetest, nodecore, pairs, type
|
||||||
|
local math_pow
|
||||||
|
= math.pow
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Nodes that have an "alternate_loose = { ... }" definition when
|
||||||
|
registered will be registered as a pair, one being the "loose" version
|
||||||
|
and the other being the normal "solid" one. Solid-specific attributes
|
||||||
|
can be set via "alternate_solid = { ... }". The solid version will
|
||||||
|
transform to the loose one when dug, and the loose to solid when
|
||||||
|
pummeled.
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local looseimg = "^nc_api_loose.png"
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(name, def)
|
||||||
|
if def.type ~= "node" then return end
|
||||||
|
|
||||||
|
local loose = def.alternate_loose
|
||||||
|
if not loose then return end
|
||||||
|
|
||||||
|
if not loose.tiles then
|
||||||
|
loose.tiles = nodecore.underride({}, def.tiles)
|
||||||
|
for k, v in pairs(loose.tiles) do
|
||||||
|
if type(v) == "string" then
|
||||||
|
loose.tiles[k] = v .. looseimg
|
||||||
|
elseif type(v) == "table" then
|
||||||
|
loose.tiles[k] = nodecore.underride({
|
||||||
|
name = v.name .. looseimg
|
||||||
|
}, v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
nodecore.underride(loose, def)
|
||||||
|
|
||||||
|
loose.name = name .. "_loose"
|
||||||
|
if loose.oldnames then
|
||||||
|
for k, v in pairs(loose.oldnames) do
|
||||||
|
loose.oldnames[k] = v .. "_loose"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
loose.description = "Loose " .. loose.description
|
||||||
|
loose.groups = nodecore.underride({}, loose.groups or {})
|
||||||
|
loose.groups.falling_node = 1
|
||||||
|
loose.groups.loose_repack = 1
|
||||||
|
|
||||||
|
if loose.groups.crumbly and not loose.no_repack then
|
||||||
|
minetest.after(0, function()
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "repack " .. loose.name,
|
||||||
|
action = "pummel",
|
||||||
|
nodes = {
|
||||||
|
{match = loose.name, replace = name}
|
||||||
|
},
|
||||||
|
toolgroups = {thumpy = loose.repack_level or 1},
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
loose.alternate_loose = nil
|
||||||
|
loose.alternate_solid = nil
|
||||||
|
loose.repack_to = name
|
||||||
|
minetest.register_node(loose.name, loose)
|
||||||
|
|
||||||
|
local solid = nodecore.underride(def.alternate_solid or {}, def)
|
||||||
|
solid.drop_in_place = solid.drop_in_place or loose.name
|
||||||
|
|
||||||
|
solid.alternate_loose = nil
|
||||||
|
solid.alternate_solid = nil
|
||||||
|
minetest.register_node(name, solid)
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
|
||||||
|
nodecore.register_soaking_abm({
|
||||||
|
label = "loose self-repacking",
|
||||||
|
nodenames = {"group:loose_repack"},
|
||||||
|
interval = 10,
|
||||||
|
chance = 1,
|
||||||
|
limited_max = 100,
|
||||||
|
limited_alert = 1000,
|
||||||
|
soakrate = function(pos, node)
|
||||||
|
local bnode = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z})
|
||||||
|
local bdef = minetest.registered_items[bnode.name] or {}
|
||||||
|
if (not bdef.groups) or bdef.groups.falling_node then return false end
|
||||||
|
|
||||||
|
local weight = 1
|
||||||
|
for dy = 1, 8 do
|
||||||
|
local n = minetest.get_node({x = pos.x, y = pos.y + dy, z = pos.z})
|
||||||
|
local def = minetest.registered_items[n.name] or {}
|
||||||
|
if def and def.groups and def.groups.falling_node then
|
||||||
|
local w = def.crush_damage or 1
|
||||||
|
if w < 1 then w = 1 end
|
||||||
|
weight = weight + w
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
return weight * 2 / math_pow(2, def.repack_level or 1)
|
||||||
|
end,
|
||||||
|
soakcheck = function(data, pos, node)
|
||||||
|
if data.total < 100 then return end
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
return minetest.set_node(pos, {name = def.repack_to})
|
||||||
|
end
|
||||||
|
})
|
|
@ -0,0 +1,38 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, minetest, nodecore, pairs, type
|
||||||
|
= ItemStack, minetest, nodecore, pairs, type
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Nodes with a "drop_in_place" spec transform on node drop by dropping
|
||||||
|
into place of existing node instead of digger inventory.
|
||||||
|
--]]
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(_, def)
|
||||||
|
if def.type ~= "node" then return end
|
||||||
|
local dip = def.drop_in_place
|
||||||
|
if dip then
|
||||||
|
if type(dip) ~= "table" then dip = {name = dip} end
|
||||||
|
def.drop = def.drop or ""
|
||||||
|
def.node_dig_prediction = def.node_dig_prediction or dip.name
|
||||||
|
local st = def.silktouch
|
||||||
|
if st == nil then
|
||||||
|
st = {}
|
||||||
|
for k, v in pairs(def.groups or {}) do
|
||||||
|
st[k] = v + 5
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def.after_dig_node = def.after_dig_node or function(pos, node, _, digger)
|
||||||
|
if st and digger and nodecore.toolspeed(
|
||||||
|
digger:get_wielded_item(), st) then
|
||||||
|
local stack = ItemStack(node.name)
|
||||||
|
stack = digger:get_inventory():add_item("main",
|
||||||
|
stack:to_string())
|
||||||
|
if stack:is_empty() then return end
|
||||||
|
do return nodecore.item_eject(pos, stack) end
|
||||||
|
end
|
||||||
|
dip.param2 = node.param2
|
||||||
|
minetest.set_node(pos, dip)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1,109 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore, pairs
|
||||||
|
= math, minetest, nodecore, pairs
|
||||||
|
local math_random
|
||||||
|
= math.random
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Nodes with the "falling_repose" group will not only fall if unsupported
|
||||||
|
from below, but if there is a sufficient drop off the sides, so simulate
|
||||||
|
an "angle of repose."
|
||||||
|
--]]
|
||||||
|
|
||||||
|
function nodecore.falling_repose_drop(posfrom, posto, node)
|
||||||
|
minetest.spawn_falling_node(posto, node, minetest.get_meta(posfrom))
|
||||||
|
minetest.remove_node(posfrom)
|
||||||
|
posfrom.y = posfrom.y + 1
|
||||||
|
return nodecore.fallcheck(posfrom)
|
||||||
|
end
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(_, def)
|
||||||
|
if def.type ~= "node" then return end
|
||||||
|
|
||||||
|
def.groups = def.groups or {}
|
||||||
|
|
||||||
|
if def.groups.falling_repose then def.groups.falling_node = 1 end
|
||||||
|
|
||||||
|
def.repose_drop = def.repose_drop or nodecore.falling_repose_drop
|
||||||
|
end)
|
||||||
|
|
||||||
|
function minetest.spawn_falling_node(pos, node, meta)
|
||||||
|
node = node or minetest.get_node(pos)
|
||||||
|
if node.name == "air" or node.name == "ignore" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
local obj = minetest.add_entity(pos, "__builtin:falling_node")
|
||||||
|
if obj then
|
||||||
|
obj:get_luaentity():set_node(node, meta or minetest.get_meta(pos):to_table())
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function check_empty(pos, dx, dy, dz)
|
||||||
|
for ndy = dy, 1 do
|
||||||
|
local p = {x = pos.x + dx, y = pos.y + ndy, z = pos.z + dz}
|
||||||
|
if not nodecore.buildable_to(p) then return end
|
||||||
|
end
|
||||||
|
return {x = pos.x + dx, y = pos.y, z = pos.z + dz}
|
||||||
|
end
|
||||||
|
function nodecore.falling_repose_check(pos)
|
||||||
|
if minetest.check_single_for_falling(pos) then return end
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
local repose = def.groups and def.groups.falling_repose
|
||||||
|
if not repose then return end
|
||||||
|
|
||||||
|
-- Reposing nodes can always sit comfortably atop
|
||||||
|
-- a non-moving node; it's only when stacked on other
|
||||||
|
-- falling nodes that they can slip off.
|
||||||
|
local sitdef = minetest.registered_items[minetest.get_node(
|
||||||
|
{x = pos.x, y = pos.y - 1, z = pos.z}).name]
|
||||||
|
if not (sitdef and sitdef.groups and sitdef.groups.falling_node)
|
||||||
|
then return end
|
||||||
|
|
||||||
|
local open = {}
|
||||||
|
local ok = check_empty(pos, 1, -repose, 0)
|
||||||
|
if ok then open[1] = ok end
|
||||||
|
ok = check_empty(pos, -1, -repose, 0)
|
||||||
|
if ok then open[#open + 1] = ok end
|
||||||
|
ok = check_empty(pos, 0, -repose, 1)
|
||||||
|
if ok then open[#open + 1] = ok end
|
||||||
|
ok = check_empty(pos, 0, -repose, -1)
|
||||||
|
if ok then open[#open + 1] = ok end
|
||||||
|
if #open < 1 then return end
|
||||||
|
return def.repose_drop(pos, open[math_random(1, #open)], node)
|
||||||
|
end
|
||||||
|
|
||||||
|
local reposeq
|
||||||
|
local qqty
|
||||||
|
local qmax = 100
|
||||||
|
local function reposeall()
|
||||||
|
for _, v in pairs(reposeq) do v() end
|
||||||
|
reposeq = nil
|
||||||
|
qqty = nil
|
||||||
|
end
|
||||||
|
nodecore.register_limited_abm({
|
||||||
|
label = "Falling Repose",
|
||||||
|
nodenames = {"group:falling_repose"},
|
||||||
|
neighbors = {"air"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 5,
|
||||||
|
action = function(pos)
|
||||||
|
if not reposeq then
|
||||||
|
reposeq = {}
|
||||||
|
qqty = 0
|
||||||
|
minetest.after(0, reposeall)
|
||||||
|
end
|
||||||
|
local f = function() nodecore.falling_repose_check(pos) end
|
||||||
|
if #reposeq > qmax then
|
||||||
|
local i = math_random(1, qqty)
|
||||||
|
if i < qmax then reposeq[i] = f end
|
||||||
|
else
|
||||||
|
reposeq[#reposeq + 1] = f
|
||||||
|
end
|
||||||
|
qqty = qqty + 1
|
||||||
|
end
|
||||||
|
})
|
|
@ -0,0 +1,196 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, math, minetest, nodecore, pairs, setmetatable, type,
|
||||||
|
vector
|
||||||
|
= ItemStack, math, minetest, nodecore, pairs, setmetatable, type,
|
||||||
|
vector
|
||||||
|
local math_floor, math_pi, math_random, math_sqrt
|
||||||
|
= math.floor, math.pi, math.random, math.sqrt
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Helpers for visible inventory. Use "visinv" node group.
|
||||||
|
Sets up on_construct, after_destruct and an ABM to manage
|
||||||
|
the visual entities.
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
-- VISIBLE STACK ENTITY
|
||||||
|
|
||||||
|
function nodecore.stackentprops(stack, yaw, rotate)
|
||||||
|
local props = {
|
||||||
|
hp_max = 1,
|
||||||
|
physical = false,
|
||||||
|
collide_with_objects = false,
|
||||||
|
collisionbox = {0, 0, 0, 0, 0, 0},
|
||||||
|
visual = "wielditem",
|
||||||
|
visual_size = {x = 0.4, y = 0.4 },
|
||||||
|
textures = {""},
|
||||||
|
spritediv = {x = 1, y = 1},
|
||||||
|
initial_sprite_basepos = {x = 0, y = 0},
|
||||||
|
is_visible = false,
|
||||||
|
static_save = false
|
||||||
|
}
|
||||||
|
local scale = 0
|
||||||
|
yaw = yaw or 0
|
||||||
|
if stack then
|
||||||
|
if type(stack) == "string" then stack = ItemStack(stack) end
|
||||||
|
props.is_visible = not stack:is_empty()
|
||||||
|
props.textures[1] = stack:get_name()
|
||||||
|
|
||||||
|
local ratio = stack:get_count() / stack:get_stack_max()
|
||||||
|
scale = math_sqrt(ratio) * 0.15 + 0.25
|
||||||
|
props.visual_size = {x = scale, y = scale}
|
||||||
|
|
||||||
|
props.automatic_rotate = rotate
|
||||||
|
and rotate * 2 / math_sqrt(math_sqrt(ratio)) or nil
|
||||||
|
|
||||||
|
if ratio == 1 then ratio = 1 - (stack:get_wear() / 65536) end
|
||||||
|
|
||||||
|
if ratio ~= 1 then yaw = yaw + 1/8 + 3/8 * (1 - ratio) end
|
||||||
|
yaw = yaw - 2 * math_floor(yaw / 2)
|
||||||
|
end
|
||||||
|
return props, scale, yaw * math_pi / 2
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_entity(modname .. ":stackent", {
|
||||||
|
initial_properties = nodecore.stackentprops(),
|
||||||
|
is_stack = true,
|
||||||
|
itemcheck = function(self)
|
||||||
|
local pos = self.object:get_pos()
|
||||||
|
local stack = nodecore.stack_get(pos)
|
||||||
|
if not stack or stack:is_empty() then return self.object:remove() end
|
||||||
|
|
||||||
|
local rp = vector.round(pos)
|
||||||
|
local props, scale, yaw = nodecore.stackentprops(stack,
|
||||||
|
rp.x * 3 + rp.y * 5 + rp.z * 7)
|
||||||
|
rp.y = rp.y + scale - 31/64
|
||||||
|
|
||||||
|
local obj = self.object
|
||||||
|
obj:set_properties(props)
|
||||||
|
obj:set_yaw(yaw)
|
||||||
|
obj:set_pos(rp)
|
||||||
|
end,
|
||||||
|
on_activate = function(self)
|
||||||
|
self.cktime = 0.00001
|
||||||
|
end,
|
||||||
|
on_step = function(self, dtime)
|
||||||
|
self.cktime = (self.cktime or 0) - dtime
|
||||||
|
if self.cktime > 0 then return end
|
||||||
|
self.cktime = 1
|
||||||
|
return self:itemcheck()
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
function nodecore.visinv_update_ents(pos, node)
|
||||||
|
node = node or minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
local max = def.groups and def.groups.visinv and 1 or 0
|
||||||
|
|
||||||
|
local found = {}
|
||||||
|
for _, v in pairs(minetest.get_objects_inside_radius(pos, 0.5)) do
|
||||||
|
if v and v.get_luaentity and v:get_luaentity()
|
||||||
|
and v:get_luaentity().is_stack then
|
||||||
|
found[#found + 1] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #found < max then
|
||||||
|
minetest.add_entity(pos, modname .. ":stackent")
|
||||||
|
else
|
||||||
|
while #found > max do
|
||||||
|
found[#found]:remove()
|
||||||
|
found[#found] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return found
|
||||||
|
end
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
-- ITEM ENT APPEARANCE
|
||||||
|
|
||||||
|
local bii = minetest.registered_entities["__builtin:item"]
|
||||||
|
local item = {
|
||||||
|
set_item = function(self, ...)
|
||||||
|
local realobj = self.object
|
||||||
|
self.object = {}
|
||||||
|
setmetatable(self.object, {
|
||||||
|
__index = {
|
||||||
|
set_properties = function() end
|
||||||
|
}
|
||||||
|
})
|
||||||
|
bii.set_item(self, ...)
|
||||||
|
self.object = realobj
|
||||||
|
|
||||||
|
self.rotdir = self.rotdir or math_random(1, 2) * 2 - 3
|
||||||
|
local p, s = nodecore.stackentprops(self.itemstring, 0, self.rotdir)
|
||||||
|
p.physical = true
|
||||||
|
s = s / math_sqrt(2)
|
||||||
|
p.collisionbox = {-s, -s, -s, s, s, s}
|
||||||
|
return realobj:set_properties(p)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
setmetatable(item, bii)
|
||||||
|
minetest.register_entity(":__builtin:item", item)
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
-- NODE REGISTRATION HELPERS
|
||||||
|
|
||||||
|
function nodecore.visinv_on_construct(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("solo", 1)
|
||||||
|
nodecore.visinv_update_ents(pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.visinv_after_destruct(pos)
|
||||||
|
nodecore.visinv_update_ents(pos)
|
||||||
|
nodecore.fallcheck(pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(_, def)
|
||||||
|
if def.type ~= "node" then return end
|
||||||
|
|
||||||
|
def.groups = def.groups or {}
|
||||||
|
|
||||||
|
if def.groups.visinv then
|
||||||
|
def.on_construct = def.on_construct or nodecore.visinv_on_construct
|
||||||
|
def.after_destruct = def.after_destruct or nodecore.visinv_after_destruct
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
nodecore.register_limited_abm({
|
||||||
|
label = "VisInv Check",
|
||||||
|
nodenames = {"group:visinv"},
|
||||||
|
interval = 1,
|
||||||
|
chance = 1,
|
||||||
|
action = function(...) return nodecore.visinv_update_ents(...) end
|
||||||
|
})
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
-- DIG INVENTORY
|
||||||
|
|
||||||
|
local digpos
|
||||||
|
local old_node_dig = minetest.node_dig
|
||||||
|
minetest.node_dig = function(pos, ...)
|
||||||
|
nodecore.stack_sounds(pos, "dug")
|
||||||
|
local function helper(...)
|
||||||
|
digpos = nil
|
||||||
|
return ...
|
||||||
|
end
|
||||||
|
digpos = pos
|
||||||
|
return helper(old_node_dig(pos, ...))
|
||||||
|
end
|
||||||
|
local old_get_node_drops = minetest.get_node_drops
|
||||||
|
minetest.get_node_drops = function(...)
|
||||||
|
local drops = old_get_node_drops(...)
|
||||||
|
if not digpos then return drops end
|
||||||
|
drops = drops or {}
|
||||||
|
local stack = nodecore.stack_get(digpos)
|
||||||
|
if stack and not stack:is_empty() then
|
||||||
|
drops[#drops + 1] = stack
|
||||||
|
end
|
||||||
|
return drops
|
||||||
|
end
|
|
@ -0,0 +1,14 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, pairs
|
||||||
|
= minetest, nodecore, pairs
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(name, def)
|
||||||
|
if def.oldnames then
|
||||||
|
for _, v in pairs(def.oldnames) do
|
||||||
|
if not minetest.registered_items[v] then
|
||||||
|
minetest.register_alias(v, name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1,17 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ipairs, minetest, nodecore
|
||||||
|
= ipairs, minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.register_on_register_item,
|
||||||
|
nodecore.registered_on_register_item
|
||||||
|
= nodecore.mkreg()
|
||||||
|
|
||||||
|
local oldreg = minetest.register_item
|
||||||
|
function minetest.register_item(name, def, ...)
|
||||||
|
for _, v in ipairs(nodecore.registered_on_register_item) do
|
||||||
|
local x = v(name, def, ...)
|
||||||
|
if x then return x end
|
||||||
|
end
|
||||||
|
return oldreg(name, def, ...)
|
||||||
|
end
|
|
@ -0,0 +1,40 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore
|
||||||
|
= minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local lasthit = {}
|
||||||
|
|
||||||
|
minetest.register_on_punchnode(function(pos, node, puncher)
|
||||||
|
if not puncher then return end
|
||||||
|
local pname = puncher:get_player_name()
|
||||||
|
local now = minetest.get_us_time() / 1000000
|
||||||
|
local last = lasthit[pname] or 0
|
||||||
|
if now - last < 0.25 then return end
|
||||||
|
lasthit[pname] = now
|
||||||
|
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
local wield = puncher:get_wielded_item()
|
||||||
|
if (not def.sounds) or (not def.groups)
|
||||||
|
or (not nodecore.toolspeed(wield, def.groups)) then
|
||||||
|
nodecore.node_sound(pos, "dig")
|
||||||
|
else
|
||||||
|
nodecore.node_sound(pos, "dig",
|
||||||
|
{except = puncher})
|
||||||
|
end
|
||||||
|
|
||||||
|
if wield:get_wear() >= (65536 * 0.95) then
|
||||||
|
minetest.sound_play("nc_api_toolwear",
|
||||||
|
{object = puncher, gain = 0.5})
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_dignode(function(pos, node, digger)
|
||||||
|
return nodecore.node_sound(pos, "dug",
|
||||||
|
{node = node, except = digger})
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_placenode(function(pos, node, placer)
|
||||||
|
return nodecore.node_sound(pos, "place",
|
||||||
|
{node = node, except = placer})
|
||||||
|
end)
|
|
@ -0,0 +1,11 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local nodecore
|
||||||
|
= nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(_, def)
|
||||||
|
if def.type == "tool" then
|
||||||
|
def.sound = def.sound or {}
|
||||||
|
def.sound.breaks = def.sound.breaks or {name = "nc_api_toolbreak", gain = 1}
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1,20 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, minetest, nodecore
|
||||||
|
= ItemStack, minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.register_on_register_item(function(_, def)
|
||||||
|
if def.tool_wears_to then
|
||||||
|
def.after_use = def.after_use or function(what, who, _, dp)
|
||||||
|
what:add_wear(dp.wear)
|
||||||
|
if what:get_count() == 0 then
|
||||||
|
if def.sound and def.sound.breaks then
|
||||||
|
minetest.sound_play(def.sound.breaks,
|
||||||
|
{object = who, gain = 0.5})
|
||||||
|
end
|
||||||
|
return ItemStack(def.tool_wears_to)
|
||||||
|
end
|
||||||
|
return what
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1,4 @@
|
||||||
|
# textdomain: nc_api
|
||||||
|
(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>=(C)2018-2019 から Aaron Suen <warr1024@@gmail.com>
|
||||||
|
(and 1 more hint)=(さらに1つのヒント)
|
||||||
|
(and @1 more hints)=(さらに@1つのヒント)
|
|
@ -0,0 +1,145 @@
|
||||||
|
# textdomain: nc_api
|
||||||
|
(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>=(C)2018-2019 por Aaron Suen <war1024@@gmail.com>
|
||||||
|
(and 1 more hint)=( e mais 1 dica)
|
||||||
|
(and @1 more hints)=(e mais @1 dicas)
|
||||||
|
- Crafting is done by building recipes in-world.=- A Criação de Itens é feita construindo as receitas pelo mundo.
|
||||||
|
- If a recipe exists, you will see a special particle effect.=- Se uma receita existe, você verá um efeito especial de partícula sair do node.
|
||||||
|
- Items picked up try to fit into the current selected slot first.=- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado.
|
||||||
|
- Order and specific face of placement may matter for crafting.=- A ordem e a face em que os itens são colocados pode importar no processo de criação.
|
||||||
|
- Recipes are time-based, punching faster does not speed up.=- Receitas são cronometradas, bater mais forte não afetará a velocidade delas.
|
||||||
|
- Sneak+drop to count out single items from stack.=- Use os comandos de agachar e soltar juntos para soltar um só item.
|
||||||
|
- Some recipes require "pummeling" a node.=- Algumas receitas necessitam que você "esmurre" um node.
|
||||||
|
- Stacks may be pummeled, exact item count may matter.=- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item.
|
||||||
|
- There is NO inventory screen.=- NÃO EXISTE tela de inventário.
|
||||||
|
- To pummel, punch a node repeatedly, WITHOUT digging.=- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO.
|
||||||
|
- Wielded item, target face, and surrounding nodes may matter.=- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo.
|
||||||
|
- You do not have to punch very fast (about 1 per second).=- Você não precisa bater muito rápido(basta 1 batida por segundo).
|
||||||
|
About=Sobre
|
||||||
|
Active Lens=Lente Ativa
|
||||||
|
Active Prism=Prisma Ativo
|
||||||
|
Aggregate=Agregar
|
||||||
|
Air=Ar
|
||||||
|
Annealed Lode=Veio Mineral Recozido
|
||||||
|
Annealed Lode Bar=Barra de Veio Mineral Recozida
|
||||||
|
Annealed Lode Hatchet=Machado de Veio Mineral Recozida
|
||||||
|
Annealed Lode Hatchet Head=Cabeça de Machado de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mallet=Marreta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mallet Head=Cabeça de Marreta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mattock=Enxada de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mattock Head=Cabeça de Enxada de Veio Mineral Recozida
|
||||||
|
Annealed Lode Pick=Picareta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Pick Head=Cabeça de Picareta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Prill=Lascas de Veio Mineral Recozida
|
||||||
|
Annealed Lode Rod=Vara de Veio Mineral Recozida
|
||||||
|
Annealed Lode Spade=Pá de Veio Mineral Recozida
|
||||||
|
Annealed Lode Spade Head=Cabeça de Pá de Veio Mineral Recozida
|
||||||
|
Ash=Cinza
|
||||||
|
Ash Lump=Nódulo de Cinzas
|
||||||
|
Burning Embers=Brasa Quente
|
||||||
|
Charcoal=Carvão Vegetal
|
||||||
|
Charcoal Lump=Nódulo de Carvão Vegetal
|
||||||
|
Chromatic Glass=Vidro Cromático
|
||||||
|
Clear Glass=Vidro Transparente
|
||||||
|
Cobble=Pedregulho
|
||||||
|
Cobble Hinged Panel=Painel de Pedregulho Articulado
|
||||||
|
Cobble Panel=Painel de Pedregulho
|
||||||
|
Crude Glass=Vidro Bruto
|
||||||
|
DEVELOPMENT VERSION=VERSÃO EM DESENVOLVIMENTO
|
||||||
|
Dirt=Terra
|
||||||
|
Eggcorn=Semente de Carvalho
|
||||||
|
Fire=Fogo
|
||||||
|
Float Glass=Vidro Float
|
||||||
|
Glowing Lode=Veio Mineral Incandescente
|
||||||
|
Glowing Lode Bar=Barra de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Hatchet=Machado de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Hatchet Head=Cabeça de Machado Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mallet=Marreta de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mallet Head=Cabeça de Marreta Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mattock=Enxada de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mattock Head=Cabeça de Enxada Veio Mineral Incandescente
|
||||||
|
Glowing Lode Pick=Picareta de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Pick Head=Cabeça de Picareta de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Prill=Lascas de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Rod=Vara de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Spade=Pá de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Spade Head=Cabeça de Pá Veio Mineral Incandescente
|
||||||
|
Grass=Grama
|
||||||
|
Gravel=Cascalho
|
||||||
|
Hints=Dicas
|
||||||
|
Ignore=Ignorar
|
||||||
|
Injury=Ferir
|
||||||
|
Inventory=Inventário
|
||||||
|
Leaves=Folhas
|
||||||
|
Lens=Lente
|
||||||
|
Living Sponge=Esponja Viva
|
||||||
|
Lode Cobble=Veio de Pedregulho
|
||||||
|
Lode Ore=Veio Mineral
|
||||||
|
Loose Cobble=Pedregulho Solta
|
||||||
|
Loose Dirt=Terra Solta
|
||||||
|
Loose Gravel=Cascalho Solto
|
||||||
|
Loose Leaves=Folhas Soltas
|
||||||
|
Loose Lode Cobble=Veio de Pedregulho Solto
|
||||||
|
Loose Sand=Areia Solta
|
||||||
|
Molten Glass=Vidro Derretido
|
||||||
|
Molten Rock=Pedra Derretida
|
||||||
|
Player's Guide: Inventory Management=Guia do Jogador: Gerenciamento de Inventário
|
||||||
|
Player's Guide: Pummeling Recipes=Guia do Jogador: Receitas por Esmurrada
|
||||||
|
Prism=Prisma
|
||||||
|
Progress: @1 complete, @2 current, @3 future=Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)
|
||||||
|
Pummel=Esmurrar
|
||||||
|
Sand=Areia
|
||||||
|
See included LICENSE file for full details and credits=Veja o arquivo de LICENSA incluso para créditos e maiores detalhes
|
||||||
|
Shining Lens=Lente Brilhante
|
||||||
|
Sponge=Esponja
|
||||||
|
Staff=Bastão
|
||||||
|
Stick=Graveto
|
||||||
|
Stone=Pedra
|
||||||
|
Stone Chip=Pedaço de Pedra
|
||||||
|
Stone-Tipped Hatchet=Machado com Ponta de Pedra
|
||||||
|
Stone-Tipped Mallet=Marreta com Ponta de Pedra
|
||||||
|
Stone-Tipped Pick=Picareta com Ponta de Pedra
|
||||||
|
Stone-Tipped Spade=Pá com Ponta de Pedra
|
||||||
|
Stump=Toco
|
||||||
|
Tempered Lode=Veio Mineral Temperado
|
||||||
|
Tempered Lode Bar=Barra de Veio Mineral Temperado
|
||||||
|
Tempered Lode Hatchet=Machado de Veio Mineral Temperado
|
||||||
|
Tempered Lode Hatchet Head=Cabeça de Machado de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mallet=Marreta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mallet Head=Cabeça de Marreta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mattock=Enxada de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mattock Head=Cabeça de Enxada de Veio Mineral Temperado
|
||||||
|
Tempered Lode Pick=Picareta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Pick Head=Cabeça de Picareta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Prill=Lascas de Veio Mineral Temperado
|
||||||
|
Tempered Lode Rod=Vara de Veio Mineral Temperado
|
||||||
|
Tempered Lode Spade=Pá de Veio Mineral Temperado
|
||||||
|
Tempered Lode Spade Head=Cabeça de Enxada de Veio Mineral Temperado
|
||||||
|
Tote (1 Slot)=Bolsa (1 Compartimento)
|
||||||
|
Tote (2 Slots)=Bolsa (2 Compartimentos)
|
||||||
|
Tote (3 Slots)=Bolsa (3 Compartimentos)
|
||||||
|
Tote (4 Slots)=Bolsa (4 Compartimentos)
|
||||||
|
Tote (5 Slots)=Bolsa (5 Compartimentos)
|
||||||
|
Tote (6 Slots)=Bolsa (6 Compartimentos)
|
||||||
|
Tote (7 Slots)=Bolsa (7 Compartimentos)
|
||||||
|
Tote (8 Slots)=Bolsa (8 Compartimentos)
|
||||||
|
Tote Handle=Alça de Bolsa
|
||||||
|
Tree Trunk=Tronco de Árvore
|
||||||
|
Unknown Item=Item Desconhecido
|
||||||
|
Water=Água
|
||||||
|
Wet Aggregate=Massa Úmida
|
||||||
|
Wet Sponge=Esponja Molhada
|
||||||
|
Wooden Adze=Enxó de Madeira
|
||||||
|
Wooden Frame=Estrutura de Madeira
|
||||||
|
Wooden Hatchet=Machado de Madeira
|
||||||
|
Wooden Hatchet Head=Cabeça de Machado de Madeira
|
||||||
|
Wooden Hinged Panel=Painel Articulado de Madeira
|
||||||
|
Wooden Ladder=Escada de Madeira
|
||||||
|
Wooden Mallet=Marreta de Madeira
|
||||||
|
Wooden Mallet Head=Cabeça de Marreta de Madeira
|
||||||
|
Wooden Panel=Painel de Madeira
|
||||||
|
Wooden Pick=Picareta de Madeira
|
||||||
|
Wooden Pick Head=Cabeça de Picareta de Madeira
|
||||||
|
Wooden Plank=Tábua de Madeira
|
||||||
|
Wooden Shelf=Estante de Madeira
|
||||||
|
Wooden Spade=Pá de Madeira
|
||||||
|
Wooden Spade Head=Cabeça de Pá de Madeira
|
|
@ -0,0 +1,143 @@
|
||||||
|
# textdomain: nc_api
|
||||||
|
(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>=(C)2018-2019 por Aaron Suen <war1024@@gmail.com>
|
||||||
|
- Crafting is done by building recipes in-world.=- A Criação de Itens é feita construindo as receitas pelo mundo.
|
||||||
|
- If a recipe exists, you will see a special particle effect.=- Se uma receita existe, você verá um efeito especial de partícula sair do node.
|
||||||
|
- Items picked up try to fit into the current selected slot first.=- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado.
|
||||||
|
- Order and specific face of placement may matter for crafting.=- A ordem e a face em que os itens são colocados pode importar no processo de criação.
|
||||||
|
- Recipes are time-based, punching faster does not speed up.=- Receitas são cronometradas, bater mais forte não afetará a velocidade delas.
|
||||||
|
- Sneak+drop to count out single items from stack.=- Use os comandos de agachar e soltar juntos para soltar um só item.
|
||||||
|
- Some recipes require "pummeling" a node.=- Algumas receitas necessitam que você "esmurre" um node.
|
||||||
|
- Stacks may be pummeled, exact item count may matter.=- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item.
|
||||||
|
- There is NO inventory screen.=- NÃO EXISTE tela de inventário.
|
||||||
|
- To pummel, punch a node repeatedly, WITHOUT digging.=- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO.
|
||||||
|
- Wielded item, target face, and surrounding nodes may matter.=- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo.
|
||||||
|
- You do not have to punch very fast (about 1 per second).=- Você não precisa bater muito rápido(basta 1 batida por segundo).
|
||||||
|
About=Sobre
|
||||||
|
Active Lens=Lente Ativa
|
||||||
|
Active Prism=Prisma Ativo
|
||||||
|
Aggregate=Agregar
|
||||||
|
Air=Ar
|
||||||
|
Annealed Lode=Veio Mineral Recozido
|
||||||
|
Annealed Lode Bar=Barra de Veio Mineral Recozida
|
||||||
|
Annealed Lode Hatchet=Machado de Veio Mineral Recozida
|
||||||
|
Annealed Lode Hatchet Head=Cabeça de Machado de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mallet=Marreta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mallet Head=Cabeça de Marreta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mattock=Enxada de Veio Mineral Recozida
|
||||||
|
Annealed Lode Mattock Head=Cabeça de Enxada de Veio Mineral Recozida
|
||||||
|
Annealed Lode Pick=Picareta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Pick Head=Cabeça de Picareta de Veio Mineral Recozida
|
||||||
|
Annealed Lode Prill=Lascas de Veio Mineral Recozida
|
||||||
|
Annealed Lode Rod=Vara de Veio Mineral Recozida
|
||||||
|
Annealed Lode Spade=Pá de Veio Mineral Recozida
|
||||||
|
Annealed Lode Spade Head=Cabeça de Pá de Veio Mineral Recozida
|
||||||
|
Ash=Cinza
|
||||||
|
Ash Lump=Nódulo de Cinzas
|
||||||
|
Burning Embers=Brasa Quente
|
||||||
|
Charcoal=Carvão Vegetal
|
||||||
|
Charcoal Lump=Nódulo de Carvão Vegetal
|
||||||
|
Chromatic Glass=Vidro Cromático
|
||||||
|
Clear Glass=Vidro Transparente
|
||||||
|
Cobble=Pedregulho
|
||||||
|
Cobble Hinged Panel=Painel de Pedregulho Articulado
|
||||||
|
Cobble Panel=Painel de Pedregulho
|
||||||
|
Crude Glass=Vidro Bruto
|
||||||
|
DEVELOPMENT VERSION=VERSÃO EM DESENVOLVIMENTO
|
||||||
|
Dirt=Terra
|
||||||
|
Eggcorn=Semente de Carvalho
|
||||||
|
Fire=Fogo
|
||||||
|
Float Glass=Vidro Float
|
||||||
|
Glowing Lode=Veio Mineral Incandescente
|
||||||
|
Glowing Lode Bar=Barra de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Hatchet=Machado de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Hatchet Head=Cabeça de Machado Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mallet=Marreta de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mallet Head=Cabeça de Marreta Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mattock=Enxada de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Mattock Head=Cabeça de Enxada Veio Mineral Incandescente
|
||||||
|
Glowing Lode Pick=Picareta de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Pick Head=Cabeça de Picareta de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Prill=Lascas de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Rod=Vara de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Spade=Pá de Veio Mineral Incandescente
|
||||||
|
Glowing Lode Spade Head=Cabeça de Pá Veio Mineral Incandescente
|
||||||
|
Grass=Grama
|
||||||
|
Gravel=Cascalho
|
||||||
|
Hints=Dicas
|
||||||
|
Ignore=Ignorar
|
||||||
|
Injury=Ferir
|
||||||
|
Inventory=Inventário
|
||||||
|
Leaves=Folhas
|
||||||
|
Lens=Lente
|
||||||
|
Living Sponge=Esponja Viva
|
||||||
|
Lode Cobble=Veio de Pedregulho
|
||||||
|
Lode Ore=Veio Mineral
|
||||||
|
Loose Cobble=Pedregulho Solta
|
||||||
|
Loose Dirt=Terra Solta
|
||||||
|
Loose Gravel=Cascalho Solto
|
||||||
|
Loose Leaves=Folhas Soltas
|
||||||
|
Loose Lode Cobble=Veio de Pedregulho Solto
|
||||||
|
Loose Sand=Areia Solta
|
||||||
|
Molten Glass=Vidro Derretido
|
||||||
|
Molten Rock=Pedra Derretida
|
||||||
|
Player's Guide: Inventory Management=Guia do Jogador: Gerenciamento de Inventário
|
||||||
|
Player's Guide: Pummeling Recipes=Guia do Jogador: Receitas por Esmurrada
|
||||||
|
Prism=Prisma
|
||||||
|
Progress: @1 complete, @2 current, @3 future=Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)
|
||||||
|
Pummel=Esmurrar
|
||||||
|
Sand=Areia
|
||||||
|
See included LICENSE file for full details and credits=Veja o arquivo de LICENSA incluso para créditos e maiores detalhes
|
||||||
|
Shining Lens=Lente Brilhante
|
||||||
|
Sponge=Esponja
|
||||||
|
Staff=Bastão
|
||||||
|
Stick=Graveto
|
||||||
|
Stone=Pedra
|
||||||
|
Stone Chip=Pedaço de Pedra
|
||||||
|
Stone-Tipped Hatchet=Machado com Ponta de Pedra
|
||||||
|
Stone-Tipped Mallet=Marreta com Ponta de Pedra
|
||||||
|
Stone-Tipped Pick=Picareta com Ponta de Pedra
|
||||||
|
Stone-Tipped Spade=Pá com Ponta de Pedra
|
||||||
|
Stump=Toco
|
||||||
|
Tempered Lode=Veio Mineral Temperado
|
||||||
|
Tempered Lode Bar=Barra de Veio Mineral Temperado
|
||||||
|
Tempered Lode Hatchet=Machado de Veio Mineral Temperado
|
||||||
|
Tempered Lode Hatchet Head=Cabeça de Machado de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mallet=Marreta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mallet Head=Cabeça de Marreta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mattock=Enxada de Veio Mineral Temperado
|
||||||
|
Tempered Lode Mattock Head=Cabeça de Enxada de Veio Mineral Temperado
|
||||||
|
Tempered Lode Pick=Picareta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Pick Head=Cabeça de Picareta de Veio Mineral Temperado
|
||||||
|
Tempered Lode Prill=Lascas de Veio Mineral Temperado
|
||||||
|
Tempered Lode Rod=Vara de Veio Mineral Temperado
|
||||||
|
Tempered Lode Spade=Pá de Veio Mineral Temperado
|
||||||
|
Tempered Lode Spade Head=Cabeça de Enxada de Veio Mineral Temperado
|
||||||
|
Tote (1 Slot)=Bolsa (1 Compartimento)
|
||||||
|
Tote (2 Slots)=Bolsa (2 Compartimentos)
|
||||||
|
Tote (3 Slots)=Bolsa (3 Compartimentos)
|
||||||
|
Tote (4 Slots)=Bolsa (4 Compartimentos)
|
||||||
|
Tote (5 Slots)=Bolsa (5 Compartimentos)
|
||||||
|
Tote (6 Slots)=Bolsa (6 Compartimentos)
|
||||||
|
Tote (7 Slots)=Bolsa (7 Compartimentos)
|
||||||
|
Tote (8 Slots)=Bolsa (8 Compartimentos)
|
||||||
|
Tote Handle=Alça de Bolsa
|
||||||
|
Tree Trunk=Tronco de Árvore
|
||||||
|
Unknown Item=Item Desconhecido
|
||||||
|
Water=Água
|
||||||
|
Wet Aggregate=Massa Úmida
|
||||||
|
Wet Sponge=Esponja Molhada
|
||||||
|
Wooden Adze=Enxó de Madeira
|
||||||
|
Wooden Frame=Estrutura de Madeira
|
||||||
|
Wooden Hatchet=Machado de Madeira
|
||||||
|
Wooden Hatchet Head=Cabeça de Machado de Madeira
|
||||||
|
Wooden Hinged Panel=Painel Articulado de Madeira
|
||||||
|
Wooden Ladder=Escada de Madeira
|
||||||
|
Wooden Mallet=Marreta de Madeira
|
||||||
|
Wooden Mallet Head=Cabeça de Marreta de Madeira
|
||||||
|
Wooden Panel=Painel de Madeira
|
||||||
|
Wooden Pick=Picareta de Madeira
|
||||||
|
Wooden Pick Head=Cabeça de Picareta de Madeira
|
||||||
|
Wooden Plank=Tábua de Madeira
|
||||||
|
Wooden Shelf=Estante de Madeira
|
||||||
|
Wooden Spade=Pá de Madeira
|
||||||
|
Wooden Spade Head=Cabeça de Pá de Madeira
|
|
@ -0,0 +1,2 @@
|
||||||
|
update:
|
||||||
|
cd .. && perl -w src/update.pl
|
|
@ -0,0 +1,771 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-10-04 22:56+0000\n"
|
||||||
|
"PO-Revision-Date: 2019-10-04 22:56+0000\n"
|
||||||
|
"Last-Translator: Weblate Admin <warr1024@gmail.com>\n"
|
||||||
|
"Language-Team: English <http://nodecore.mine.nu/trans/projects/nodecore/core/"
|
||||||
|
"en/>\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: Weblate 3.8\n"
|
||||||
|
|
||||||
|
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
|
||||||
|
msgstr "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
|
||||||
|
|
||||||
|
msgid "(and 1 more hint)"
|
||||||
|
msgstr "(and 1 more hint)"
|
||||||
|
|
||||||
|
msgid "(and @1 more hints)"
|
||||||
|
msgstr "(and @1 more hints)"
|
||||||
|
|
||||||
|
msgid "- "Furnaces" are not a thing; discover smelting with open flames."
|
||||||
|
msgstr "- "Furnaces" are not a thing; discover smelting with open flames."
|
||||||
|
|
||||||
|
msgid "- "Torches" are not a thing; use fire as your first light source."
|
||||||
|
msgstr "[REMOVED]"
|
||||||
|
|
||||||
|
msgid "- @1"
|
||||||
|
msgstr "- @1"
|
||||||
|
|
||||||
|
msgid "- Can't dig trees or grass? Search for sticks in the canopy."
|
||||||
|
msgstr "- Can't dig trees or grass? Search for sticks in the canopy."
|
||||||
|
|
||||||
|
msgid "- Crafting is done by building recipes in-world."
|
||||||
|
msgstr "- Crafting is done by building recipes in-world."
|
||||||
|
|
||||||
|
msgid "- DONE: @1"
|
||||||
|
msgstr "- DONE: @1"
|
||||||
|
|
||||||
|
msgid "- Drop items onto ground to create stack nodes. They do not decay."
|
||||||
|
msgstr "- Drop items onto ground to create stack nodes. They do not decay."
|
||||||
|
|
||||||
|
msgid "- If a recipe exists, you will see a special particle effect."
|
||||||
|
msgstr "- If a recipe exists, you will see a special particle effect."
|
||||||
|
|
||||||
|
msgid "- Items picked up try to fit into the current selected slot first."
|
||||||
|
msgstr "- Items picked up try to fit into the current selected slot first."
|
||||||
|
|
||||||
|
msgid "- Order and specific face of placement may matter for crafting."
|
||||||
|
msgstr "- Order and specific face of placement may matter for crafting."
|
||||||
|
|
||||||
|
msgid "- Ores may be hidden, but revealed by subtle clues in terrain."
|
||||||
|
msgstr "- Ores may be hidden, but revealed by subtle clues in terrain."
|
||||||
|
|
||||||
|
msgid "- Recipes are time-based, punching faster does not speed up."
|
||||||
|
msgstr "- Recipes are time-based, punching faster does not speed up."
|
||||||
|
|
||||||
|
msgid "- Sneak+drop to count out single items from stack."
|
||||||
|
msgstr "- Sneak+drop to count out single items from stack."
|
||||||
|
|
||||||
|
msgid "- Some recipes require "pummeling" a node."
|
||||||
|
msgstr "- Some recipes require "pummeling" a node."
|
||||||
|
|
||||||
|
msgid "- Stacks may be pummeled, exact item count may matter."
|
||||||
|
msgstr "- Stacks may be pummeled, exact item count may matter."
|
||||||
|
|
||||||
|
msgid "- Stuck in a pit? Pummel surfaces barehanded to find places to climb."
|
||||||
|
msgstr "- Stuck in a pit? Pummel surfaces barehanded to find places to climb."
|
||||||
|
|
||||||
|
msgid "- The game is challenging by design, sometimes frustrating. DON'T GIVE UP!"
|
||||||
|
msgstr "- The game is challenging by design, sometimes frustrating. DON'T GIVE UP!"
|
||||||
|
|
||||||
|
msgid "- There is NO inventory screen."
|
||||||
|
msgstr "- There is NO inventory screen."
|
||||||
|
|
||||||
|
msgid "- To pummel, punch a node repeatedly, WITHOUT digging."
|
||||||
|
msgstr "- To pummel, punch a node repeatedly, WITHOUT digging."
|
||||||
|
|
||||||
|
msgid "- Trouble lighting a fire? Try using longer sticks, more tinder."
|
||||||
|
msgstr "- Trouble lighting a fire? Try using longer sticks, more tinder."
|
||||||
|
|
||||||
|
msgid "- Wielded item, target face, and surrounding nodes may matter."
|
||||||
|
msgstr "- Wielded item, target face, and surrounding nodes may matter."
|
||||||
|
|
||||||
|
msgid "- You do not have to punch very fast (about 1 per second)."
|
||||||
|
msgstr "- You do not have to punch very fast (about 1 per second)."
|
||||||
|
|
||||||
|
msgid "About"
|
||||||
|
msgstr "About"
|
||||||
|
|
||||||
|
msgid "Active Lens"
|
||||||
|
msgstr "Active Lens"
|
||||||
|
|
||||||
|
msgid "Active Prism"
|
||||||
|
msgstr "Active Prism"
|
||||||
|
|
||||||
|
msgid "Aggregate"
|
||||||
|
msgstr "Aggregate"
|
||||||
|
|
||||||
|
msgid "Air"
|
||||||
|
msgstr "Air"
|
||||||
|
|
||||||
|
msgid "Annealed Lode"
|
||||||
|
msgstr "Annealed Lode"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Bar"
|
||||||
|
msgstr "Annealed Lode Bar"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Hatchet"
|
||||||
|
msgstr "Annealed Lode Hatchet"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Hatchet Head"
|
||||||
|
msgstr "Annealed Lode Hatchet Head"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mallet"
|
||||||
|
msgstr "Annealed Lode Mallet"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mallet Head"
|
||||||
|
msgstr "Annealed Lode Mallet Head"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mattock"
|
||||||
|
msgstr "Annealed Lode Mattock"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mattock Head"
|
||||||
|
msgstr "Annealed Lode Mattock Head"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Pick"
|
||||||
|
msgstr "Annealed Lode Pick"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Pick Head"
|
||||||
|
msgstr "Annealed Lode Pick Head"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Prill"
|
||||||
|
msgstr "Annealed Lode Prill"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Rod"
|
||||||
|
msgstr "Annealed Lode Rod"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Spade"
|
||||||
|
msgstr "Annealed Lode Spade"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Spade Head"
|
||||||
|
msgstr "Annealed Lode Spade Head"
|
||||||
|
|
||||||
|
msgid "Ash"
|
||||||
|
msgstr "Ash"
|
||||||
|
|
||||||
|
msgid "Ash Lump"
|
||||||
|
msgstr "Ash Lump"
|
||||||
|
|
||||||
|
msgid "Burning Embers"
|
||||||
|
msgstr "Burning Embers"
|
||||||
|
|
||||||
|
msgid "Charcoal"
|
||||||
|
msgstr "Charcoal"
|
||||||
|
|
||||||
|
msgid "Charcoal Lump"
|
||||||
|
msgstr "Charcoal Lump"
|
||||||
|
|
||||||
|
msgid "Chromatic Glass"
|
||||||
|
msgstr "Chromatic Glass"
|
||||||
|
|
||||||
|
msgid "Clear Glass"
|
||||||
|
msgstr "Clear Glass"
|
||||||
|
|
||||||
|
msgid "Cobble"
|
||||||
|
msgstr "Cobble"
|
||||||
|
|
||||||
|
msgid "Cobble Hinged Panel"
|
||||||
|
msgstr "Cobble Hinged Panel"
|
||||||
|
|
||||||
|
msgid "Cobble Panel"
|
||||||
|
msgstr "Cobble Panel"
|
||||||
|
|
||||||
|
msgid "Crude Glass"
|
||||||
|
msgstr "Crude Glass"
|
||||||
|
|
||||||
|
msgid "DEVELOPMENT VERSION"
|
||||||
|
msgstr "DEVELOPMENT VERSION"
|
||||||
|
|
||||||
|
msgid "Dirt"
|
||||||
|
msgstr "Dirt"
|
||||||
|
|
||||||
|
msgid "Discord: https://discord.gg/SHq2tkb"
|
||||||
|
msgstr "Discord: https://discord.gg/SHq2tkb"
|
||||||
|
|
||||||
|
msgid "Eggcorn"
|
||||||
|
msgstr "Eggcorn"
|
||||||
|
|
||||||
|
msgid "Fire"
|
||||||
|
msgstr "Fire"
|
||||||
|
|
||||||
|
msgid "Float Glass"
|
||||||
|
msgstr "Float Glass"
|
||||||
|
|
||||||
|
msgid "GitLab: https://gitlab.com/sztest/nodecore"
|
||||||
|
msgstr "GitLab: https://gitlab.com/sztest/nodecore"
|
||||||
|
|
||||||
|
msgid "Glowing Lode"
|
||||||
|
msgstr "Glowing Lode"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Bar"
|
||||||
|
msgstr "Glowing Lode Bar"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Hatchet"
|
||||||
|
msgstr "Glowing Lode Hatchet"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Hatchet Head"
|
||||||
|
msgstr "Glowing Lode Hatchet Head"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mallet"
|
||||||
|
msgstr "Glowing Lode Mallet"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mallet Head"
|
||||||
|
msgstr "Glowing Lode Mallet Head"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mattock"
|
||||||
|
msgstr "Glowing Lode Mattock"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mattock Head"
|
||||||
|
msgstr "Glowing Lode Mattock Head"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Pick"
|
||||||
|
msgstr "Glowing Lode Pick"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Pick Head"
|
||||||
|
msgstr "Glowing Lode Pick Head"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Prill"
|
||||||
|
msgstr "Glowing Lode Prill"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Rod"
|
||||||
|
msgstr "Glowing Lode Rod"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Spade"
|
||||||
|
msgstr "Glowing Lode Spade"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Spade Head"
|
||||||
|
msgstr "Glowing Lode Spade Head"
|
||||||
|
|
||||||
|
msgid "Grass"
|
||||||
|
msgstr "Grass"
|
||||||
|
|
||||||
|
msgid "Gravel"
|
||||||
|
msgstr "Gravel"
|
||||||
|
|
||||||
|
msgid "Hints"
|
||||||
|
msgstr "Hints"
|
||||||
|
|
||||||
|
msgid "Ignore"
|
||||||
|
msgstr "Ignore"
|
||||||
|
|
||||||
|
msgid "Infused Annealed Lode Hatchet"
|
||||||
|
msgstr "Infused Annealed Lode Hatchet"
|
||||||
|
|
||||||
|
msgid "Infused Annealed Lode Mallet"
|
||||||
|
msgstr "Infused Annealed Lode Mallet"
|
||||||
|
|
||||||
|
msgid "Infused Annealed Lode Mattock"
|
||||||
|
msgstr "Infused Annealed Lode Mattock"
|
||||||
|
|
||||||
|
msgid "Infused Annealed Lode Pick"
|
||||||
|
msgstr "Infused Annealed Lode Pick"
|
||||||
|
|
||||||
|
msgid "Infused Annealed Lode Spade"
|
||||||
|
msgstr "Infused Annealed Lode Spade"
|
||||||
|
|
||||||
|
msgid "Infused Tempered Lode Hatchet"
|
||||||
|
msgstr "Infused Tempered Lode Hatchet"
|
||||||
|
|
||||||
|
msgid "Infused Tempered Lode Mallet"
|
||||||
|
msgstr "Infused Tempered Lode Mallet"
|
||||||
|
|
||||||
|
msgid "Infused Tempered Lode Mattock"
|
||||||
|
msgstr "Infused Tempered Lode Mattock"
|
||||||
|
|
||||||
|
msgid "Infused Tempered Lode Pick"
|
||||||
|
msgstr "Infused Tempered Lode Pick"
|
||||||
|
|
||||||
|
msgid "Infused Tempered Lode Spade"
|
||||||
|
msgstr "Infused Tempered Lode Spade"
|
||||||
|
|
||||||
|
msgid "Injury"
|
||||||
|
msgstr "Injury"
|
||||||
|
|
||||||
|
msgid "Inventory"
|
||||||
|
msgstr "Inventory"
|
||||||
|
|
||||||
|
msgid "Leaves"
|
||||||
|
msgstr "Leaves"
|
||||||
|
|
||||||
|
msgid "Lens"
|
||||||
|
msgstr "Lens"
|
||||||
|
|
||||||
|
msgid "Living Sponge"
|
||||||
|
msgstr "Living Sponge"
|
||||||
|
|
||||||
|
msgid "Lode Cobble"
|
||||||
|
msgstr "Lode Cobble"
|
||||||
|
|
||||||
|
msgid "Lode Crate"
|
||||||
|
msgstr "Lode Crate"
|
||||||
|
|
||||||
|
msgid "Lode Ore"
|
||||||
|
msgstr "Lode Ore"
|
||||||
|
|
||||||
|
msgid "Loose Cobble"
|
||||||
|
msgstr "Loose Cobble"
|
||||||
|
|
||||||
|
msgid "Loose Dirt"
|
||||||
|
msgstr "Loose Dirt"
|
||||||
|
|
||||||
|
msgid "Loose Gravel"
|
||||||
|
msgstr "Loose Gravel"
|
||||||
|
|
||||||
|
msgid "Loose Leaves"
|
||||||
|
msgstr "Loose Leaves"
|
||||||
|
|
||||||
|
msgid "Loose Lode Cobble"
|
||||||
|
msgstr "Loose Lode Cobble"
|
||||||
|
|
||||||
|
msgid "Loose Lux Cobble"
|
||||||
|
msgstr "Loose Lux Cobble"
|
||||||
|
|
||||||
|
msgid "Loose Sand"
|
||||||
|
msgstr "Loose Sand"
|
||||||
|
|
||||||
|
msgid "Lux Cobble"
|
||||||
|
msgstr "Lux Cobble"
|
||||||
|
|
||||||
|
msgid "Lux Flow"
|
||||||
|
msgstr "Lux Flow"
|
||||||
|
|
||||||
|
msgid "MIT License (http://www.opensource.org/licenses/MIT)"
|
||||||
|
msgstr "MIT License (http://www.opensource.org/licenses/MIT)"
|
||||||
|
|
||||||
|
msgid "Molten Glass"
|
||||||
|
msgstr "Molten Glass"
|
||||||
|
|
||||||
|
msgid "Molten Rock"
|
||||||
|
msgstr "Molten Rock"
|
||||||
|
|
||||||
|
msgid "NodeCore"
|
||||||
|
msgstr "NodeCore"
|
||||||
|
|
||||||
|
msgid "Not all game content is covered by hints. Explore!"
|
||||||
|
msgstr "Not all game content is covered by hints. Explore!"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Inventory Management"
|
||||||
|
msgstr "Player's Guide: Inventory Management"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Pummeling Recipes"
|
||||||
|
msgstr "Player's Guide: Pummeling Recipes"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Tips and Guidance"
|
||||||
|
msgstr "Player's Guide: Tips and Guidance"
|
||||||
|
|
||||||
|
msgid "Prism"
|
||||||
|
msgstr "Prism"
|
||||||
|
|
||||||
|
msgid "Progress: @1 complete, @2 current, @3 future"
|
||||||
|
msgstr "Progress: @1 complete, @2 current, @3 future"
|
||||||
|
|
||||||
|
msgid "Pummel"
|
||||||
|
msgstr "Pummel"
|
||||||
|
|
||||||
|
msgid "Sand"
|
||||||
|
msgstr "Sand"
|
||||||
|
|
||||||
|
msgid "See included LICENSE file for full details and credits"
|
||||||
|
msgstr "See included LICENSE file for full details and credits"
|
||||||
|
|
||||||
|
msgid "Shining Lens"
|
||||||
|
msgstr "Shining Lens"
|
||||||
|
|
||||||
|
msgid "Sponge"
|
||||||
|
msgstr "Sponge"
|
||||||
|
|
||||||
|
msgid "Staff"
|
||||||
|
msgstr "Staff"
|
||||||
|
|
||||||
|
msgid "Stick"
|
||||||
|
msgstr "Stick"
|
||||||
|
|
||||||
|
msgid "Stone"
|
||||||
|
msgstr "Stone"
|
||||||
|
|
||||||
|
msgid "Stone Chip"
|
||||||
|
msgstr "Stone Chip"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Hatchet"
|
||||||
|
msgstr "Stone-Tipped Hatchet"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Mallet"
|
||||||
|
msgstr "Stone-Tipped Mallet"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Pick"
|
||||||
|
msgstr "Stone-Tipped Pick"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Spade"
|
||||||
|
msgstr "Stone-Tipped Spade"
|
||||||
|
|
||||||
|
msgid "Stump"
|
||||||
|
msgstr "Stump"
|
||||||
|
|
||||||
|
msgid "Tempered Lode"
|
||||||
|
msgstr "Tempered Lode"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Bar"
|
||||||
|
msgstr "Tempered Lode Bar"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Hatchet"
|
||||||
|
msgstr "Tempered Lode Hatchet"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Hatchet Head"
|
||||||
|
msgstr "Tempered Lode Hatchet Head"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mallet"
|
||||||
|
msgstr "Tempered Lode Mallet"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mallet Head"
|
||||||
|
msgstr "Tempered Lode Mallet Head"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mattock"
|
||||||
|
msgstr "Tempered Lode Mattock"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mattock Head"
|
||||||
|
msgstr "Tempered Lode Mattock Head"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Pick"
|
||||||
|
msgstr "Tempered Lode Pick"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Pick Head"
|
||||||
|
msgstr "Tempered Lode Pick Head"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Prill"
|
||||||
|
msgstr "Tempered Lode Prill"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Rod"
|
||||||
|
msgstr "Tempered Lode Rod"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Spade"
|
||||||
|
msgstr "Tempered Lode Spade"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Spade Head"
|
||||||
|
msgstr "Tempered Lode Spade Head"
|
||||||
|
|
||||||
|
msgid "Tips"
|
||||||
|
msgstr "Tips"
|
||||||
|
|
||||||
|
msgid "Tote (1 Slot)"
|
||||||
|
msgstr "Tote (1 Slot)"
|
||||||
|
|
||||||
|
msgid "Tote (2 Slots)"
|
||||||
|
msgstr "Tote (2 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote (3 Slots)"
|
||||||
|
msgstr "Tote (3 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote (4 Slots)"
|
||||||
|
msgstr "Tote (4 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote (5 Slots)"
|
||||||
|
msgstr "Tote (5 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote (6 Slots)"
|
||||||
|
msgstr "Tote (6 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote (7 Slots)"
|
||||||
|
msgstr "Tote (7 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote (8 Slots)"
|
||||||
|
msgstr "Tote (8 Slots)"
|
||||||
|
|
||||||
|
msgid "Tote Handle"
|
||||||
|
msgstr "Tote Handle"
|
||||||
|
|
||||||
|
msgid "Tree Trunk"
|
||||||
|
msgstr "Tree Trunk"
|
||||||
|
|
||||||
|
msgid "Unknown Item"
|
||||||
|
msgstr "Unknown Item"
|
||||||
|
|
||||||
|
msgid "Water"
|
||||||
|
msgstr "Water"
|
||||||
|
|
||||||
|
msgid "Wet Aggregate"
|
||||||
|
msgstr "Wet Aggregate"
|
||||||
|
|
||||||
|
msgid "Wet Sponge"
|
||||||
|
msgstr "Wet Sponge"
|
||||||
|
|
||||||
|
msgid "Wooden Adze"
|
||||||
|
msgstr "Wooden Adze"
|
||||||
|
|
||||||
|
msgid "Wooden Frame"
|
||||||
|
msgstr "Wooden Frame"
|
||||||
|
|
||||||
|
msgid "Wooden Hatchet"
|
||||||
|
msgstr "Wooden Hatchet"
|
||||||
|
|
||||||
|
msgid "Wooden Hatchet Head"
|
||||||
|
msgstr "Wooden Hatchet Head"
|
||||||
|
|
||||||
|
msgid "Wooden Hinged Panel"
|
||||||
|
msgstr "Wooden Hinged Panel"
|
||||||
|
|
||||||
|
msgid "Wooden Ladder"
|
||||||
|
msgstr "Wooden Ladder"
|
||||||
|
|
||||||
|
msgid "Wooden Mallet"
|
||||||
|
msgstr "Wooden Mallet"
|
||||||
|
|
||||||
|
msgid "Wooden Mallet Head"
|
||||||
|
msgstr "Wooden Mallet Head"
|
||||||
|
|
||||||
|
msgid "Wooden Panel"
|
||||||
|
msgstr "Wooden Panel"
|
||||||
|
|
||||||
|
msgid "Wooden Pick"
|
||||||
|
msgstr "Wooden Pick"
|
||||||
|
|
||||||
|
msgid "Wooden Pick Head"
|
||||||
|
msgstr "Wooden Pick Head"
|
||||||
|
|
||||||
|
msgid "Wooden Plank"
|
||||||
|
msgstr "Wooden Plank"
|
||||||
|
|
||||||
|
msgid "Wooden Shelf"
|
||||||
|
msgstr "Wooden Shelf"
|
||||||
|
|
||||||
|
msgid "Wooden Spade"
|
||||||
|
msgstr "Wooden Spade"
|
||||||
|
|
||||||
|
msgid "Wooden Spade Head"
|
||||||
|
msgstr "Wooden Spade Head"
|
||||||
|
|
||||||
|
msgid "activate a lens"
|
||||||
|
msgstr "activate a lens"
|
||||||
|
|
||||||
|
msgid "assemble a staff from sticks"
|
||||||
|
msgstr "assemble a staff from sticks"
|
||||||
|
|
||||||
|
msgid "assemble a wooden frame from staves"
|
||||||
|
msgstr "assemble a wooden frame from staves"
|
||||||
|
|
||||||
|
msgid "assemble a wooden ladder from sticks"
|
||||||
|
msgstr "assemble a wooden ladder from sticks"
|
||||||
|
|
||||||
|
msgid "assemble a wooden shelf from frames and planks"
|
||||||
|
msgstr "assemble a wooden shelf from frames and planks"
|
||||||
|
|
||||||
|
msgid "assemble a wooden tool"
|
||||||
|
msgstr "assemble a wooden tool"
|
||||||
|
|
||||||
|
msgid "assemble an adze out of sticks"
|
||||||
|
msgstr "assemble an adze out of sticks"
|
||||||
|
|
||||||
|
msgid "assemble an annealed lode tote handle"
|
||||||
|
msgstr "assemble an annealed lode tote handle"
|
||||||
|
|
||||||
|
msgid "bash a plank into sticks"
|
||||||
|
msgstr "bash a plank into sticks"
|
||||||
|
|
||||||
|
msgid "break cobble into chips"
|
||||||
|
msgstr "break cobble into chips"
|
||||||
|
|
||||||
|
msgid "carve a wooden plank completely"
|
||||||
|
msgstr "carve a wooden plank completely"
|
||||||
|
|
||||||
|
msgid "carve wooden tool heads from planks"
|
||||||
|
msgstr "carve wooden tool heads from planks"
|
||||||
|
|
||||||
|
msgid "chip chromatic glass into prisms"
|
||||||
|
msgstr "chip chromatic glass into prisms"
|
||||||
|
|
||||||
|
msgid "chisel a hinge groove into a wooden plank"
|
||||||
|
msgstr "chisel a hinge groove into a wooden plank"
|
||||||
|
|
||||||
|
msgid "chisel a hinge groove into cobble"
|
||||||
|
msgstr "chisel a hinge groove into cobble"
|
||||||
|
|
||||||
|
msgid "chop a glowing lode cube into prills"
|
||||||
|
msgstr "chop a glowing lode cube into prills"
|
||||||
|
|
||||||
|
msgid "chop a lode crate back apart"
|
||||||
|
msgstr "chop a lode crate back apart"
|
||||||
|
|
||||||
|
msgid "chop chromatic glass into lenses"
|
||||||
|
msgstr "chop chromatic glass into lenses"
|
||||||
|
|
||||||
|
msgid "chop lode a rod back into bars"
|
||||||
|
msgstr "chop lode a rod back into bars"
|
||||||
|
|
||||||
|
msgid "chop up charcoal"
|
||||||
|
msgstr "chop up charcoal"
|
||||||
|
|
||||||
|
msgid "cold-forge annealed lode prills into a tool head"
|
||||||
|
msgstr "cold-forge annealed lode prills into a tool head"
|
||||||
|
|
||||||
|
msgid "cold-forge lode down completely"
|
||||||
|
msgstr "cold-forge lode down completely"
|
||||||
|
|
||||||
|
msgid "cool molten glass into crude glass"
|
||||||
|
msgstr "cool molten glass into crude glass"
|
||||||
|
|
||||||
|
msgid "cut down a tree"
|
||||||
|
msgstr "cut down a tree"
|
||||||
|
|
||||||
|
msgid "dig up a tree stump"
|
||||||
|
msgstr "dig up a tree stump"
|
||||||
|
|
||||||
|
msgid "dig up dirt"
|
||||||
|
msgstr "dig up dirt"
|
||||||
|
|
||||||
|
msgid "dig up gravel"
|
||||||
|
msgstr "dig up gravel"
|
||||||
|
|
||||||
|
msgid "dig up lode ore"
|
||||||
|
msgstr "dig up lode ore"
|
||||||
|
|
||||||
|
msgid "dig up lux cobble"
|
||||||
|
msgstr "dig up lux cobble"
|
||||||
|
|
||||||
|
msgid "dig up sand"
|
||||||
|
msgstr "dig up sand"
|
||||||
|
|
||||||
|
msgid "dig up stone"
|
||||||
|
msgstr "dig up stone"
|
||||||
|
|
||||||
|
msgid "dry out a sponge"
|
||||||
|
msgstr "dry out a sponge"
|
||||||
|
|
||||||
|
msgid "find a lode stratum"
|
||||||
|
msgstr "find a lode stratum"
|
||||||
|
|
||||||
|
msgid "find a sponge"
|
||||||
|
msgstr "find a sponge"
|
||||||
|
|
||||||
|
msgid "find a stick"
|
||||||
|
msgstr "find a stick"
|
||||||
|
|
||||||
|
msgid "find an eggcorn"
|
||||||
|
msgstr "find an eggcorn"
|
||||||
|
|
||||||
|
msgid "find ash"
|
||||||
|
msgstr "find ash"
|
||||||
|
|
||||||
|
msgid "find charcoal"
|
||||||
|
msgstr "find charcoal"
|
||||||
|
|
||||||
|
msgid "find deep stone strata"
|
||||||
|
msgstr "find deep stone strata"
|
||||||
|
|
||||||
|
msgid "find dry (loose) leaves"
|
||||||
|
msgstr "find dry (loose) leaves"
|
||||||
|
|
||||||
|
msgid "find lode ore"
|
||||||
|
msgstr "find lode ore"
|
||||||
|
|
||||||
|
msgid "find lux"
|
||||||
|
msgstr "find lux"
|
||||||
|
|
||||||
|
msgid "find molten rock"
|
||||||
|
msgstr "find molten rock"
|
||||||
|
|
||||||
|
msgid "hammer a lode bar back to a prill"
|
||||||
|
msgstr "hammer a lode bar back to a prill"
|
||||||
|
|
||||||
|
msgid "hammer a lode prill into a bar"
|
||||||
|
msgstr "hammer a lode prill into a bar"
|
||||||
|
|
||||||
|
msgid "hammer a metal rod into a cobble panel"
|
||||||
|
msgstr "hammer a metal rod into a cobble panel"
|
||||||
|
|
||||||
|
msgid "hammer a staff into a lubricated wooden panel"
|
||||||
|
msgstr "hammer a staff into a lubricated wooden panel"
|
||||||
|
|
||||||
|
msgid "hammer lode bars into a rod"
|
||||||
|
msgstr "hammer lode bars into a rod"
|
||||||
|
|
||||||
|
msgid "harvest a sponge"
|
||||||
|
msgstr "harvest a sponge"
|
||||||
|
|
||||||
|
msgid "https://content.minetest.net/packages/Warr1024/nodecore/"
|
||||||
|
msgstr "https://content.minetest.net/packages/Warr1024/nodecore/"
|
||||||
|
|
||||||
|
msgid "lubricate a cobble panel with graphite"
|
||||||
|
msgstr "lubricate a cobble panel with graphite"
|
||||||
|
|
||||||
|
msgid "lubricate a wooden panel with graphite"
|
||||||
|
msgstr "lubricate a wooden panel with graphite"
|
||||||
|
|
||||||
|
msgid "lux-infuse a lode tool"
|
||||||
|
msgstr "lux-infuse a lode tool"
|
||||||
|
|
||||||
|
msgid "make an anvil by tempering a lode cube"
|
||||||
|
msgstr "make an anvil by tempering a lode cube"
|
||||||
|
|
||||||
|
msgid "make fire by rubbing sticks together"
|
||||||
|
msgstr "make fire by rubbing sticks together"
|
||||||
|
|
||||||
|
msgid "make wet aggregate"
|
||||||
|
msgstr "make wet aggregate"
|
||||||
|
|
||||||
|
msgid "melt down lode metal from lode cobble"
|
||||||
|
msgstr "melt down lode metal from lode cobble"
|
||||||
|
|
||||||
|
msgid "melt sand into glass"
|
||||||
|
msgstr "melt sand into glass"
|
||||||
|
|
||||||
|
msgid "mix gravel into ash to make aggregate"
|
||||||
|
msgstr "mix gravel into ash to make aggregate"
|
||||||
|
|
||||||
|
msgid "mold molten glass into clear glass"
|
||||||
|
msgstr "mold molten glass into clear glass"
|
||||||
|
|
||||||
|
msgid "mold molten glass into float glass"
|
||||||
|
msgstr "mold molten glass into float glass"
|
||||||
|
|
||||||
|
msgid "observe a lux reaction"
|
||||||
|
msgstr "observe a lux reaction"
|
||||||
|
|
||||||
|
msgid "observe lux criticality"
|
||||||
|
msgstr "observe lux criticality"
|
||||||
|
|
||||||
|
msgid "pack high-quality charcoal"
|
||||||
|
msgstr "pack high-quality charcoal"
|
||||||
|
|
||||||
|
msgid "pack stone chips back into cobble"
|
||||||
|
msgstr "pack stone chips back into cobble"
|
||||||
|
|
||||||
|
msgid "plant an eggcorn"
|
||||||
|
msgstr "plant an eggcorn"
|
||||||
|
|
||||||
|
msgid "produce light from a lens"
|
||||||
|
msgstr "produce light from a lens"
|
||||||
|
|
||||||
|
msgid "put a stone tip onto a wooden tool"
|
||||||
|
msgstr "put a stone tip onto a wooden tool"
|
||||||
|
|
||||||
|
msgid "quench molten glass into chromatic glass"
|
||||||
|
msgstr "quench molten glass into chromatic glass"
|
||||||
|
|
||||||
|
msgid "scale a sheer overhang"
|
||||||
|
msgstr "scale a sheer overhang"
|
||||||
|
|
||||||
|
msgid "scale a sheer wall"
|
||||||
|
msgstr "scale a sheer wall"
|
||||||
|
|
||||||
|
msgid "sinter glowing lode prills into a cube"
|
||||||
|
msgstr "sinter glowing lode prills into a cube"
|
||||||
|
|
||||||
|
msgid "solder lode rods into crates"
|
||||||
|
msgstr "solder lode rods into crates"
|
||||||
|
|
||||||
|
msgid "split a tree trunk into planks"
|
||||||
|
msgstr "split a tree trunk into planks"
|
||||||
|
|
||||||
|
msgid "squeeze out a sponge"
|
||||||
|
msgstr "squeeze out a sponge"
|
||||||
|
|
||||||
|
msgid "temper a lode tool head"
|
||||||
|
msgstr "temper a lode tool head"
|
||||||
|
|
||||||
|
msgid "weld glowing lode pick and spade heads together"
|
||||||
|
msgstr "weld glowing lode pick and spade heads together"
|
|
@ -0,0 +1,2 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
|
|
@ -0,0 +1,2 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
|
|
@ -0,0 +1,21 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-10-04 22:59+0000\n"
|
||||||
|
"Last-Translator: Terifo <none@example.org>\n"
|
||||||
|
"Language-Team: Japanese <http://nodecore.mine.nu/trans/projects/nodecore/"
|
||||||
|
"core/ja/>\n"
|
||||||
|
"Language: ja\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
"X-Generator: Weblate 3.8\n"
|
||||||
|
|
||||||
|
msgid "(and @1 more hints)"
|
||||||
|
msgstr "(さらに@1つのヒント)"
|
||||||
|
|
||||||
|
msgid "(and 1 more hint)"
|
||||||
|
msgstr "(さらに1つのヒント)"
|
||||||
|
|
||||||
|
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
|
||||||
|
msgstr "(C)2018-2019 から Aaron Suen <warr1024@@gmail.com>"
|
|
@ -0,0 +1,633 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-09-12 14:44+0000\n"
|
||||||
|
"PO-Revision-Date: 2019-10-04 22:56+0000\n"
|
||||||
|
"Last-Translator: Terifo <none@example.org>\n"
|
||||||
|
"Language-Team: Portuguese <http://nodecore.mine.nu/trans/projects/nodecore/"
|
||||||
|
"core/pt/>\n"
|
||||||
|
"Language: pt\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||||
|
"X-Generator: Weblate 3.8\n"
|
||||||
|
|
||||||
|
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
|
||||||
|
msgstr "(C)2018-2019 por Aaron Suen <war1024@@gmail.com>"
|
||||||
|
|
||||||
|
msgid "- Crafting is done by building recipes in-world."
|
||||||
|
msgstr "- A Criação de Itens é feita construindo as receitas pelo mundo."
|
||||||
|
|
||||||
|
msgid "- Drop items onto ground to create stack nodes. They do not decay."
|
||||||
|
msgstr "- Solte itens no chão para criar um node de itens amontoados. Eles não desaparecem."
|
||||||
|
|
||||||
|
msgid "- If a recipe exists, you will see a special particle effect."
|
||||||
|
msgstr "- Se uma receita existe, você verá um efeito especial de partícula sair do node."
|
||||||
|
|
||||||
|
msgid "- Items picked up try to fit into the current selected slot first."
|
||||||
|
msgstr "- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado."
|
||||||
|
|
||||||
|
msgid "- Order and specific face of placement may matter for crafting."
|
||||||
|
msgstr "- A ordem e a face em que os itens são colocados pode importar no processo de criação."
|
||||||
|
|
||||||
|
msgid "- Recipes are time-based, punching faster does not speed up."
|
||||||
|
msgstr "- Receitas são cronometradas, bater mais forte não afetará a velocidade delas."
|
||||||
|
|
||||||
|
msgid "- Sneak+drop to count out single items from stack."
|
||||||
|
msgstr "- Use os comandos de agachar e soltar juntos para soltar um só item."
|
||||||
|
|
||||||
|
msgid "- Some recipes require "pummeling" a node."
|
||||||
|
msgstr "- Algumas receitas necessitam que você "esmurre" um node."
|
||||||
|
|
||||||
|
msgid "- Stacks may be pummeled, exact item count may matter."
|
||||||
|
msgstr "- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item."
|
||||||
|
|
||||||
|
msgid "- There is NO inventory screen."
|
||||||
|
msgstr "- NÃO EXISTE tela de inventário."
|
||||||
|
|
||||||
|
msgid "- To pummel, punch a node repeatedly, WITHOUT digging."
|
||||||
|
msgstr "- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO."
|
||||||
|
|
||||||
|
msgid "- Wielded item, target face, and surrounding nodes may matter."
|
||||||
|
msgstr "- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo."
|
||||||
|
|
||||||
|
msgid "- You do not have to punch very fast (about 1 per second)."
|
||||||
|
msgstr "- Você não precisa bater muito rápido(basta 1 batida por segundo)."
|
||||||
|
|
||||||
|
msgid "...and 1 more hint..."
|
||||||
|
msgstr "...e mais 1 dica..."
|
||||||
|
|
||||||
|
msgid "...and @1 more hints..."
|
||||||
|
msgstr "...e mais @1 dicas..."
|
||||||
|
|
||||||
|
msgid "...have you activated a lens yet?"
|
||||||
|
msgstr "...você já ativou uma lente?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a staff from sticks yet?"
|
||||||
|
msgstr "...você já montou um bastão usando gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden frame yet?"
|
||||||
|
msgstr "...você já montou um estrutura de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden ladder yet?"
|
||||||
|
msgstr "...você já montou uma escada de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden shelf yet?"
|
||||||
|
msgstr "...você já montou uma estante de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden tool yet?"
|
||||||
|
msgstr "...você já montou uma ferramenta de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled an adze out of sticks yet?"
|
||||||
|
msgstr "...você já montou um enxó usando gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you assembled an annealed lode tote handle yet?"
|
||||||
|
msgstr "...você já montou uma alça de bolsa recozida?"
|
||||||
|
|
||||||
|
msgid "...have you bashed a plank into sticks yet?"
|
||||||
|
msgstr "...você já quebrou uma tábua em gravetos batendo nela?"
|
||||||
|
|
||||||
|
msgid "...have you broken cobble into chips yet?"
|
||||||
|
msgstr "...você já quebrou pedregulho em pedaços?"
|
||||||
|
|
||||||
|
msgid "...have you carved a wooden plank completely yet?"
|
||||||
|
msgstr "...você já entalhou completamente uma tábua de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you carved wooden tool heads from planks yet?"
|
||||||
|
msgstr "...você já transformou uma tábua em cabeças de ferramentas, entalhando a madeira?"
|
||||||
|
|
||||||
|
msgid "...have you chipped chromatic glass into prisms yet?"
|
||||||
|
msgstr "...você já quebrou um vidro cromático em prismas, lascando o vidro?"
|
||||||
|
|
||||||
|
msgid "...have you chopped a lode cube into prills yet?"
|
||||||
|
msgstr "...você já quebrou um veio mineral em lascas, usando um machado?"
|
||||||
|
|
||||||
|
msgid "...have you chopped chromatic glass into lenses yet?"
|
||||||
|
msgstr "...você já quebrou vidro cromático em lentes, usando um machado?"
|
||||||
|
|
||||||
|
msgid "...have you chopped up charcoal yet?"
|
||||||
|
msgstr "...você já quebrou carvão usando um machado?"
|
||||||
|
|
||||||
|
msgid "...have you cold-forged an annealed lode tool head yet?"
|
||||||
|
msgstr "...você já fez uma forja fria de uma cabeça de ferramenta de veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you cold-forged lode down completely yet?"
|
||||||
|
msgstr "...você já fez uma forja fria de um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you cooled molten glass into crude glass yet?"
|
||||||
|
msgstr "...você já esfriou vidro derretido para que este virasse vidro cru?"
|
||||||
|
|
||||||
|
msgid "...have you cut down a tree yet?"
|
||||||
|
msgstr "...você já cortou uma árvore?"
|
||||||
|
|
||||||
|
msgid "...have you dug up a tree stump yet?"
|
||||||
|
msgstr "...você já desenterrou um toco de árvore?"
|
||||||
|
|
||||||
|
msgid "...have you dug up dirt yet?"
|
||||||
|
msgstr "...você já cavou terra?"
|
||||||
|
|
||||||
|
msgid "...have you dug up gravel yet?"
|
||||||
|
msgstr "...você já cavou cascalho?"
|
||||||
|
|
||||||
|
msgid "...have you dug up lode ore yet?"
|
||||||
|
msgstr "...você já desenterrou um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you dug up sand yet?"
|
||||||
|
msgstr "...você já cavou areia?"
|
||||||
|
|
||||||
|
msgid "...have you dug up stone yet?"
|
||||||
|
msgstr "...você já cavou pedra?"
|
||||||
|
|
||||||
|
msgid "...have you found a lode stratum yet?"
|
||||||
|
msgstr "...você já encontrou um estrato de veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you found ash yet?"
|
||||||
|
msgstr "...você já encontrou cinzas?"
|
||||||
|
|
||||||
|
msgid "...have you found charcoal yet?"
|
||||||
|
msgstr "...você já encontrou carvão?"
|
||||||
|
|
||||||
|
msgid "...have you found deep stone strata yet?"
|
||||||
|
msgstr "...você já encontrou um estrato de pedra profunda?"
|
||||||
|
|
||||||
|
msgid "...have you found dry leaves yet?"
|
||||||
|
msgstr "...você já encontrou folhas secas?"
|
||||||
|
|
||||||
|
msgid "...have you found eggcorns yet?"
|
||||||
|
msgstr "...você já encontrou semente de carvalho?"
|
||||||
|
|
||||||
|
msgid "...have you found lode ore yet?"
|
||||||
|
msgstr "...você já encontrou um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you found molten rock yet?"
|
||||||
|
msgstr "...você já encontrou pedra derretida (lava)?"
|
||||||
|
|
||||||
|
msgid "...have you found sponges yet?"
|
||||||
|
msgstr "...você já encontrou esponjas?"
|
||||||
|
|
||||||
|
msgid "...have you found sticks yet?"
|
||||||
|
msgstr "...você já encontrou gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you made fire by rubbing sticks together yet?"
|
||||||
|
msgstr "...você já fez fogo esfregando gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you melted down lode metal yet?"
|
||||||
|
msgstr "...você já derreteu um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you melted sand into glass yet?"
|
||||||
|
msgstr "...você já transformou areia em vidro, derretendo a areia?"
|
||||||
|
|
||||||
|
msgid "...have you molded molten glass into clear glass yet?"
|
||||||
|
msgstr "...você já moldou vidro derretido em vidro transparente?"
|
||||||
|
|
||||||
|
msgid "...have you packed high-quality charcoal yet?"
|
||||||
|
msgstr "...você já juntou carvão de alta qualidade?"
|
||||||
|
|
||||||
|
msgid "...have you packed stone chips back into cobble yet?"
|
||||||
|
msgstr "...você já juntou pedaços de pedra para que virassem pedregulho?"
|
||||||
|
|
||||||
|
msgid "...have you planted an eggcorn yet?"
|
||||||
|
msgstr "...você já plantou uma semente de carvalho?"
|
||||||
|
|
||||||
|
msgid "...have you produced light from a lens yet?"
|
||||||
|
msgstr "...você já gerou luz a partir de uma lente?"
|
||||||
|
|
||||||
|
msgid "...have you put a stone tip onto a tool yet?"
|
||||||
|
msgstr "...você já colocou uma ponta de pedra em uma ferramenta?"
|
||||||
|
|
||||||
|
msgid "...have you quenched molten glass into chromatic glass yet?"
|
||||||
|
msgstr "...você já temperou vidro derretido para que virasse vidro cromático?"
|
||||||
|
|
||||||
|
msgid "...have you sintered glowing lode into a cube yet?"
|
||||||
|
msgstr "...você já moldou veio mineral incandescente em um cubo?"
|
||||||
|
|
||||||
|
msgid "...have you split a tree trunk into planks yet?"
|
||||||
|
msgstr "...você já fez tábuas quebrando troncos de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you tempered a lode anvil yet?"
|
||||||
|
msgstr "...você já fez uma bigorna temperando veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you tempered a lode tool head yet?"
|
||||||
|
msgstr "...você já fez uma cabeça de ferramenta temperando veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you welded a lode pick and spade together yet?"
|
||||||
|
msgstr "...você já soldou uma picareta de veio mineral com uma pá de veio mineral?"
|
||||||
|
|
||||||
|
msgid "About"
|
||||||
|
msgstr "Sobre"
|
||||||
|
|
||||||
|
msgid "Active Lens"
|
||||||
|
msgstr "Lente Ativa"
|
||||||
|
|
||||||
|
msgid "Active Prism"
|
||||||
|
msgstr "Prisma Ativo"
|
||||||
|
|
||||||
|
msgid "Aggregate"
|
||||||
|
msgstr "Agregar"
|
||||||
|
|
||||||
|
msgid "Air"
|
||||||
|
msgstr "Ar"
|
||||||
|
|
||||||
|
msgid "Annealed Lode"
|
||||||
|
msgstr "Veio Mineral Recozido"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Bar"
|
||||||
|
msgstr "Barra de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Hatchet"
|
||||||
|
msgstr "Machado de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mallet"
|
||||||
|
msgstr "Marreta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mattock"
|
||||||
|
msgstr "Enxada de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mattock Head"
|
||||||
|
msgstr "Cabeça de Enxada de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Pick"
|
||||||
|
msgstr "Picareta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Prill"
|
||||||
|
msgstr "Lascas de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Rod"
|
||||||
|
msgstr "Vara de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Spade"
|
||||||
|
msgstr "Pá de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Spade Head"
|
||||||
|
msgstr "Cabeça de Pá de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Ash"
|
||||||
|
msgstr "Cinza"
|
||||||
|
|
||||||
|
msgid "Ash Lump"
|
||||||
|
msgstr "Nódulo de Cinzas"
|
||||||
|
|
||||||
|
msgid "Burning Embers"
|
||||||
|
msgstr "Brasa Quente"
|
||||||
|
|
||||||
|
msgid "Charcoal"
|
||||||
|
msgstr "Carvão Vegetal"
|
||||||
|
|
||||||
|
msgid "Charcoal Lump"
|
||||||
|
msgstr "Nódulo de Carvão Vegetal"
|
||||||
|
|
||||||
|
msgid "Chromatic Glass"
|
||||||
|
msgstr "Vidro Cromático"
|
||||||
|
|
||||||
|
msgid "Clear Glass"
|
||||||
|
msgstr "Vidro Transparente"
|
||||||
|
|
||||||
|
msgid "Cobble"
|
||||||
|
msgstr "Pedregulho"
|
||||||
|
|
||||||
|
msgid "Cobble Hinged Panel"
|
||||||
|
msgstr "Painel de Pedregulho Articulado"
|
||||||
|
|
||||||
|
msgid "Cobble Panel"
|
||||||
|
msgstr "Painel de Pedregulho"
|
||||||
|
|
||||||
|
msgid "Crude Glass"
|
||||||
|
msgstr "Vidro Bruto"
|
||||||
|
|
||||||
|
msgid "DEVELOPMENT VERSION"
|
||||||
|
msgstr "VERSÃO EM DESENVOLVIMENTO"
|
||||||
|
|
||||||
|
msgid "Dirt"
|
||||||
|
msgstr "Terra"
|
||||||
|
|
||||||
|
msgid "Discord: https://discord.gg/SHq2tkb"
|
||||||
|
msgstr "Discord: https://discord.gg/SHq2tkb"
|
||||||
|
|
||||||
|
msgid "Eggcorn"
|
||||||
|
msgstr "Semente de Carvalho"
|
||||||
|
|
||||||
|
msgid "Fire"
|
||||||
|
msgstr "Fogo"
|
||||||
|
|
||||||
|
msgid "Float Glass"
|
||||||
|
msgstr "Vidro Float"
|
||||||
|
|
||||||
|
msgid "GitLab: https://gitlab.com/sztest/nodecore"
|
||||||
|
msgstr "GitLab: https://gitlab.com/sztest/nodecore"
|
||||||
|
|
||||||
|
msgid "Glowing Lode"
|
||||||
|
msgstr "Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Bar"
|
||||||
|
msgstr "Barra de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Hatchet"
|
||||||
|
msgstr "Machado de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mallet"
|
||||||
|
msgstr "Marreta de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mattock"
|
||||||
|
msgstr "Enxada de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mattock Head"
|
||||||
|
msgstr "Cabeça de Enxada Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Pick"
|
||||||
|
msgstr "Picareta de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Prill"
|
||||||
|
msgstr "Lascas de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Rod"
|
||||||
|
msgstr "Vara de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Spade"
|
||||||
|
msgstr "Pá de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Spade Head"
|
||||||
|
msgstr "Cabeça de Pá Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Grass"
|
||||||
|
msgstr "Grama"
|
||||||
|
|
||||||
|
msgid "Gravel"
|
||||||
|
msgstr "Cascalho"
|
||||||
|
|
||||||
|
msgid "Hints"
|
||||||
|
msgstr "Dicas"
|
||||||
|
|
||||||
|
msgid "Ignore"
|
||||||
|
msgstr "Ignorar"
|
||||||
|
|
||||||
|
msgid "Injury"
|
||||||
|
msgstr "Ferir"
|
||||||
|
|
||||||
|
msgid "Inventory"
|
||||||
|
msgstr "Inventário"
|
||||||
|
|
||||||
|
msgid "Leaves"
|
||||||
|
msgstr "Folhas"
|
||||||
|
|
||||||
|
msgid "Lens"
|
||||||
|
msgstr "Lente"
|
||||||
|
|
||||||
|
msgid "Living Sponge"
|
||||||
|
msgstr "Esponja Viva"
|
||||||
|
|
||||||
|
msgid "Lode Cobble"
|
||||||
|
msgstr "Veio de Pedregulho"
|
||||||
|
|
||||||
|
msgid "Lode Ore"
|
||||||
|
msgstr "Veio Mineral"
|
||||||
|
|
||||||
|
msgid "Loose Cobble"
|
||||||
|
msgstr "Pedregulho Solta"
|
||||||
|
|
||||||
|
msgid "Loose Dirt"
|
||||||
|
msgstr "Terra Solta"
|
||||||
|
|
||||||
|
msgid "Loose Gravel"
|
||||||
|
msgstr "Cascalho Solto"
|
||||||
|
|
||||||
|
msgid "Loose Leaves"
|
||||||
|
msgstr "Folhas Soltas"
|
||||||
|
|
||||||
|
msgid "Loose Lode Cobble"
|
||||||
|
msgstr "Veio de Pedregulho Solto"
|
||||||
|
|
||||||
|
msgid "Loose Sand"
|
||||||
|
msgstr "Areia Solta"
|
||||||
|
|
||||||
|
msgid "MIT License: http://www.opensource.org/licenses/MIT"
|
||||||
|
msgstr "Licensa MIT: http://www.opensource.org/licenses/MIT"
|
||||||
|
|
||||||
|
msgid "Molten Glass"
|
||||||
|
msgstr "Vidro Derretido"
|
||||||
|
|
||||||
|
msgid "Molten Rock"
|
||||||
|
msgstr "Pedra Derretida"
|
||||||
|
|
||||||
|
msgid "NodeCore"
|
||||||
|
msgstr "NodeCore"
|
||||||
|
|
||||||
|
msgid "Not all game content is covered by hints. Explore!"
|
||||||
|
msgstr "As dicas não cobrem todo o conteúdo do jogo. Explore!"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Inventory Management"
|
||||||
|
msgstr "Guia do Jogador: Gerenciamento de Inventário"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Pummeling Recipes"
|
||||||
|
msgstr "Guia do Jogador: Receitas por Esmurrada"
|
||||||
|
|
||||||
|
msgid "Prism"
|
||||||
|
msgstr "Prisma"
|
||||||
|
|
||||||
|
msgid "Progress: @1 complete, @2 current, @3 future"
|
||||||
|
msgstr "Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)"
|
||||||
|
|
||||||
|
msgid "Pummel"
|
||||||
|
msgstr "Esmurrar"
|
||||||
|
|
||||||
|
msgid "Sand"
|
||||||
|
msgstr "Areia"
|
||||||
|
|
||||||
|
msgid "See included LICENSE file for full details and credits"
|
||||||
|
msgstr "Veja o arquivo de LICENSA incluso para créditos e maiores detalhes"
|
||||||
|
|
||||||
|
msgid "Shining Lens"
|
||||||
|
msgstr "Lente Brilhante"
|
||||||
|
|
||||||
|
msgid "Sponge"
|
||||||
|
msgstr "Esponja"
|
||||||
|
|
||||||
|
msgid "Staff"
|
||||||
|
msgstr "Bastão"
|
||||||
|
|
||||||
|
msgid "Stick"
|
||||||
|
msgstr "Graveto"
|
||||||
|
|
||||||
|
msgid "Stone"
|
||||||
|
msgstr "Pedra"
|
||||||
|
|
||||||
|
msgid "Stone Chip"
|
||||||
|
msgstr "Pedaço de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Hatchet"
|
||||||
|
msgstr "Machado com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Mallet"
|
||||||
|
msgstr "Marreta com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Pick"
|
||||||
|
msgstr "Picareta com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Spade"
|
||||||
|
msgstr "Pá com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stump"
|
||||||
|
msgstr "Toco"
|
||||||
|
|
||||||
|
msgid "Teleport to get unstuck (but you can't bring your items)"
|
||||||
|
msgstr "Teleporte para desprender-se (mas você perderá seus itens)"
|
||||||
|
|
||||||
|
msgid "Tempered Lode"
|
||||||
|
msgstr "Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Bar"
|
||||||
|
msgstr "Barra de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Hatchet"
|
||||||
|
msgstr "Machado de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mallet"
|
||||||
|
msgstr "Marreta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mattock"
|
||||||
|
msgstr "Enxada de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mattock Head"
|
||||||
|
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Pick"
|
||||||
|
msgstr "Picareta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Prill"
|
||||||
|
msgstr "Lascas de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Rod"
|
||||||
|
msgstr "Vara de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Spade"
|
||||||
|
msgstr "Pá de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Spade Head"
|
||||||
|
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tote (1 Slot)"
|
||||||
|
msgstr "Bolsa (1 Compartimento)"
|
||||||
|
|
||||||
|
msgid "Tote (2 Slots)"
|
||||||
|
msgstr "Bolsa (2 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (3 Slots)"
|
||||||
|
msgstr "Bolsa (3 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (4 Slots)"
|
||||||
|
msgstr "Bolsa (4 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (5 Slots)"
|
||||||
|
msgstr "Bolsa (5 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (6 Slots)"
|
||||||
|
msgstr "Bolsa (6 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (7 Slots)"
|
||||||
|
msgstr "Bolsa (7 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (8 Slots)"
|
||||||
|
msgstr "Bolsa (8 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote Handle"
|
||||||
|
msgstr "Alça de Bolsa"
|
||||||
|
|
||||||
|
msgid "Tree Trunk"
|
||||||
|
msgstr "Tronco de Árvore"
|
||||||
|
|
||||||
|
msgid "Unknown Item"
|
||||||
|
msgstr "Item Desconhecido"
|
||||||
|
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Versão"
|
||||||
|
|
||||||
|
msgid "Water"
|
||||||
|
msgstr "Água"
|
||||||
|
|
||||||
|
msgid "Wet Aggregate"
|
||||||
|
msgstr "Massa Úmida"
|
||||||
|
|
||||||
|
msgid "Wet Sponge"
|
||||||
|
msgstr "Esponja Molhada"
|
||||||
|
|
||||||
|
msgid "Wooden Adze"
|
||||||
|
msgstr "Enxó de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Frame"
|
||||||
|
msgstr "Estrutura de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Hatchet"
|
||||||
|
msgstr "Machado de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Hinged Panel"
|
||||||
|
msgstr "Painel Articulado de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Ladder"
|
||||||
|
msgstr "Escada de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Mallet"
|
||||||
|
msgstr "Marreta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Panel"
|
||||||
|
msgstr "Painel de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Pick"
|
||||||
|
msgstr "Picareta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Plank"
|
||||||
|
msgstr "Tábua de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Shelf"
|
||||||
|
msgstr "Estante de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Spade"
|
||||||
|
msgstr "Pá de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Spade Head"
|
||||||
|
msgstr "Cabeça de Pá de Madeira"
|
||||||
|
|
||||||
|
msgid "https://content.minetest.net/packages/Warr1024/nodecore/"
|
||||||
|
msgstr "https://content.minetest.net/packages/Warr1024/nodecore/"
|
||||||
|
|
||||||
|
msgid "(and @1 more hints)"
|
||||||
|
msgstr "(e mais @1 dicas)"
|
||||||
|
|
||||||
|
msgid "(and 1 more hint)"
|
||||||
|
msgstr "( e mais 1 dica)"
|
|
@ -0,0 +1,627 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-09-12 14:44+0000\n"
|
||||||
|
"PO-Revision-Date: 2019-09-12 14:44+0000\n"
|
||||||
|
"Last-Translator: Weblate Admin <warr1024@gmail.com>\n"
|
||||||
|
"Language-Team: Portuguese (Brazil) <http://nodecore.mine.nu/trans/projects/"
|
||||||
|
"nodecore/core/pt_BR/>\n"
|
||||||
|
"Language: pt_BR\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||||
|
"X-Generator: Weblate 3.8\n"
|
||||||
|
|
||||||
|
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
|
||||||
|
msgstr "(C)2018-2019 por Aaron Suen <war1024@@gmail.com>"
|
||||||
|
|
||||||
|
msgid "- Crafting is done by building recipes in-world."
|
||||||
|
msgstr "- A Criação de Itens é feita construindo as receitas pelo mundo."
|
||||||
|
|
||||||
|
msgid "- Drop items onto ground to create stack nodes. They do not decay."
|
||||||
|
msgstr "- Solte itens no chão para criar um node de itens amontoados. Eles não desaparecem."
|
||||||
|
|
||||||
|
msgid "- If a recipe exists, you will see a special particle effect."
|
||||||
|
msgstr "- Se uma receita existe, você verá um efeito especial de partícula sair do node."
|
||||||
|
|
||||||
|
msgid "- Items picked up try to fit into the current selected slot first."
|
||||||
|
msgstr "- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado."
|
||||||
|
|
||||||
|
msgid "- Order and specific face of placement may matter for crafting."
|
||||||
|
msgstr "- A ordem e a face em que os itens são colocados pode importar no processo de criação."
|
||||||
|
|
||||||
|
msgid "- Recipes are time-based, punching faster does not speed up."
|
||||||
|
msgstr "- Receitas são cronometradas, bater mais forte não afetará a velocidade delas."
|
||||||
|
|
||||||
|
msgid "- Sneak+drop to count out single items from stack."
|
||||||
|
msgstr "- Use os comandos de agachar e soltar juntos para soltar um só item."
|
||||||
|
|
||||||
|
msgid "- Some recipes require "pummeling" a node."
|
||||||
|
msgstr "- Algumas receitas necessitam que você "esmurre" um node."
|
||||||
|
|
||||||
|
msgid "- Stacks may be pummeled, exact item count may matter."
|
||||||
|
msgstr "- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item."
|
||||||
|
|
||||||
|
msgid "- There is NO inventory screen."
|
||||||
|
msgstr "- NÃO EXISTE tela de inventário."
|
||||||
|
|
||||||
|
msgid "- To pummel, punch a node repeatedly, WITHOUT digging."
|
||||||
|
msgstr "- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO."
|
||||||
|
|
||||||
|
msgid "- Wielded item, target face, and surrounding nodes may matter."
|
||||||
|
msgstr "- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo."
|
||||||
|
|
||||||
|
msgid "- You do not have to punch very fast (about 1 per second)."
|
||||||
|
msgstr "- Você não precisa bater muito rápido(basta 1 batida por segundo)."
|
||||||
|
|
||||||
|
msgid "...and 1 more hint..."
|
||||||
|
msgstr "...e mais 1 dica..."
|
||||||
|
|
||||||
|
msgid "...and @1 more hints..."
|
||||||
|
msgstr "...e mais @1 dicas..."
|
||||||
|
|
||||||
|
msgid "...have you activated a lens yet?"
|
||||||
|
msgstr "...você já ativou uma lente?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a staff from sticks yet?"
|
||||||
|
msgstr "...você já montou um bastão usando gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden frame yet?"
|
||||||
|
msgstr "...você já montou um estrutura de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden ladder yet?"
|
||||||
|
msgstr "...você já montou uma escada de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden shelf yet?"
|
||||||
|
msgstr "...você já montou uma estante de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled a wooden tool yet?"
|
||||||
|
msgstr "...você já montou uma ferramenta de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you assembled an adze out of sticks yet?"
|
||||||
|
msgstr "...você já montou um enxó usando gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you assembled an annealed lode tote handle yet?"
|
||||||
|
msgstr "...você já montou uma alça de bolsa recozida?"
|
||||||
|
|
||||||
|
msgid "...have you bashed a plank into sticks yet?"
|
||||||
|
msgstr "...você já quebrou uma tábua em gravetos batendo nela?"
|
||||||
|
|
||||||
|
msgid "...have you broken cobble into chips yet?"
|
||||||
|
msgstr "...você já quebrou pedregulho em pedaços?"
|
||||||
|
|
||||||
|
msgid "...have you carved a wooden plank completely yet?"
|
||||||
|
msgstr "...você já entalhou completamente uma tábua de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you carved wooden tool heads from planks yet?"
|
||||||
|
msgstr "...você já transformou uma tábua em cabeças de ferramentas, entalhando a madeira?"
|
||||||
|
|
||||||
|
msgid "...have you chipped chromatic glass into prisms yet?"
|
||||||
|
msgstr "...você já quebrou um vidro cromático em prismas, lascando o vidro?"
|
||||||
|
|
||||||
|
msgid "...have you chopped a lode cube into prills yet?"
|
||||||
|
msgstr "...você já quebrou um veio mineral em lascas, usando um machado?"
|
||||||
|
|
||||||
|
msgid "...have you chopped chromatic glass into lenses yet?"
|
||||||
|
msgstr "...você já quebrou vidro cromático em lentes, usando um machado?"
|
||||||
|
|
||||||
|
msgid "...have you chopped up charcoal yet?"
|
||||||
|
msgstr "...você já quebrou carvão usando um machado?"
|
||||||
|
|
||||||
|
msgid "...have you cold-forged an annealed lode tool head yet?"
|
||||||
|
msgstr "...você já fez uma forja fria de uma cabeça de ferramenta de veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you cold-forged lode down completely yet?"
|
||||||
|
msgstr "...você já fez uma forja fria de um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you cooled molten glass into crude glass yet?"
|
||||||
|
msgstr "...você já esfriou vidro derretido para que este virasse vidro cru?"
|
||||||
|
|
||||||
|
msgid "...have you cut down a tree yet?"
|
||||||
|
msgstr "...você já cortou uma árvore?"
|
||||||
|
|
||||||
|
msgid "...have you dug up a tree stump yet?"
|
||||||
|
msgstr "...você já desenterrou um toco de árvore?"
|
||||||
|
|
||||||
|
msgid "...have you dug up dirt yet?"
|
||||||
|
msgstr "...você já cavou terra?"
|
||||||
|
|
||||||
|
msgid "...have you dug up gravel yet?"
|
||||||
|
msgstr "...você já cavou cascalho?"
|
||||||
|
|
||||||
|
msgid "...have you dug up lode ore yet?"
|
||||||
|
msgstr "...você já desenterrou um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you dug up sand yet?"
|
||||||
|
msgstr "...você já cavou areia?"
|
||||||
|
|
||||||
|
msgid "...have you dug up stone yet?"
|
||||||
|
msgstr "...você já cavou pedra?"
|
||||||
|
|
||||||
|
msgid "...have you found a lode stratum yet?"
|
||||||
|
msgstr "...você já encontrou um estrato de veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you found ash yet?"
|
||||||
|
msgstr "...você já encontrou cinzas?"
|
||||||
|
|
||||||
|
msgid "...have you found charcoal yet?"
|
||||||
|
msgstr "...você já encontrou carvão?"
|
||||||
|
|
||||||
|
msgid "...have you found deep stone strata yet?"
|
||||||
|
msgstr "...você já encontrou um estrato de pedra profunda?"
|
||||||
|
|
||||||
|
msgid "...have you found dry leaves yet?"
|
||||||
|
msgstr "...você já encontrou folhas secas?"
|
||||||
|
|
||||||
|
msgid "...have you found eggcorns yet?"
|
||||||
|
msgstr "...você já encontrou semente de carvalho?"
|
||||||
|
|
||||||
|
msgid "...have you found lode ore yet?"
|
||||||
|
msgstr "...você já encontrou um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you found molten rock yet?"
|
||||||
|
msgstr "...você já encontrou pedra derretida (lava)?"
|
||||||
|
|
||||||
|
msgid "...have you found sponges yet?"
|
||||||
|
msgstr "...você já encontrou esponjas?"
|
||||||
|
|
||||||
|
msgid "...have you found sticks yet?"
|
||||||
|
msgstr "...você já encontrou gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you made fire by rubbing sticks together yet?"
|
||||||
|
msgstr "...você já fez fogo esfregando gravetos?"
|
||||||
|
|
||||||
|
msgid "...have you melted down lode metal yet?"
|
||||||
|
msgstr "...você já derreteu um veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you melted sand into glass yet?"
|
||||||
|
msgstr "...você já transformou areia em vidro, derretendo a areia?"
|
||||||
|
|
||||||
|
msgid "...have you molded molten glass into clear glass yet?"
|
||||||
|
msgstr "...você já moldou vidro derretido em vidro transparente?"
|
||||||
|
|
||||||
|
msgid "...have you packed high-quality charcoal yet?"
|
||||||
|
msgstr "...você já juntou carvão de alta qualidade?"
|
||||||
|
|
||||||
|
msgid "...have you packed stone chips back into cobble yet?"
|
||||||
|
msgstr "...você já juntou pedaços de pedra para que virassem pedregulho?"
|
||||||
|
|
||||||
|
msgid "...have you planted an eggcorn yet?"
|
||||||
|
msgstr "...você já plantou uma semente de carvalho?"
|
||||||
|
|
||||||
|
msgid "...have you produced light from a lens yet?"
|
||||||
|
msgstr "...você já gerou luz a partir de uma lente?"
|
||||||
|
|
||||||
|
msgid "...have you put a stone tip onto a tool yet?"
|
||||||
|
msgstr "...você já colocou uma ponta de pedra em uma ferramenta?"
|
||||||
|
|
||||||
|
msgid "...have you quenched molten glass into chromatic glass yet?"
|
||||||
|
msgstr "...você já temperou vidro derretido para que virasse vidro cromático?"
|
||||||
|
|
||||||
|
msgid "...have you sintered glowing lode into a cube yet?"
|
||||||
|
msgstr "...você já moldou veio mineral incandescente em um cubo?"
|
||||||
|
|
||||||
|
msgid "...have you split a tree trunk into planks yet?"
|
||||||
|
msgstr "...você já fez tábuas quebrando troncos de madeira?"
|
||||||
|
|
||||||
|
msgid "...have you tempered a lode anvil yet?"
|
||||||
|
msgstr "...você já fez uma bigorna temperando veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you tempered a lode tool head yet?"
|
||||||
|
msgstr "...você já fez uma cabeça de ferramenta temperando veio mineral?"
|
||||||
|
|
||||||
|
msgid "...have you welded a lode pick and spade together yet?"
|
||||||
|
msgstr "...você já soldou uma picareta de veio mineral com uma pá de veio mineral?"
|
||||||
|
|
||||||
|
msgid "About"
|
||||||
|
msgstr "Sobre"
|
||||||
|
|
||||||
|
msgid "Active Lens"
|
||||||
|
msgstr "Lente Ativa"
|
||||||
|
|
||||||
|
msgid "Active Prism"
|
||||||
|
msgstr "Prisma Ativo"
|
||||||
|
|
||||||
|
msgid "Aggregate"
|
||||||
|
msgstr "Agregar"
|
||||||
|
|
||||||
|
msgid "Air"
|
||||||
|
msgstr "Ar"
|
||||||
|
|
||||||
|
msgid "Annealed Lode"
|
||||||
|
msgstr "Veio Mineral Recozido"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Bar"
|
||||||
|
msgstr "Barra de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Hatchet"
|
||||||
|
msgstr "Machado de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mallet"
|
||||||
|
msgstr "Marreta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mattock"
|
||||||
|
msgstr "Enxada de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Mattock Head"
|
||||||
|
msgstr "Cabeça de Enxada de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Pick"
|
||||||
|
msgstr "Picareta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Prill"
|
||||||
|
msgstr "Lascas de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Rod"
|
||||||
|
msgstr "Vara de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Spade"
|
||||||
|
msgstr "Pá de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Annealed Lode Spade Head"
|
||||||
|
msgstr "Cabeça de Pá de Veio Mineral Recozida"
|
||||||
|
|
||||||
|
msgid "Ash"
|
||||||
|
msgstr "Cinza"
|
||||||
|
|
||||||
|
msgid "Ash Lump"
|
||||||
|
msgstr "Nódulo de Cinzas"
|
||||||
|
|
||||||
|
msgid "Burning Embers"
|
||||||
|
msgstr "Brasa Quente"
|
||||||
|
|
||||||
|
msgid "Charcoal"
|
||||||
|
msgstr "Carvão Vegetal"
|
||||||
|
|
||||||
|
msgid "Charcoal Lump"
|
||||||
|
msgstr "Nódulo de Carvão Vegetal"
|
||||||
|
|
||||||
|
msgid "Chromatic Glass"
|
||||||
|
msgstr "Vidro Cromático"
|
||||||
|
|
||||||
|
msgid "Clear Glass"
|
||||||
|
msgstr "Vidro Transparente"
|
||||||
|
|
||||||
|
msgid "Cobble"
|
||||||
|
msgstr "Pedregulho"
|
||||||
|
|
||||||
|
msgid "Cobble Hinged Panel"
|
||||||
|
msgstr "Painel de Pedregulho Articulado"
|
||||||
|
|
||||||
|
msgid "Cobble Panel"
|
||||||
|
msgstr "Painel de Pedregulho"
|
||||||
|
|
||||||
|
msgid "Crude Glass"
|
||||||
|
msgstr "Vidro Bruto"
|
||||||
|
|
||||||
|
msgid "DEVELOPMENT VERSION"
|
||||||
|
msgstr "VERSÃO EM DESENVOLVIMENTO"
|
||||||
|
|
||||||
|
msgid "Dirt"
|
||||||
|
msgstr "Terra"
|
||||||
|
|
||||||
|
msgid "Discord: https://discord.gg/SHq2tkb"
|
||||||
|
msgstr "Discord: https://discord.gg/SHq2tkb"
|
||||||
|
|
||||||
|
msgid "Eggcorn"
|
||||||
|
msgstr "Semente de Carvalho"
|
||||||
|
|
||||||
|
msgid "Fire"
|
||||||
|
msgstr "Fogo"
|
||||||
|
|
||||||
|
msgid "Float Glass"
|
||||||
|
msgstr "Vidro Float"
|
||||||
|
|
||||||
|
msgid "GitLab: https://gitlab.com/sztest/nodecore"
|
||||||
|
msgstr "GitLab: https://gitlab.com/sztest/nodecore"
|
||||||
|
|
||||||
|
msgid "Glowing Lode"
|
||||||
|
msgstr "Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Bar"
|
||||||
|
msgstr "Barra de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Hatchet"
|
||||||
|
msgstr "Machado de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mallet"
|
||||||
|
msgstr "Marreta de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mattock"
|
||||||
|
msgstr "Enxada de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Mattock Head"
|
||||||
|
msgstr "Cabeça de Enxada Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Pick"
|
||||||
|
msgstr "Picareta de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Prill"
|
||||||
|
msgstr "Lascas de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Rod"
|
||||||
|
msgstr "Vara de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Spade"
|
||||||
|
msgstr "Pá de Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Glowing Lode Spade Head"
|
||||||
|
msgstr "Cabeça de Pá Veio Mineral Incandescente"
|
||||||
|
|
||||||
|
msgid "Grass"
|
||||||
|
msgstr "Grama"
|
||||||
|
|
||||||
|
msgid "Gravel"
|
||||||
|
msgstr "Cascalho"
|
||||||
|
|
||||||
|
msgid "Hints"
|
||||||
|
msgstr "Dicas"
|
||||||
|
|
||||||
|
msgid "Ignore"
|
||||||
|
msgstr "Ignorar"
|
||||||
|
|
||||||
|
msgid "Injury"
|
||||||
|
msgstr "Ferir"
|
||||||
|
|
||||||
|
msgid "Inventory"
|
||||||
|
msgstr "Inventário"
|
||||||
|
|
||||||
|
msgid "Leaves"
|
||||||
|
msgstr "Folhas"
|
||||||
|
|
||||||
|
msgid "Lens"
|
||||||
|
msgstr "Lente"
|
||||||
|
|
||||||
|
msgid "Living Sponge"
|
||||||
|
msgstr "Esponja Viva"
|
||||||
|
|
||||||
|
msgid "Lode Cobble"
|
||||||
|
msgstr "Veio de Pedregulho"
|
||||||
|
|
||||||
|
msgid "Lode Ore"
|
||||||
|
msgstr "Veio Mineral"
|
||||||
|
|
||||||
|
msgid "Loose Cobble"
|
||||||
|
msgstr "Pedregulho Solta"
|
||||||
|
|
||||||
|
msgid "Loose Dirt"
|
||||||
|
msgstr "Terra Solta"
|
||||||
|
|
||||||
|
msgid "Loose Gravel"
|
||||||
|
msgstr "Cascalho Solto"
|
||||||
|
|
||||||
|
msgid "Loose Leaves"
|
||||||
|
msgstr "Folhas Soltas"
|
||||||
|
|
||||||
|
msgid "Loose Lode Cobble"
|
||||||
|
msgstr "Veio de Pedregulho Solto"
|
||||||
|
|
||||||
|
msgid "Loose Sand"
|
||||||
|
msgstr "Areia Solta"
|
||||||
|
|
||||||
|
msgid "MIT License: http://www.opensource.org/licenses/MIT"
|
||||||
|
msgstr "Licensa MIT: http://www.opensource.org/licenses/MIT"
|
||||||
|
|
||||||
|
msgid "Molten Glass"
|
||||||
|
msgstr "Vidro Derretido"
|
||||||
|
|
||||||
|
msgid "Molten Rock"
|
||||||
|
msgstr "Pedra Derretida"
|
||||||
|
|
||||||
|
msgid "NodeCore"
|
||||||
|
msgstr "NodeCore"
|
||||||
|
|
||||||
|
msgid "Not all game content is covered by hints. Explore!"
|
||||||
|
msgstr "As dicas não cobrem todo o conteúdo do jogo. Explore!"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Inventory Management"
|
||||||
|
msgstr "Guia do Jogador: Gerenciamento de Inventário"
|
||||||
|
|
||||||
|
msgid "Player's Guide: Pummeling Recipes"
|
||||||
|
msgstr "Guia do Jogador: Receitas por Esmurrada"
|
||||||
|
|
||||||
|
msgid "Prism"
|
||||||
|
msgstr "Prisma"
|
||||||
|
|
||||||
|
msgid "Progress: @1 complete, @2 current, @3 future"
|
||||||
|
msgstr "Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)"
|
||||||
|
|
||||||
|
msgid "Pummel"
|
||||||
|
msgstr "Esmurrar"
|
||||||
|
|
||||||
|
msgid "Sand"
|
||||||
|
msgstr "Areia"
|
||||||
|
|
||||||
|
msgid "See included LICENSE file for full details and credits"
|
||||||
|
msgstr "Veja o arquivo de LICENSA incluso para créditos e maiores detalhes"
|
||||||
|
|
||||||
|
msgid "Shining Lens"
|
||||||
|
msgstr "Lente Brilhante"
|
||||||
|
|
||||||
|
msgid "Sponge"
|
||||||
|
msgstr "Esponja"
|
||||||
|
|
||||||
|
msgid "Staff"
|
||||||
|
msgstr "Bastão"
|
||||||
|
|
||||||
|
msgid "Stick"
|
||||||
|
msgstr "Graveto"
|
||||||
|
|
||||||
|
msgid "Stone"
|
||||||
|
msgstr "Pedra"
|
||||||
|
|
||||||
|
msgid "Stone Chip"
|
||||||
|
msgstr "Pedaço de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Hatchet"
|
||||||
|
msgstr "Machado com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Mallet"
|
||||||
|
msgstr "Marreta com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Pick"
|
||||||
|
msgstr "Picareta com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stone-Tipped Spade"
|
||||||
|
msgstr "Pá com Ponta de Pedra"
|
||||||
|
|
||||||
|
msgid "Stump"
|
||||||
|
msgstr "Toco"
|
||||||
|
|
||||||
|
msgid "Teleport to get unstuck (but you can't bring your items)"
|
||||||
|
msgstr "Teleporte para desprender-se (mas você perderá seus itens)"
|
||||||
|
|
||||||
|
msgid "Tempered Lode"
|
||||||
|
msgstr "Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Bar"
|
||||||
|
msgstr "Barra de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Hatchet"
|
||||||
|
msgstr "Machado de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mallet"
|
||||||
|
msgstr "Marreta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mattock"
|
||||||
|
msgstr "Enxada de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Mattock Head"
|
||||||
|
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Pick"
|
||||||
|
msgstr "Picareta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Prill"
|
||||||
|
msgstr "Lascas de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Rod"
|
||||||
|
msgstr "Vara de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Spade"
|
||||||
|
msgstr "Pá de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tempered Lode Spade Head"
|
||||||
|
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
|
||||||
|
|
||||||
|
msgid "Tote (1 Slot)"
|
||||||
|
msgstr "Bolsa (1 Compartimento)"
|
||||||
|
|
||||||
|
msgid "Tote (2 Slots)"
|
||||||
|
msgstr "Bolsa (2 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (3 Slots)"
|
||||||
|
msgstr "Bolsa (3 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (4 Slots)"
|
||||||
|
msgstr "Bolsa (4 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (5 Slots)"
|
||||||
|
msgstr "Bolsa (5 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (6 Slots)"
|
||||||
|
msgstr "Bolsa (6 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (7 Slots)"
|
||||||
|
msgstr "Bolsa (7 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote (8 Slots)"
|
||||||
|
msgstr "Bolsa (8 Compartimentos)"
|
||||||
|
|
||||||
|
msgid "Tote Handle"
|
||||||
|
msgstr "Alça de Bolsa"
|
||||||
|
|
||||||
|
msgid "Tree Trunk"
|
||||||
|
msgstr "Tronco de Árvore"
|
||||||
|
|
||||||
|
msgid "Unknown Item"
|
||||||
|
msgstr "Item Desconhecido"
|
||||||
|
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Versão"
|
||||||
|
|
||||||
|
msgid "Water"
|
||||||
|
msgstr "Água"
|
||||||
|
|
||||||
|
msgid "Wet Aggregate"
|
||||||
|
msgstr "Massa Úmida"
|
||||||
|
|
||||||
|
msgid "Wet Sponge"
|
||||||
|
msgstr "Esponja Molhada"
|
||||||
|
|
||||||
|
msgid "Wooden Adze"
|
||||||
|
msgstr "Enxó de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Frame"
|
||||||
|
msgstr "Estrutura de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Hatchet"
|
||||||
|
msgstr "Machado de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Hatchet Head"
|
||||||
|
msgstr "Cabeça de Machado de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Hinged Panel"
|
||||||
|
msgstr "Painel Articulado de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Ladder"
|
||||||
|
msgstr "Escada de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Mallet"
|
||||||
|
msgstr "Marreta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Mallet Head"
|
||||||
|
msgstr "Cabeça de Marreta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Panel"
|
||||||
|
msgstr "Painel de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Pick"
|
||||||
|
msgstr "Picareta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Pick Head"
|
||||||
|
msgstr "Cabeça de Picareta de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Plank"
|
||||||
|
msgstr "Tábua de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Shelf"
|
||||||
|
msgstr "Estante de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Spade"
|
||||||
|
msgstr "Pá de Madeira"
|
||||||
|
|
||||||
|
msgid "Wooden Spade Head"
|
||||||
|
msgstr "Cabeça de Pá de Madeira"
|
||||||
|
|
||||||
|
msgid "https://content.minetest.net/packages/Warr1024/nodecore/"
|
||||||
|
msgstr "https://content.minetest.net/packages/Warr1024/nodecore/"
|
|
@ -0,0 +1,51 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use JSON qw(from_json);
|
||||||
|
|
||||||
|
sub getlang {
|
||||||
|
my $lang = shift();
|
||||||
|
my %db;
|
||||||
|
open(my $fh, "-|", "curl", "https://nodecore.mine.nu/trans/api/translations/nodecore/core/$lang/file/") or die($!);
|
||||||
|
open(my $raw, ">", "src/$lang.txt") or die($!);
|
||||||
|
my $id;
|
||||||
|
while(<$fh>) {
|
||||||
|
print $raw $_;
|
||||||
|
m#^\s*msgid\s+"(.*)"\s*$# and $id = $1;
|
||||||
|
m#^\s*msgstr\s+"(.*)"\s*$# or next;
|
||||||
|
my $str = $1;
|
||||||
|
$str =~ m#\S# or next;
|
||||||
|
$db{$id} = $str;
|
||||||
|
}
|
||||||
|
close($fh);
|
||||||
|
close($raw);
|
||||||
|
return \%db;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub savelang {
|
||||||
|
my $lang = shift();
|
||||||
|
my $en = shift();
|
||||||
|
my %db = %{getlang($lang)};
|
||||||
|
map { $en->{$_} and $db{$_} ne $_ or delete $db{$_} } keys %db;
|
||||||
|
%db or return;
|
||||||
|
open(my $fh, ">", "nc_api.$lang.tr") or die($!);
|
||||||
|
print $fh "# textdomain: nc_api\n";
|
||||||
|
print $fh map { "$_=$db{$_}\n" } sort keys %db;
|
||||||
|
close($fh);
|
||||||
|
warn("updated: $lang\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
my $en = getlang("en");
|
||||||
|
my $page = "https://nodecore.mine.nu/trans/api/translations/?format=json";
|
||||||
|
while($page) {
|
||||||
|
open(my $fh, "-|", "curl", $page) or die($!);
|
||||||
|
my $json = from_json(do { local $/; <$fh> });
|
||||||
|
close($fh);
|
||||||
|
$page = $json->{next};
|
||||||
|
for my $r ( @{$json->{results}} ) {
|
||||||
|
$r->{component}->{slug} eq "core" or next;
|
||||||
|
$r->{component}->{project}->{slug} eq "nodecore" or next;
|
||||||
|
my $code = $r->{language}->{code};
|
||||||
|
$code eq 'en' or savelang($code, $en);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local VoxelArea, ipairs, math, minetest, nodecore, table
|
||||||
|
= VoxelArea, ipairs, math, minetest, nodecore, table
|
||||||
|
local math_floor, table_insert
|
||||||
|
= math.floor, table.insert
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local mapgens = {}
|
||||||
|
nodecore.registered_mapgen_shared = mapgens
|
||||||
|
|
||||||
|
local prios = {}
|
||||||
|
|
||||||
|
function nodecore.register_mapgen_shared(func, prio)
|
||||||
|
prio = prio or 0
|
||||||
|
local min = 1
|
||||||
|
local max = #mapgens + 1
|
||||||
|
while max > min do
|
||||||
|
local try = math_floor((min + max) / 2)
|
||||||
|
local oldp = prios[try]
|
||||||
|
if prio < oldp then
|
||||||
|
min = try + 1
|
||||||
|
else
|
||||||
|
max = try
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table_insert(mapgens, min, func)
|
||||||
|
table_insert(prios, min, prio)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_on_generated(function(minp, maxp)
|
||||||
|
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||||
|
local data = vm:get_data()
|
||||||
|
local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
|
||||||
|
|
||||||
|
for _, v in ipairs(mapgens) do
|
||||||
|
v(minp, maxp, area, data, vm, emin, emax)
|
||||||
|
end
|
||||||
|
|
||||||
|
vm:set_data(data)
|
||||||
|
vm:write_to_map()
|
||||||
|
end)
|
|
@ -0,0 +1,88 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, pairs, type
|
||||||
|
= minetest, nodecore, pairs, type
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local match_skip = {
|
||||||
|
name = true,
|
||||||
|
param2 = true,
|
||||||
|
param = true,
|
||||||
|
groups = true,
|
||||||
|
stack = true,
|
||||||
|
count = true,
|
||||||
|
excess = true,
|
||||||
|
wear = true,
|
||||||
|
stacked = true,
|
||||||
|
any = true
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodecore.match(thing, crit)
|
||||||
|
if not thing then return end
|
||||||
|
|
||||||
|
if type(crit) == "string" then crit = {name = crit} end
|
||||||
|
|
||||||
|
if crit.any then
|
||||||
|
for _, v in pairs(crit.any) do
|
||||||
|
local found = nodecore.match(thing, v)
|
||||||
|
if found then return found end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
thing.count = thing.count or 1
|
||||||
|
|
||||||
|
thing = nodecore.underride({}, thing)
|
||||||
|
if thing.stack then
|
||||||
|
thing.name = thing.stack:get_name()
|
||||||
|
thing.count = thing.stack:get_count()
|
||||||
|
thing.wear = thing.stack:get_wear()
|
||||||
|
thing.stacked = true
|
||||||
|
end
|
||||||
|
if not thing.name then
|
||||||
|
thing = nodecore.underride(thing, minetest.get_node(thing))
|
||||||
|
end
|
||||||
|
local def = minetest.registered_items[thing.name]
|
||||||
|
if (not thing.stacked) and def and def.groups and def.groups.is_stack_only then
|
||||||
|
local stack = nodecore.stack_get(thing)
|
||||||
|
if stack and not stack:is_empty() then
|
||||||
|
thing.name = stack:get_name()
|
||||||
|
def = minetest.registered_items[thing.name]
|
||||||
|
thing.count = stack:get_count()
|
||||||
|
thing.wear = stack:get_wear()
|
||||||
|
end
|
||||||
|
thing.stacked = true
|
||||||
|
end
|
||||||
|
if crit.stacked and not thing.stacked then return end
|
||||||
|
if crit.stacked == false and thing.stacked then return end
|
||||||
|
|
||||||
|
if crit.name and thing.name ~= crit.name then return end
|
||||||
|
if crit.param2 and thing.param2 ~= crit.param2 then return end
|
||||||
|
if crit.param and thing.param ~= crit.param then return end
|
||||||
|
if crit.count and thing.count < crit.count then return end
|
||||||
|
if crit.count and (not crit.excess) and thing.count > crit.count then return end
|
||||||
|
if crit.count == nil and thing.count ~= 1 then return end
|
||||||
|
if crit.wear then
|
||||||
|
if crit.wear < 1 then crit.wear = crit.wear * 65535 end
|
||||||
|
if thing.wear > crit.wear then return end
|
||||||
|
end
|
||||||
|
|
||||||
|
if crit.groups then
|
||||||
|
if (not def) or (not def.groups) then return end
|
||||||
|
for k, v in pairs(crit.groups) do
|
||||||
|
if v == true then
|
||||||
|
if not def.groups[k] then return end
|
||||||
|
elseif v == false then
|
||||||
|
if def.groups[k] then return end
|
||||||
|
else
|
||||||
|
if def.groups[k] ~= v then return end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for k, v in pairs(crit) do
|
||||||
|
if not match_skip[k] then
|
||||||
|
if not def or def[k] ~= v then return end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return thing
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
name = nc_api
|
|
@ -0,0 +1,65 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore
|
||||||
|
= math, minetest, nodecore
|
||||||
|
local math_random
|
||||||
|
= math.random
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
function nodecore.register_ambiance(def)
|
||||||
|
local max = def.queue_max or 100
|
||||||
|
local rate = 1 / (def.queue_rate or 20)
|
||||||
|
|
||||||
|
local seen = {}
|
||||||
|
local queue = {}
|
||||||
|
local total = 0
|
||||||
|
|
||||||
|
local batch
|
||||||
|
local time = 0
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
time = time + dtime
|
||||||
|
while time > rate do
|
||||||
|
if not batch then
|
||||||
|
if #queue < 1 then return end
|
||||||
|
batch = queue
|
||||||
|
queue = {}
|
||||||
|
total = 0
|
||||||
|
seen = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
local opts = batch[#batch]
|
||||||
|
batch[#batch] = nil
|
||||||
|
if #batch < 1 then batch = nil end
|
||||||
|
|
||||||
|
opts.name = opts.name or def.sound_name
|
||||||
|
opts.gain = opts.gain or def.sound_gain
|
||||||
|
minetest.sound_play(opts.name, opts)
|
||||||
|
|
||||||
|
time = time - rate
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
def.action = function(pos)
|
||||||
|
local hash = minetest.hash_node_position(pos)
|
||||||
|
if seen[hash] then return end
|
||||||
|
seen[hash] = true
|
||||||
|
local opts
|
||||||
|
if def.check then
|
||||||
|
opts = def.check(pos)
|
||||||
|
if not opts then return end
|
||||||
|
else
|
||||||
|
opts = {}
|
||||||
|
end
|
||||||
|
opts.pos = pos
|
||||||
|
if #queue < max then
|
||||||
|
queue[#queue + 1] = opts
|
||||||
|
else
|
||||||
|
local r = math_random(1, total + 1)
|
||||||
|
if r <= #queue then
|
||||||
|
queue[r] = opts
|
||||||
|
end
|
||||||
|
end
|
||||||
|
total = total + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
return nodecore.register_limited_abm(def)
|
||||||
|
end
|
|
@ -0,0 +1,74 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore, pairs, unpack
|
||||||
|
= math, minetest, nodecore, pairs, unpack
|
||||||
|
local math_random
|
||||||
|
= math.random
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local genlabels = 0
|
||||||
|
|
||||||
|
function nodecore.register_limited_abm(def)
|
||||||
|
def = nodecore.underride(def, {
|
||||||
|
limited_queue = {},
|
||||||
|
limited_seen = {},
|
||||||
|
limited_qty = 0,
|
||||||
|
limited_max = 1000,
|
||||||
|
limited_interval = 1,
|
||||||
|
limited_jitter = 0.05,
|
||||||
|
limited_action = def.action or function() end,
|
||||||
|
catch_up = false
|
||||||
|
})
|
||||||
|
|
||||||
|
if not def.label then
|
||||||
|
def.label = minetest.get_current_modname() .. ":" .. genlabels
|
||||||
|
genlabels = genlabels + 1
|
||||||
|
end
|
||||||
|
def.limited_alert = def.limited_alert or def.limited_max
|
||||||
|
|
||||||
|
def.action = function(pos, ...)
|
||||||
|
local hash = minetest.hash_node_position(pos)
|
||||||
|
local seen = def.limited_seen
|
||||||
|
if seen[hash] then return end
|
||||||
|
seen[hash] = true
|
||||||
|
|
||||||
|
local q = def.limited_queue
|
||||||
|
local max = def.limited_max
|
||||||
|
local nqty = def.limited_qty + 1
|
||||||
|
if #q < max then
|
||||||
|
q[#q + 1] = {pos, ...}
|
||||||
|
else
|
||||||
|
local r = math_random(1, nqty)
|
||||||
|
if r <= #q then q[r] = {pos, ...} end
|
||||||
|
end
|
||||||
|
def.limited_qty = nqty
|
||||||
|
end
|
||||||
|
|
||||||
|
local function pumpq()
|
||||||
|
minetest.after(def.limited_interval
|
||||||
|
- def.limited_jitter
|
||||||
|
+ def.limited_jitter * math_random() * 2,
|
||||||
|
pumpq)
|
||||||
|
|
||||||
|
if def.limited_qty >= def.limited_alert then
|
||||||
|
minetest.log("limited abm \"" .. def.label .. "\" filled ("
|
||||||
|
.. def.limited_qty .. "/" .. def.limited_max .. ")")
|
||||||
|
end
|
||||||
|
|
||||||
|
local act = def.limited_action
|
||||||
|
for _, args in pairs(def.limited_queue) do
|
||||||
|
local pos = args[1]
|
||||||
|
local node = pos and args[2]
|
||||||
|
local nn = node and minetest.get_node_or_nil(pos)
|
||||||
|
if nn and nn.name == node.name then
|
||||||
|
act(unpack(args))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def.limited_queue = {}
|
||||||
|
def.limited_seen = {}
|
||||||
|
def.limited_qty = 0
|
||||||
|
end
|
||||||
|
pumpq()
|
||||||
|
|
||||||
|
return minetest.register_abm(def)
|
||||||
|
end
|
|
@ -0,0 +1,34 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, pairs, string, table
|
||||||
|
= minetest, nodecore, pairs, string, table
|
||||||
|
local string_format, table_concat, table_sort
|
||||||
|
= string.format, table.concat, table.sort
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.coremods = {}
|
||||||
|
|
||||||
|
function nodecore.amcoremod(v)
|
||||||
|
nodecore.coremods[minetest.get_current_modname()] = (v == nil) or v
|
||||||
|
end
|
||||||
|
nodecore.amcoremod()
|
||||||
|
|
||||||
|
for k, v in pairs(minetest.registered_chatcommands) do
|
||||||
|
if k == "mods" then
|
||||||
|
minetest.override_chatcommand(k, nodecore.underride({
|
||||||
|
func = function()
|
||||||
|
local mods = {}
|
||||||
|
for _, n in pairs(minetest.get_modnames()) do
|
||||||
|
if not nodecore.coremods[n] then
|
||||||
|
mods[#mods + 1] = n
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table_sort(mods)
|
||||||
|
return true, string_format("%s(%s)%s%s",
|
||||||
|
nodecore.product,
|
||||||
|
nodecore.version or "DEV",
|
||||||
|
#mods > 0 and " + " or "",
|
||||||
|
table_concat(mods, ", "))
|
||||||
|
end
|
||||||
|
}, v))
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,68 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local error, math, minetest, nodecore, type
|
||||||
|
= error, math, minetest, nodecore, type
|
||||||
|
local math_floor, math_sqrt
|
||||||
|
= math.floor, math.sqrt
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
function nodecore.register_soaking_abm(def)
|
||||||
|
def.qtyfield = def.qtyfield or "soakqty"
|
||||||
|
def.timefield = def.timefield or "soaktime"
|
||||||
|
|
||||||
|
def.soakinterval = def.soakinterval or ((def.interval or 1) * (def.chance or 1))
|
||||||
|
|
||||||
|
if not def.soakrate then error("soaking abm missing soakrate callback") end
|
||||||
|
if not def.soakcheck then error("soaking abm missing soakcheck callback") end
|
||||||
|
|
||||||
|
def.soakvary = def.soakvary or 0.25
|
||||||
|
if not def.soakrand then
|
||||||
|
if def.soakvary then
|
||||||
|
def.soakrand = function(rate, ticks)
|
||||||
|
return rate * (1 + def.soakvary * nodecore.boxmuller()
|
||||||
|
/ math_sqrt(ticks)) * ticks
|
||||||
|
end
|
||||||
|
else
|
||||||
|
def.soakrand = function(rate, ticks) return rate * ticks end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def.action = function(pos, ...)
|
||||||
|
local now = minetest.get_gametime()
|
||||||
|
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local total = meta:get_float(def.qtyfield) or 0
|
||||||
|
local start = meta:get_float(def.timefield)
|
||||||
|
start = start and start ~= 0 and start or now
|
||||||
|
|
||||||
|
local rate = 0
|
||||||
|
local delta = 0
|
||||||
|
if start <= now then
|
||||||
|
rate = def.soakrate(pos, ...)
|
||||||
|
if rate == false then
|
||||||
|
meta:set_string(def.qtyfield, "")
|
||||||
|
meta:set_string(def.timefield, "")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
rate = rate or 0
|
||||||
|
local ticks = 1 + math_floor((now - start) / def.soakinterval)
|
||||||
|
delta = def.soakrand(rate, ticks)
|
||||||
|
total = total + delta
|
||||||
|
start = start + ticks * def.soakinterval
|
||||||
|
end
|
||||||
|
|
||||||
|
local set = def.soakcheck({
|
||||||
|
rate = rate,
|
||||||
|
delta = delta,
|
||||||
|
total = total
|
||||||
|
}, pos, ...)
|
||||||
|
if set == false then
|
||||||
|
meta:set_string(def.qtyfield, "")
|
||||||
|
meta:set_string(def.timefield, "")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
meta:set_float(def.qtyfield, set and type(set) == "number" and set or total)
|
||||||
|
meta:set_float(def.timefield, start)
|
||||||
|
end
|
||||||
|
|
||||||
|
return nodecore.register_limited_abm(def)
|
||||||
|
end
|
After Width: | Height: | Size: 429 B |
After Width: | Height: | Size: 103 B |
|
@ -0,0 +1,26 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local error, ipairs, minetest, nodecore
|
||||||
|
= error, ipairs, minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
function nodecore.ezschematic(key, yslices, init)
|
||||||
|
local size = {}
|
||||||
|
local data = {}
|
||||||
|
size.y = #yslices
|
||||||
|
for y, ys in ipairs(yslices) do
|
||||||
|
if size.z and size.z ~= #ys then error("inconsistent z size") end
|
||||||
|
size.z = #ys
|
||||||
|
for z, zs in ipairs(ys) do
|
||||||
|
if size.x and size.x ~= #zs then error("inconsistent x size") end
|
||||||
|
size.x = #zs
|
||||||
|
for x = 1, zs:len() do
|
||||||
|
data[(z - 1) * size.x * size.y + (y - 1) * size.x + x]
|
||||||
|
= key[zs:sub(x, x)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
init = init or {}
|
||||||
|
init.size = size
|
||||||
|
init.data = data
|
||||||
|
return minetest.register_schematic(init)
|
||||||
|
end
|
|
@ -0,0 +1,58 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local nodecore, pairs, vector
|
||||||
|
= nodecore, pairs, vector
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local alldirs = {}
|
||||||
|
for _, v in pairs(nodecore.dirs()) do
|
||||||
|
alldirs[v.n] = v
|
||||||
|
end
|
||||||
|
|
||||||
|
local facedirs = {
|
||||||
|
{"u", "w"},
|
||||||
|
{"u", "n"},
|
||||||
|
{"u", "e"},
|
||||||
|
{"n", "u"},
|
||||||
|
{"n", "w"},
|
||||||
|
{"n", "d"},
|
||||||
|
{"n", "e"},
|
||||||
|
{"s", "d"},
|
||||||
|
{"s", "w"},
|
||||||
|
{"s", "u"},
|
||||||
|
{"s", "e"},
|
||||||
|
{"e", "s"},
|
||||||
|
{"e", "u"},
|
||||||
|
{"e", "n"},
|
||||||
|
{"e", "d"},
|
||||||
|
{"w", "s"},
|
||||||
|
{"w", "d"},
|
||||||
|
{"w", "n"},
|
||||||
|
{"w", "u"},
|
||||||
|
{"d", "s"},
|
||||||
|
{"d", "e"},
|
||||||
|
{"d", "n"},
|
||||||
|
{"d", "w"},
|
||||||
|
[0] = {"u", "s"}
|
||||||
|
}
|
||||||
|
|
||||||
|
local function cross(a, b)
|
||||||
|
return {
|
||||||
|
x = a.y * b.z - a.z * b.y,
|
||||||
|
y = a.z * b.x - a.x * b.z,
|
||||||
|
z = a.x * b.y - a.y * b.x
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
for k, t in pairs(facedirs) do
|
||||||
|
t.id = k
|
||||||
|
t.t = alldirs[t[1]]
|
||||||
|
t.f = alldirs[t[2]]
|
||||||
|
t[2] = nil
|
||||||
|
t[1] = nil
|
||||||
|
t.l = cross(t.t, t.f)
|
||||||
|
t.r = vector.multiply(t.l, -1)
|
||||||
|
t.b = vector.multiply(t.t, -1)
|
||||||
|
t.k = vector.multiply(t.f, -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
nodecore.facedirs = facedirs
|
|
@ -0,0 +1,19 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, pairs
|
||||||
|
= minetest, nodecore, pairs
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local queue
|
||||||
|
|
||||||
|
function nodecore.fallcheck(pos)
|
||||||
|
if not queue then
|
||||||
|
queue = {}
|
||||||
|
minetest.after(0, function()
|
||||||
|
for _, p in pairs(queue) do
|
||||||
|
minetest.check_for_falling(p)
|
||||||
|
end
|
||||||
|
queue = nil
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
queue[minetest.pos_to_string(pos)] = pos
|
||||||
|
end
|
|
@ -0,0 +1,273 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack
|
||||||
|
= ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack
|
||||||
|
local math_cos, math_log, math_pi, math_random, math_sin, math_sqrt
|
||||||
|
= math.cos, math.log, math.pi, math.random, math.sin, math.sqrt
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
for k, v in pairs(minetest) do
|
||||||
|
if type(v) == "function" then
|
||||||
|
-- Late-bind in case minetest methods overridden.
|
||||||
|
nodecore[k] = function(...) return minetest[k](...) end
|
||||||
|
else
|
||||||
|
nodecore[k] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function underride(t, u, u2, ...)
|
||||||
|
if u2 then underride(u, u2, ...) end
|
||||||
|
for k, v in pairs(u) do
|
||||||
|
if t[k] == nil then
|
||||||
|
t[k] = v
|
||||||
|
elseif type(t[k]) == "table" and type(v) == "table" then
|
||||||
|
underride(t[k], v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
nodecore.underride = underride
|
||||||
|
|
||||||
|
function nodecore.mkreg()
|
||||||
|
local t = {}
|
||||||
|
local f = function(x) t[#t + 1] = x end
|
||||||
|
return f, t
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.memoize(func)
|
||||||
|
local cache
|
||||||
|
return function()
|
||||||
|
if cache then return cache[1] end
|
||||||
|
cache = {func()}
|
||||||
|
return cache[1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.dirs()
|
||||||
|
return {
|
||||||
|
{n = "e", x = 1, y = 0, z = 0},
|
||||||
|
{n = "w", x = -1, y = 0, z = 0},
|
||||||
|
{n = "u", x = 0, y = 1, z = 0},
|
||||||
|
{n = "d", x = 0, y = -1, z = 0},
|
||||||
|
{n = "n", x = 0, y = 0, z = 1},
|
||||||
|
{n = "s", x = 0, y = 0, z = -1}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.pickrand(tbl, weight)
|
||||||
|
weight = weight or function() end
|
||||||
|
local t = {}
|
||||||
|
local max = 0
|
||||||
|
for k, v in pairs(tbl) do
|
||||||
|
local w = weight(v) or 1
|
||||||
|
if w > 0 then
|
||||||
|
max = max + w
|
||||||
|
t[#t + 1] = {w = w, k = k, v = v}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if max <= 0 then return end
|
||||||
|
max = math_random() * max
|
||||||
|
for _, v in ipairs(t) do
|
||||||
|
max = max - v.w
|
||||||
|
if max <= 0 then return v.v, v.k end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local saved
|
||||||
|
function nodecore.boxmuller()
|
||||||
|
local old = saved
|
||||||
|
if old then
|
||||||
|
saved = nil
|
||||||
|
return old
|
||||||
|
end
|
||||||
|
local r = math_sqrt(-2 * math_log(math_random()))
|
||||||
|
local t = 2 * math_pi * math_random()
|
||||||
|
saved = r * math_sin(t)
|
||||||
|
return r * math_cos(t)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.extend_item(name, func)
|
||||||
|
local orig = minetest.registered_items[name] or {}
|
||||||
|
local copy = {}
|
||||||
|
for k, v in pairs(orig) do copy[k] = v end
|
||||||
|
copy = func(copy, orig) or copy
|
||||||
|
minetest.register_item(":" .. name, copy)
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.fixedbox(x, ...)
|
||||||
|
return {type = "fixed", fixed = {
|
||||||
|
x or {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
||||||
|
...
|
||||||
|
}}
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.interact(player)
|
||||||
|
if type(player) ~= "string" then
|
||||||
|
player = player:get_player_name()
|
||||||
|
end
|
||||||
|
return minetest.get_player_privs(player).interact
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.wieldgroup(who, group)
|
||||||
|
local wielded = who and who:get_wielded_item()
|
||||||
|
local nodedef = minetest.registered_nodes[wielded:get_name()]
|
||||||
|
if nodedef then return nodedef.groups and nodedef.groups[group] end
|
||||||
|
local caps = wielded and wielded:get_tool_capabilities()
|
||||||
|
return caps and caps.groupcaps and caps.groupcaps[group]
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.toolspeed(what, groups)
|
||||||
|
if not what then return end
|
||||||
|
local dg = what:get_tool_capabilities().groupcaps
|
||||||
|
local t
|
||||||
|
for gn, lv in pairs(groups) do
|
||||||
|
local gt = dg[gn]
|
||||||
|
gt = gt and gt.times
|
||||||
|
gt = gt and gt[lv]
|
||||||
|
if gt and (not t or t > gt) then t = gt end
|
||||||
|
end
|
||||||
|
if (not t) and (not what:is_empty()) then
|
||||||
|
return nodecore.toolspeed(ItemStack(""), groups)
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.interval(after, func)
|
||||||
|
local function go()
|
||||||
|
minetest.after(after, go)
|
||||||
|
return func()
|
||||||
|
end
|
||||||
|
minetest.after(after, go)
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.wear_wield(player, groups, qty)
|
||||||
|
local wielded = player:get_wielded_item()
|
||||||
|
if wielded then
|
||||||
|
local wdef = wielded:get_definition()
|
||||||
|
local tp = wielded:get_tool_capabilities()
|
||||||
|
local dp = minetest.get_dig_params(groups, tp)
|
||||||
|
if wdef and wdef.after_use then
|
||||||
|
wielded = wdef.after_use(wielded, player, nil, dp) or wielded
|
||||||
|
else
|
||||||
|
if not minetest.settings:get_bool("creative_mode") then
|
||||||
|
wielded:add_wear(dp.wear * (qty or 1))
|
||||||
|
if wielded:get_count() <= 0 and wdef.sound
|
||||||
|
and wdef.sound.breaks then
|
||||||
|
minetest.sound_play(wdef.sound.breaks,
|
||||||
|
{object = player, gain = 0.5})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return player:set_wielded_item(wielded)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.consume_wield(player, qty)
|
||||||
|
local wielded = player:get_wielded_item()
|
||||||
|
if wielded then
|
||||||
|
local wdef = wielded:get_definition()
|
||||||
|
if wdef.stack_max > 1 and qty then
|
||||||
|
local have = wielded:get_count() - qty
|
||||||
|
if have <= 0 then
|
||||||
|
wielded = ItemStack("")
|
||||||
|
else
|
||||||
|
wielded:set_count(have)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return player:set_wielded_item(wielded)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.loaded_mods()
|
||||||
|
local t = {}
|
||||||
|
for _, v in pairs(minetest.get_modnames()) do
|
||||||
|
t[v] = true
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.node_group(name, pos, node)
|
||||||
|
node = node or minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_nodes[node.name] or {}
|
||||||
|
return def.groups and def.groups[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.item_eject(pos, stack, speed, qty, vel)
|
||||||
|
stack = ItemStack(stack)
|
||||||
|
speed = speed or 0
|
||||||
|
vel = vel or {x = 0, y = 0, z = 0}
|
||||||
|
if speed == 0 and vel.x == 0 and vel.y == 0 and vel.z == 0
|
||||||
|
and nodecore.place_stack and minetest.get_node(pos).name == "air" then
|
||||||
|
stack:set_count(stack:get_count() * (qty or 1))
|
||||||
|
return nodecore.place_stack(pos, stack)
|
||||||
|
end
|
||||||
|
for _ = 1, (qty or 1) do
|
||||||
|
local v = {
|
||||||
|
x = vel.x + (math_random() - 0.5) * speed,
|
||||||
|
y = vel.y + math_random() * speed,
|
||||||
|
z = vel.z + (math_random() - 0.5) * speed,
|
||||||
|
}
|
||||||
|
local p = {
|
||||||
|
x = v.x > 0 and pos.x + 0.4 or v.x < 0 and pos.x - 0.4 or pos.x,
|
||||||
|
y = pos.y + 0.25,
|
||||||
|
z = v.z > 0 and pos.z + 0.4 or v.z < 0 and pos.z - 0.4 or pos.z,
|
||||||
|
}
|
||||||
|
local obj = minetest.add_item(p, stack)
|
||||||
|
if obj then obj:set_velocity(v) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.quenched(pos)
|
||||||
|
return #minetest.find_nodes_in_area(
|
||||||
|
{x = pos.x - 1, y = pos.y - 1, z = pos.z - 1},
|
||||||
|
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
|
||||||
|
{"group:coolant"}) > 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.node_spin_custom(...)
|
||||||
|
local arr = {...}
|
||||||
|
arr[0] = false
|
||||||
|
local lut = {}
|
||||||
|
for i = 1, #arr do
|
||||||
|
lut[arr[i - 1]] = arr[i]
|
||||||
|
end
|
||||||
|
lut[arr[#arr]] = arr[1]
|
||||||
|
local qty = #arr
|
||||||
|
|
||||||
|
return function(pos, node, clicker, itemstack)
|
||||||
|
node = node or minetest.get_node(pos)
|
||||||
|
node.param2 = lut[node.param2] or lut[false]
|
||||||
|
if clicker:is_player() then
|
||||||
|
minetest.log(clicker:get_player_name() .. " spins "
|
||||||
|
.. node.name .. " at " .. minetest.pos_to_string(pos)
|
||||||
|
.. " to param2 " .. node.param2 .. " ("
|
||||||
|
.. qty .. " total)")
|
||||||
|
end
|
||||||
|
minetest.swap_node(pos, node)
|
||||||
|
nodecore.node_sound(pos, "place")
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
if def.on_spin then def.on_spin(pos, node) end
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function nodecore.node_spin_filtered(func)
|
||||||
|
local rots = {}
|
||||||
|
for i = 0, 23 do
|
||||||
|
local f = nodecore.facedirs[i]
|
||||||
|
local hit
|
||||||
|
for j = 1, #rots do
|
||||||
|
if not hit then
|
||||||
|
local o = nodecore.facedirs[rots[j]]
|
||||||
|
hit = hit or func(f, o)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not hit then rots[#rots + 1] = f.id end
|
||||||
|
end
|
||||||
|
return nodecore.node_spin_custom(unpack(rots))
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.node_change(pos, node, newname)
|
||||||
|
if node.name == newname then return end
|
||||||
|
return minetest.set_node(pos, underride({name = newname}, node))
|
||||||
|
end
|
|
@ -0,0 +1,13 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore
|
||||||
|
= minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
function nodecore.buildable_to(thing)
|
||||||
|
if not thing.name then
|
||||||
|
thing = nodecore.underride(thing, minetest.get_node(thing))
|
||||||
|
end
|
||||||
|
if thing.name == "ignore" then return end
|
||||||
|
local def = minetest.registered_items[thing.name] or {}
|
||||||
|
return def.buildable_to
|
||||||
|
end
|
|
@ -0,0 +1,32 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore
|
||||||
|
= math, minetest, nodecore
|
||||||
|
local math_ceil
|
||||||
|
= math.ceil
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local function getphealth(player)
|
||||||
|
return player:get_hp() + player:get_meta():get_float("dhp")
|
||||||
|
end
|
||||||
|
nodecore.getphealth = getphealth
|
||||||
|
|
||||||
|
local function setphealth(player, hp)
|
||||||
|
if hp > 20 then hp = 20 end
|
||||||
|
if hp < 0 then hp = 0 end
|
||||||
|
local whole = math_ceil(hp)
|
||||||
|
if whole == 0 then whole = 1 end
|
||||||
|
local dhp = hp - whole
|
||||||
|
player:get_meta():set_float("dhp", dhp)
|
||||||
|
return player:set_hp(whole)
|
||||||
|
end
|
||||||
|
nodecore.setphealth = setphealth
|
||||||
|
|
||||||
|
local function addphealth(player, hp)
|
||||||
|
return setphealth(player, getphealth(player) + hp)
|
||||||
|
end
|
||||||
|
nodecore.addphealth = addphealth
|
||||||
|
|
||||||
|
function nodecore.node_punch_hurt(pos, node, puncher, ...)
|
||||||
|
if puncher and puncher:is_player() then addphealth(puncher, -1) end
|
||||||
|
return minetest.node_punch(pos, node, puncher, ...)
|
||||||
|
end
|
|
@ -0,0 +1,41 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ipairs, math, minetest, nodecore, pairs, table
|
||||||
|
= ipairs, math, minetest, nodecore, pairs, table
|
||||||
|
local math_random, table_insert
|
||||||
|
= math.random, table.insert
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local dirs = nodecore.dirs()
|
||||||
|
|
||||||
|
function nodecore.scan_flood(pos, range, func)
|
||||||
|
local q = {pos}
|
||||||
|
local seen = { }
|
||||||
|
for d = 0, range do
|
||||||
|
local nxt = {}
|
||||||
|
for _, p in ipairs(q) do
|
||||||
|
local res = func(p, d)
|
||||||
|
if res then return res end
|
||||||
|
if res == nil then
|
||||||
|
for _, v in pairs(dirs) do
|
||||||
|
local np = {
|
||||||
|
x = p.x + v.x,
|
||||||
|
y = p.y + v.y,
|
||||||
|
z = p.z + v.z
|
||||||
|
}
|
||||||
|
local nk = minetest.hash_node_position(np)
|
||||||
|
if not seen[nk] then
|
||||||
|
seen[nk] = true
|
||||||
|
np.dir = v
|
||||||
|
table_insert(nxt, np)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #nxt < 1 then break end
|
||||||
|
for i = 1, #nxt do
|
||||||
|
local j = math_random(1, #nxt)
|
||||||
|
nxt[i], nxt[j] = nxt[j], nxt[i]
|
||||||
|
end
|
||||||
|
q = nxt
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,76 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack,
|
||||||
|
vector
|
||||||
|
= ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack,
|
||||||
|
vector
|
||||||
|
local math_exp, math_random, math_sin, math_sqrt
|
||||||
|
= math.exp, math.random, math.sin, math.sqrt
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local oldplay = minetest.sound_play
|
||||||
|
function minetest.sound_play(name, spec, ...)
|
||||||
|
if spec and type(spec) == "table" and spec.pitch == nil then
|
||||||
|
spec.pitch = math_exp((math_random() - 0.5) * (spec.pitchvary or 0.05))
|
||||||
|
end
|
||||||
|
return oldplay(name, spec, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.windiness(y)
|
||||||
|
if y < 0 then return 0 end
|
||||||
|
if y > 512 then y = 512 end
|
||||||
|
return math_sqrt(y) * (1 + 0.5 * math_sin(minetest.get_gametime() / 5))
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.stack_sounds(pos, kind, stack)
|
||||||
|
stack = stack or nodecore.stack_get(pos)
|
||||||
|
stack = ItemStack(stack)
|
||||||
|
if stack:is_empty() then return end
|
||||||
|
local def = minetest.registered_items[stack:get_name()] or {}
|
||||||
|
if (not def.sounds) or (not def.sounds[kind]) then return end
|
||||||
|
local t = {}
|
||||||
|
for k, v in pairs(def.sounds[kind]) do t[k] = v end
|
||||||
|
t.pos = pos
|
||||||
|
return minetest.sound_play(t.name, t)
|
||||||
|
end
|
||||||
|
function nodecore.stack_sounds_delay(...)
|
||||||
|
local t = {...}
|
||||||
|
minetest.after(0, function()
|
||||||
|
nodecore.stack_sounds(unpack(t))
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
function nodecore.sounds(name, gfoot, gdug, gplace)
|
||||||
|
return {
|
||||||
|
footstep = {name = name, gain = gfoot or 0.2},
|
||||||
|
dig = {name = name, gain = gdug or 0.5},
|
||||||
|
dug = {name = name, gain = gdug or 1},
|
||||||
|
place = {name = name, gain = gplace or 1}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.sound_play_except(name, def, pname)
|
||||||
|
if not pname then
|
||||||
|
return minetest.sound_play(name, def)
|
||||||
|
end
|
||||||
|
if type(pname) ~= "string" then
|
||||||
|
pname = pname:get_player_name()
|
||||||
|
end
|
||||||
|
for _, p in ipairs(minetest.get_connected_players()) do
|
||||||
|
local pn = p:get_player_name()
|
||||||
|
if pn ~= pname and ((not def.pos)
|
||||||
|
or (vector.distance(p:get_pos(), def.pos) <= 32)) then
|
||||||
|
def.to_player = pn
|
||||||
|
minetest.sound_play(name, def)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.node_sound(pos, kind, opts)
|
||||||
|
if nodecore.stack_sounds(pos, kind) then return end
|
||||||
|
local node = opts and opts.node or minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
if (not def.sounds) or (not def.sounds[kind]) then return end
|
||||||
|
local t = {}
|
||||||
|
for k, v in pairs(def.sounds[kind]) do t[k] = v end
|
||||||
|
t.pos = pos
|
||||||
|
return nodecore.sound_play_except(t.name, t, opts and opts.except)
|
||||||
|
end
|
|
@ -0,0 +1,79 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, ipairs, minetest, nodecore
|
||||||
|
= ItemStack, ipairs, minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local function family(stack)
|
||||||
|
if stack:is_empty() then return "" end
|
||||||
|
local name = stack:get_name()
|
||||||
|
local def = minetest.registered_items[name]
|
||||||
|
return def and def.stackfamily or stack:to_string()
|
||||||
|
end
|
||||||
|
function nodecore.stack_merge(dest, src)
|
||||||
|
if dest:is_empty() then return dest:add_item(src) end
|
||||||
|
if family(src) ~= family(dest) then
|
||||||
|
return dest:add_item(src)
|
||||||
|
end
|
||||||
|
local o = src:get_name()
|
||||||
|
src:set_name(dest:get_name())
|
||||||
|
src = dest:add_item(src)
|
||||||
|
if not src:is_empty() then
|
||||||
|
src:set_name(o)
|
||||||
|
end
|
||||||
|
return src
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.node_inv(pos)
|
||||||
|
return minetest.get_meta(pos):get_inventory()
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.stack_get(pos)
|
||||||
|
return nodecore.node_inv(pos):get_stack("solo", 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update(pos, ...)
|
||||||
|
for _, v in ipairs(nodecore.visinv_update_ents(pos)) do
|
||||||
|
v:get_luaentity():itemcheck()
|
||||||
|
end
|
||||||
|
return ...
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.stack_set(pos, stack)
|
||||||
|
return update(pos, nodecore.node_inv(pos):set_stack("solo", 1, ItemStack(stack)))
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.stack_add(pos, stack)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
if def.stack_allow then
|
||||||
|
local ret = def.stack_allow(pos, node, stack)
|
||||||
|
if ret == false then return stack end
|
||||||
|
if ret and ret ~= true then return ret end
|
||||||
|
end
|
||||||
|
stack = ItemStack(stack)
|
||||||
|
local item = nodecore.stack_get(pos)
|
||||||
|
local left
|
||||||
|
if item:is_empty() then
|
||||||
|
left = nodecore.node_inv(pos):add_item("solo", stack)
|
||||||
|
else
|
||||||
|
left = nodecore.stack_merge(item, stack)
|
||||||
|
nodecore.stack_set(pos, item)
|
||||||
|
end
|
||||||
|
if left:get_count() ~= stack:get_count() then
|
||||||
|
nodecore.stack_sounds(pos, "place")
|
||||||
|
end
|
||||||
|
return update(pos, left)
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.stack_giveto(pos, player)
|
||||||
|
local stack = nodecore.stack_get(pos)
|
||||||
|
local qty = stack:get_count()
|
||||||
|
if qty < 1 then return true end
|
||||||
|
|
||||||
|
stack = player:get_inventory():add_item("main", stack)
|
||||||
|
if stack:get_count() == qty then return stack:is_empty() end
|
||||||
|
|
||||||
|
nodecore.stack_sounds(pos, "dug")
|
||||||
|
nodecore.stack_set(pos, stack)
|
||||||
|
return stack:is_empty()
|
||||||
|
end
|
|
@ -0,0 +1,35 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, nodecore, pairs
|
||||||
|
= math, nodecore, pairs
|
||||||
|
local math_pow
|
||||||
|
= math.pow
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local basetimes = {
|
||||||
|
cracky = 3,
|
||||||
|
thumpy = 2,
|
||||||
|
choppy = 2,
|
||||||
|
crumbly = 0.5,
|
||||||
|
snappy = 0.4,
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodecore.toolcaps(opts)
|
||||||
|
if opts.uses == nil then opts.uses = 1 end
|
||||||
|
local gcaps = {}
|
||||||
|
for gn, bt in pairs(basetimes) do
|
||||||
|
local lv = opts[gn]
|
||||||
|
if lv then
|
||||||
|
local times = {}
|
||||||
|
for n = 1, lv do
|
||||||
|
local tt = math_pow(0.5, lv - n) * bt
|
||||||
|
if tt < 0.25 then tt = 0.25 end
|
||||||
|
times[n] = tt
|
||||||
|
end
|
||||||
|
gcaps[gn] = {
|
||||||
|
times = times,
|
||||||
|
uses = 5 * math_pow(3, lv) * opts.uses
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return { groupcaps = gcaps, opts = opts }
|
||||||
|
end
|
|
@ -0,0 +1,48 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ipairs, minetest, nodecore, pairs, table, type
|
||||||
|
= ipairs, minetest, nodecore, pairs, table, type
|
||||||
|
local table_sort
|
||||||
|
= table.sort
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
local strings = {}
|
||||||
|
local strings_dirty
|
||||||
|
|
||||||
|
local prefix = minetest.translate(modname, "x")
|
||||||
|
prefix = prefix:sub(1, prefix:find(modname) - 1)
|
||||||
|
|
||||||
|
function nodecore.translate_inform(str)
|
||||||
|
if (not str) or (type(str) ~= "string") or (#str < 1)
|
||||||
|
or (str:sub(1, #prefix) == prefix) then return end
|
||||||
|
|
||||||
|
if not strings[str] then
|
||||||
|
strings[str] = true
|
||||||
|
strings_dirty = true
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.translate(str, ...)
|
||||||
|
if not nodecore.translate_inform(str) then return str end
|
||||||
|
return minetest.translate(modname, str, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_globalstep(function()
|
||||||
|
if not strings_dirty then return end
|
||||||
|
strings_dirty = nil
|
||||||
|
|
||||||
|
local keys = {}
|
||||||
|
for k in pairs(strings) do keys[#keys + 1] = k end
|
||||||
|
table_sort(keys)
|
||||||
|
|
||||||
|
local data = "# textdomain: " .. modname .. "\n"
|
||||||
|
for _, k in ipairs(keys) do
|
||||||
|
data = data .. k .. "=" .. "\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
local p = minetest.get_worldpath() .. "/" .. modname .. ".template.tr"
|
||||||
|
return minetest.safe_file_write(p, data)
|
||||||
|
end)
|
|
@ -0,0 +1,12 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, tonumber
|
||||||
|
= math, tonumber
|
||||||
|
local math_floor
|
||||||
|
= math.floor
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local stamp = tonumber("$Format:%at$")
|
||||||
|
if not stamp then return end
|
||||||
|
stamp = math_floor((stamp - 1540612800) / 60)
|
||||||
|
stamp = ("00000000" .. stamp):sub(-8)
|
||||||
|
return stamp .. "-$Format:%h$"
|
|
@ -0,0 +1,168 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local ItemStack, ipairs, minetest, nodecore, pairs, type
|
||||||
|
= ItemStack, ipairs, minetest, nodecore, pairs, type
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local function addgroups(sum, pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
if not def.groups then return end
|
||||||
|
for k, v in pairs(def.groups) do
|
||||||
|
sum[k] = (sum[k] or 0) + v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function craftcheck(recipe, pos, node, data, xx, xz, zx, zz)
|
||||||
|
local function rel(x, y, z)
|
||||||
|
return {
|
||||||
|
x = pos.x + xx * x + zx * z,
|
||||||
|
y = pos.y + y,
|
||||||
|
z = pos.z + xz * x + zz * z
|
||||||
|
}
|
||||||
|
end
|
||||||
|
data.rel = rel
|
||||||
|
data.wield = ItemStack(data.wield or data.crafter and data.crafter:get_wielded_item())
|
||||||
|
if recipe.check and not recipe.check(pos, data) then return end
|
||||||
|
if recipe.wield and (not data.wield or not nodecore.match(
|
||||||
|
{stack = data.wield}, recipe.wield)) then return end
|
||||||
|
if recipe.normal then
|
||||||
|
if data.pointed.type ~= "node" or
|
||||||
|
recipe.normal.y ~= data.pointed.above.y - data.pointed.under.y then return end
|
||||||
|
local rx = recipe.normal.x * xx + recipe.normal.z * zx
|
||||||
|
if rx ~= data.pointed.above.x - data.pointed.under.x then return end
|
||||||
|
local rz = recipe.normal.x * xz + recipe.normal.z * zz
|
||||||
|
if rz ~= data.pointed.above.z - data.pointed.under.z then return end
|
||||||
|
end
|
||||||
|
for _, v in pairs(recipe.nodes) do
|
||||||
|
if v ~= recipe.root and v.match then
|
||||||
|
local p = rel(v.x, v.y, v.z)
|
||||||
|
if not nodecore.match(p, v.match) then return end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if recipe.touchgroups then
|
||||||
|
local sum = {}
|
||||||
|
addgroups(sum, rel(1, 0, 0))
|
||||||
|
addgroups(sum, rel(-1, 0, 0))
|
||||||
|
addgroups(sum, rel(0, 1, 0))
|
||||||
|
addgroups(sum, rel(0, -1, 0))
|
||||||
|
addgroups(sum, rel(0, 0, 1))
|
||||||
|
addgroups(sum, rel(0, 0, -1))
|
||||||
|
for k, v in pairs(recipe.touchgroups) do
|
||||||
|
local w = sum[k] or 0
|
||||||
|
if v > 0 and w < v then return end
|
||||||
|
if v <= 0 and w > -v then return end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local mindur = recipe.duration or 0
|
||||||
|
if type(mindur) == "function" then mindur = mindur(recipe, pos, node, data) end
|
||||||
|
if recipe.toolgroups then
|
||||||
|
if not data.wield then return end
|
||||||
|
local dg = data.wield:get_tool_capabilities().groupcaps
|
||||||
|
local t
|
||||||
|
for gn, lv in pairs(recipe.toolgroups) do
|
||||||
|
local gt = dg[gn]
|
||||||
|
gt = gt and gt.times
|
||||||
|
gt = gt and gt[lv]
|
||||||
|
if gt and (not t or t > gt) then t = gt end
|
||||||
|
end
|
||||||
|
if not t then return end
|
||||||
|
mindur = mindur + t
|
||||||
|
end
|
||||||
|
if mindur > 0 then
|
||||||
|
if not data.duration then return end
|
||||||
|
local dur = data.duration
|
||||||
|
if type(dur) == "function" then dur = dur(pos, data) end
|
||||||
|
if not dur or dur < mindur then
|
||||||
|
if data.inprogress then data.inprogress(pos, data) end
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if data.before then data.before(pos, data) end
|
||||||
|
if recipe.before then recipe.before(pos, data) end
|
||||||
|
for _, v in ipairs(recipe.nodes) do
|
||||||
|
if v.replace then
|
||||||
|
local p = rel(v.x, v.y, v.z)
|
||||||
|
local r = v.replace
|
||||||
|
while type(r) == "function" do
|
||||||
|
r = r(p, v)
|
||||||
|
end
|
||||||
|
if r and type(r) == "string" then
|
||||||
|
r = {name = r}
|
||||||
|
end
|
||||||
|
if v.match.excess then
|
||||||
|
local s = nodecore.stack_get(p)
|
||||||
|
local x = s:get_count() - (v.match.count or 1)
|
||||||
|
if x > 0 then
|
||||||
|
s:set_count(x)
|
||||||
|
nodecore.item_eject(p, s, 0.001)
|
||||||
|
end
|
||||||
|
nodecore.stack_set(p, ItemStack(""))
|
||||||
|
end
|
||||||
|
if r then
|
||||||
|
local n = minetest.get_node(p)
|
||||||
|
r.param2 = n.param2
|
||||||
|
minetest.set_node(p, r)
|
||||||
|
nodecore.node_sound(p, "place")
|
||||||
|
nodecore.fallcheck(p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if recipe.items then
|
||||||
|
for _, v in pairs(recipe.items) do
|
||||||
|
nodecore.item_eject(rel(v.x or 0, v.y or 0, v.z or 0),
|
||||||
|
v.name, v.scatter, v.count, v.velocity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if recipe.consumewield then
|
||||||
|
nodecore.consume_wield(data.crafter, recipe.consumewield)
|
||||||
|
elseif recipe.toolgroups and recipe.toolwear and data.crafter then
|
||||||
|
nodecore.wear_wield(data.crafter, recipe.toolgroups, recipe.toolwear)
|
||||||
|
end
|
||||||
|
if recipe.after then recipe.after(pos, data) end
|
||||||
|
if data.after then data.after(pos, data) end
|
||||||
|
if nodecore.player_stat_add then
|
||||||
|
nodecore.player_stat_add(1, data.crafter, "craft", recipe.label)
|
||||||
|
end
|
||||||
|
minetest.log((data.crafter and data.crafter:get_player_name() or "unknown")
|
||||||
|
.. " completed recipe \"" .. recipe.label .. "\" at " ..
|
||||||
|
minetest.pos_to_string(pos) .. " upon " .. node.name)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tryall(rc, pos, node, data)
|
||||||
|
local function go(xx, xz, zx, zz)
|
||||||
|
return craftcheck(rc, pos, node, data, xx, xz, zx, zz)
|
||||||
|
end
|
||||||
|
local r = go(1, 0, 0, 1)
|
||||||
|
if r then return r end
|
||||||
|
if not rc.norotate then
|
||||||
|
r = go(0, -1, 1, 0)
|
||||||
|
or go(-1, 0, 0, -1)
|
||||||
|
or go(0, 1, -1, 0)
|
||||||
|
if r then return r end
|
||||||
|
if not rc.nomirror then
|
||||||
|
r = go(-1, 0, 0, 1)
|
||||||
|
or go(0, 1, 1, 0)
|
||||||
|
or go(1, 0, 0, -1)
|
||||||
|
or go(0, -1, -1, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.craft_check(pos, node, data)
|
||||||
|
data = data or {}
|
||||||
|
node.x = pos.x
|
||||||
|
node.y = pos.y
|
||||||
|
node.z = pos.z
|
||||||
|
data.pos = pos
|
||||||
|
data.node = node
|
||||||
|
for _, rc in ipairs(nodecore.craft_recipes) do
|
||||||
|
if data.action == rc.action
|
||||||
|
and nodecore.match(node, rc.root.match) then
|
||||||
|
data.recipe = rc
|
||||||
|
local r = tryall(rc, pos, node, data)
|
||||||
|
if r then return r == true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,41 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore, type
|
||||||
|
= math, minetest, nodecore, type
|
||||||
|
local math_random
|
||||||
|
= math.random
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local smoking = {}
|
||||||
|
|
||||||
|
function nodecore.smokefx(pos, time, qty)
|
||||||
|
local now = minetest.get_us_time() / 1000000
|
||||||
|
local key = minetest.hash_node_position(pos)
|
||||||
|
local old = smoking[key]
|
||||||
|
if old and now < old.exp then minetest.delete_particlespawner(old.id) end
|
||||||
|
if (not time) or (time <= 0) then
|
||||||
|
smoking[key] = nil
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if type(qty) ~= "number" then qty = 1 end
|
||||||
|
if qty < 1 then
|
||||||
|
if math_random() > qty then return end
|
||||||
|
qty = 1
|
||||||
|
end
|
||||||
|
smoking[key] = {
|
||||||
|
id = minetest.add_particlespawner({
|
||||||
|
texture = "nc_api_craft_smoke.png",
|
||||||
|
collisiondetection = true,
|
||||||
|
amount = (qty or 2) * time,
|
||||||
|
time = time,
|
||||||
|
minpos = {x = pos.x - 0.4, y = pos.y - 0.4, z = pos.z - 0.4},
|
||||||
|
maxpos = {x = pos.x + 0.4, y = pos.y + 0.4, z = pos.z + 0.4},
|
||||||
|
minvel = {x = -0.1, y = 0.3, z = -0.1},
|
||||||
|
maxvel = {x = 0.1, y = 0.7, z = 0.1},
|
||||||
|
minexptime = 1,
|
||||||
|
maxexptime = 5,
|
||||||
|
minsize = 1,
|
||||||
|
maxsize = 3
|
||||||
|
}),
|
||||||
|
exp = now + time
|
||||||
|
}
|
||||||
|
end
|
|
@ -0,0 +1,13 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local include, nodecore
|
||||||
|
= include, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.amcoremod()
|
||||||
|
|
||||||
|
include("register_craft")
|
||||||
|
include("craft_check")
|
||||||
|
include("item_place_node")
|
||||||
|
include("on_punchnode")
|
||||||
|
include("fx_smoke")
|
||||||
|
include("register_cook_abm")
|
|
@ -0,0 +1,25 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore
|
||||||
|
= minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local old_place = minetest.item_place_node
|
||||||
|
function minetest.item_place_node(itemstack, placer, pointed_thing, ...)
|
||||||
|
local old_add = minetest.add_node
|
||||||
|
minetest.add_node = function(pos, node, ...)
|
||||||
|
local function helper2(...)
|
||||||
|
nodecore.craft_check(pos, node, {
|
||||||
|
action = "place",
|
||||||
|
crafter = placer,
|
||||||
|
pointed = pointed_thing
|
||||||
|
})
|
||||||
|
return ...
|
||||||
|
end
|
||||||
|
return helper2(old_add(pos, node, ...))
|
||||||
|
end
|
||||||
|
local function helper(...)
|
||||||
|
minetest.add_node = old_add
|
||||||
|
return ...
|
||||||
|
end
|
||||||
|
return helper(old_place(itemstack, placer, pointed_thing, ...))
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
name = nc_api_craft
|
||||||
|
depends = nc_api
|
|
@ -0,0 +1,91 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, vector
|
||||||
|
= minetest, nodecore, vector
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local function pummelparticles(_, data)
|
||||||
|
local pointed = data.pointed
|
||||||
|
local nodedef = data.nodedef
|
||||||
|
local pname = data.pname
|
||||||
|
|
||||||
|
local stack = nodecore.stack_get(data.node)
|
||||||
|
if stack and not stack:is_empty() then
|
||||||
|
nodedef = minetest.registered_items[stack:get_name()] or nodedef
|
||||||
|
end
|
||||||
|
|
||||||
|
local a = pointed.above
|
||||||
|
local b = pointed.under
|
||||||
|
local vel = vector.subtract(a, b)
|
||||||
|
local mid = vector.multiply(vector.add(a, b), 0.5)
|
||||||
|
local p1 = {x = vel.y, y = vel.z, z = vel.x}
|
||||||
|
local p2 = {x = vel.z, y = vel.x, z = vel.y}
|
||||||
|
local s1 = vector.add(vector.add(mid, vector.multiply(p1, 0.5)), vector.multiply(p2, 0.5))
|
||||||
|
local s2 = vector.add(vector.add(mid, vector.multiply(p1, -0.5)), vector.multiply(p2, -0.5))
|
||||||
|
vel = vector.multiply(vel, 0.5)
|
||||||
|
|
||||||
|
data.clearfx = nodecore.digparticles(nodedef, nodecore.underride(
|
||||||
|
nodecore.underride({}, data.recipe.pumparticles or {}),
|
||||||
|
{
|
||||||
|
amount = 8,
|
||||||
|
time = 1.5,
|
||||||
|
minpos = s1,
|
||||||
|
maxpos = s2,
|
||||||
|
minvel = vel,
|
||||||
|
maxvel = vel,
|
||||||
|
minexptime = 0.4,
|
||||||
|
maxexptime = 0.9,
|
||||||
|
minsize = 1,
|
||||||
|
maxsize = 5,
|
||||||
|
playername = pname
|
||||||
|
})
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
local pummeling = {}
|
||||||
|
|
||||||
|
minetest.register_on_punchnode(function(pos, node, puncher, pointed)
|
||||||
|
if not puncher:is_player() then return end
|
||||||
|
local pname = puncher:get_player_name()
|
||||||
|
if not nodecore.interact(pname) then return end
|
||||||
|
|
||||||
|
node = node or minetest.get_node(pos)
|
||||||
|
local def = minetest.registered_items[node.name] or {}
|
||||||
|
|
||||||
|
local now = minetest.get_us_time() / 1000000 * 3
|
||||||
|
local pum = {
|
||||||
|
action = "pummel",
|
||||||
|
crafter = puncher,
|
||||||
|
pname = pname,
|
||||||
|
pos = pos,
|
||||||
|
pointed = pointed,
|
||||||
|
node = node,
|
||||||
|
nodedef = def,
|
||||||
|
start = now,
|
||||||
|
wield = puncher:get_wielded_item():to_string(),
|
||||||
|
count = 0,
|
||||||
|
inprogress = pummelparticles
|
||||||
|
}
|
||||||
|
|
||||||
|
local old = pummeling[pname]
|
||||||
|
if old and old.clearfx then old.clearfx() end
|
||||||
|
|
||||||
|
local hash = minetest.hash_node_position
|
||||||
|
if old and hash(old.pos) == hash(pum.pos)
|
||||||
|
and hash(old.pointed.above) == hash(pum.pointed.above)
|
||||||
|
and hash(old.pointed.under) == hash(pum.pointed.under)
|
||||||
|
and pum.wield == old.wield
|
||||||
|
and old.last >= (now - 3)
|
||||||
|
then pum = old end
|
||||||
|
|
||||||
|
pum.count = pum.count + 1
|
||||||
|
pum.last = now
|
||||||
|
pum.duration = now - pum.start - 1
|
||||||
|
pummeling[pname] = pum
|
||||||
|
|
||||||
|
if pum.count < 2 then return end
|
||||||
|
|
||||||
|
if nodecore.craft_check(pos, node, nodecore.underride({}, pum)) then
|
||||||
|
pummeling[pname] = nil
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1,81 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, type
|
||||||
|
= minetest, nodecore, type
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
local function getduration(_, data)
|
||||||
|
local meta = minetest.get_meta(data.node)
|
||||||
|
|
||||||
|
local md = meta:get_string(modname) or ""
|
||||||
|
md = (md ~= "") and minetest.deserialize(md) or {}
|
||||||
|
|
||||||
|
if md.label ~= data.recipe.label
|
||||||
|
or md.count ~= nodecore.stack_get(data.node):get_count()
|
||||||
|
or not md.start
|
||||||
|
then return 0 end
|
||||||
|
|
||||||
|
return minetest.get_gametime() - md.start
|
||||||
|
end
|
||||||
|
|
||||||
|
local function playcookfx(pos, cookfx, sound, smokeqty, smoketime)
|
||||||
|
if not cookfx then return end
|
||||||
|
if cookfx == true or cookfx and cookfx[sound] then
|
||||||
|
minetest.sound_play("nc_api_craft_" .. sound,
|
||||||
|
{gain = 1, pos = pos})
|
||||||
|
end
|
||||||
|
if cookfx == true or cookfx and cookfx.smoke then
|
||||||
|
if cookfx ~= true and type(cookfx.smoke) == "number" then
|
||||||
|
smokeqty = smokeqty * cookfx.smoke
|
||||||
|
end
|
||||||
|
nodecore.smokefx(pos, smoketime, smokeqty)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function inprogress(pos, data)
|
||||||
|
local meta = minetest.get_meta(data.node)
|
||||||
|
local recipe = data.recipe
|
||||||
|
|
||||||
|
local md = meta:get_string(modname) or ""
|
||||||
|
md = (md ~= "") and minetest.deserialize(md) or {}
|
||||||
|
|
||||||
|
local count = nodecore.stack_get(data.node):get_count()
|
||||||
|
if md.label ~= recipe.label or md.count ~= count or not md.start then
|
||||||
|
md = {
|
||||||
|
label = recipe.label,
|
||||||
|
count = count,
|
||||||
|
start = minetest.get_gametime()
|
||||||
|
}
|
||||||
|
meta:set_string(modname, minetest.serialize(md))
|
||||||
|
end
|
||||||
|
|
||||||
|
data.progressing = true
|
||||||
|
|
||||||
|
return playcookfx(pos, recipe.cookfx, "sizzle", 2, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function cookdone(pos, data)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local recipe = data.recipe
|
||||||
|
meta:set_float(recipe.label, 0)
|
||||||
|
return playcookfx(pos, recipe.cookfx, "hiss", 80, 0.2)
|
||||||
|
end
|
||||||
|
|
||||||
|
function nodecore.register_cook_abm(def)
|
||||||
|
def.interval = def.interval or 1
|
||||||
|
def.chance = def.chance or 1
|
||||||
|
def.action = function(pos, node)
|
||||||
|
local data = {
|
||||||
|
action = "cook",
|
||||||
|
duration = getduration,
|
||||||
|
inprogress = inprogress,
|
||||||
|
after = cookdone
|
||||||
|
}
|
||||||
|
nodecore.craft_check(pos, node, data)
|
||||||
|
if not data.progressing then
|
||||||
|
minetest.get_meta(pos):set_string(modname, "")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
nodecore.register_limited_abm(def)
|
||||||
|
end
|
|
@ -0,0 +1,69 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local error, math, nodecore, pairs, table, type
|
||||||
|
= error, math, nodecore, pairs, table, type
|
||||||
|
local math_floor, table_insert
|
||||||
|
= math.floor, table.insert
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local craft_recipes = {}
|
||||||
|
nodecore.craft_recipes = craft_recipes
|
||||||
|
|
||||||
|
local id = 0
|
||||||
|
|
||||||
|
function nodecore.register_craft(recipe)
|
||||||
|
recipe.action = recipe.action or "place"
|
||||||
|
local canrot
|
||||||
|
recipe.nodes = recipe.nodes or {}
|
||||||
|
for _, v in pairs(recipe.nodes) do
|
||||||
|
v.x = v.x or 0
|
||||||
|
v.y = v.y or 0
|
||||||
|
v.z = v.z or 0
|
||||||
|
if type(v.match) == "table" and v.match.count then
|
||||||
|
v.match.excess = v.match.excess or true
|
||||||
|
end
|
||||||
|
canrot = canrot or v.x ~= 0 or v.z ~= 0
|
||||||
|
if v.x == 0 and v.y == 0 and v.z == 0 then
|
||||||
|
recipe.root = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not recipe.root or not recipe.root.match then
|
||||||
|
error "recipe.nodes must have a match for 0,0,0"
|
||||||
|
end
|
||||||
|
if not recipe.label then
|
||||||
|
id = id + 1
|
||||||
|
recipe.label = "unnamed " .. recipe.action .. " " .. id
|
||||||
|
end
|
||||||
|
if recipe.toolgroups and recipe.toolwear ~= false then
|
||||||
|
recipe.toolwear = 1
|
||||||
|
end
|
||||||
|
if not canrot then recipe.norotate = true end
|
||||||
|
if recipe.normal then
|
||||||
|
recipe.normal.x = recipe.normal.x or 0
|
||||||
|
recipe.normal.y = recipe.normal.y or 0
|
||||||
|
recipe.normal.z = recipe.normal.z or 0
|
||||||
|
end
|
||||||
|
if recipe.items then
|
||||||
|
for k, v in pairs(recipe.items) do
|
||||||
|
if type(v) == "string" then
|
||||||
|
recipe.items[k] = {name = v}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if recipe.wield and type(recipe.wield) == "table" then
|
||||||
|
recipe.wield.count = recipe.wield.count or false
|
||||||
|
end
|
||||||
|
local newp = recipe.priority or 0
|
||||||
|
|
||||||
|
local min = 1
|
||||||
|
local max = #craft_recipes + 1
|
||||||
|
while max > min do
|
||||||
|
local try = math_floor((min + max) / 2)
|
||||||
|
local oldp = craft_recipes[try].priority or 0
|
||||||
|
if newp < oldp then
|
||||||
|
min = try + 1
|
||||||
|
else
|
||||||
|
max = try
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table_insert(craft_recipes, min, recipe)
|
||||||
|
end
|
After Width: | Height: | Size: 243 B |
|
@ -0,0 +1,146 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local math, minetest, nodecore, pairs, vector
|
||||||
|
= math, minetest, nodecore, pairs, vector
|
||||||
|
local math_random
|
||||||
|
= math.random
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
local ashdirs = {
|
||||||
|
{x = 1, y = -1, z = 0},
|
||||||
|
{x = -1, y = -1, z = 0},
|
||||||
|
{x = 0, y = -1, z = 1},
|
||||||
|
{x = 0, y = -1, z = -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "mix concrete (fail)",
|
||||||
|
action = "pummel",
|
||||||
|
priority = 2,
|
||||||
|
toolgroups = {thumpy = 1},
|
||||||
|
normal = {y = 1},
|
||||||
|
nodes = {
|
||||||
|
{
|
||||||
|
match = {groups = {gravel = true}}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
x = 1,
|
||||||
|
y = -1,
|
||||||
|
match = {buildable_to = true}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
y = -1,
|
||||||
|
match = "nc_fire:ash",
|
||||||
|
replace = "air"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
after = function(pos)
|
||||||
|
local dirs = {}
|
||||||
|
for _, d in pairs(ashdirs) do
|
||||||
|
local p = vector.add(pos, d)
|
||||||
|
if nodecore.buildable_to(p) then
|
||||||
|
dirs[#dirs + 1] = {pos = p, qty = 0}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _ = 1, 8 do
|
||||||
|
local p = dirs[math_random(1, #dirs)]
|
||||||
|
p.qty = p.qty + 1
|
||||||
|
end
|
||||||
|
for _, v in pairs(dirs) do
|
||||||
|
if v.qty > 0 then
|
||||||
|
nodecore.item_eject(v.pos, "nc_fire:lump_ash " .. v.qty)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "mix concrete",
|
||||||
|
action = "pummel",
|
||||||
|
priority = 1,
|
||||||
|
toolgroups = {thumpy = 1},
|
||||||
|
normal = {y = 1},
|
||||||
|
nodes = {
|
||||||
|
{
|
||||||
|
match = {groups = {gravel = true}},
|
||||||
|
replace = "air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
y = -1,
|
||||||
|
match = "nc_fire:ash",
|
||||||
|
replace = modname .. ":aggregate"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
local flow = modname .. ":wet_flowing"
|
||||||
|
local src = modname .. ":wet_source"
|
||||||
|
|
||||||
|
nodecore.register_limited_abm({
|
||||||
|
label = "Aggregate Wettening",
|
||||||
|
interval = 1,
|
||||||
|
chance = 2,
|
||||||
|
limited_max = 100,
|
||||||
|
nodenames = {modname .. ":aggregate"},
|
||||||
|
neighbors = {"group:water"},
|
||||||
|
action = function(pos)
|
||||||
|
minetest.set_node(pos, {name = src})
|
||||||
|
nodecore.node_sound(pos, "place")
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
nodecore.register_limited_abm({
|
||||||
|
label = "Aggregate Wandering",
|
||||||
|
interval = 4,
|
||||||
|
chance = 2,
|
||||||
|
limited_max = 100,
|
||||||
|
nodenames = {src},
|
||||||
|
neighbors = {flow},
|
||||||
|
action = function(pos, node)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local gen = meta:get_int("agggen")
|
||||||
|
if gen >= 8 and math_random(1, 2) == 1 then
|
||||||
|
minetest.set_node(pos, {name = "nc_terrain:cobble"})
|
||||||
|
return nodecore.node_sound(pos, "place")
|
||||||
|
end
|
||||||
|
local miny = pos.y
|
||||||
|
local found = {}
|
||||||
|
nodecore.scan_flood(pos, 2, function(p)
|
||||||
|
local nn = minetest.get_node(p).name
|
||||||
|
if nn == src then return end
|
||||||
|
if nn ~= flow then return false end
|
||||||
|
if p.y > miny then return end
|
||||||
|
if p.y == miny then
|
||||||
|
found[#found + 1] = p
|
||||||
|
return
|
||||||
|
end
|
||||||
|
miny = p.y
|
||||||
|
found = {p}
|
||||||
|
end)
|
||||||
|
if #found < 1 then return end
|
||||||
|
local np = nodecore.pickrand(found)
|
||||||
|
nodecore.node_sound(pos, "dig")
|
||||||
|
minetest.set_node(np, node)
|
||||||
|
minetest.get_meta(np):set_int("agggen", gen + 1)
|
||||||
|
minetest.set_node(pos, {name = flow, param2 = 7})
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "aggregate curing",
|
||||||
|
action = "cook",
|
||||||
|
duration = 300,
|
||||||
|
cookfx = {smoke = 0.05},
|
||||||
|
check = function(pos)
|
||||||
|
return not minetest.find_node_near(pos, 1, {flow, "group:water"})
|
||||||
|
end,
|
||||||
|
nodes = {
|
||||||
|
{
|
||||||
|
match = src,
|
||||||
|
replace = "nc_terrain:stone"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
nodecore.register_cook_abm({nodenames = {src}})
|
|
@ -0,0 +1,9 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local include, nodecore
|
||||||
|
= include, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.amcoremod()
|
||||||
|
|
||||||
|
include("node")
|
||||||
|
include("crafting")
|
|
@ -0,0 +1,2 @@
|
||||||
|
name = nc_concrete
|
||||||
|
depends = nc_api, nc_api_craft, nc_fire, nc_terrain
|
|
@ -0,0 +1,43 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore
|
||||||
|
= minetest, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
minetest.register_node(modname .. ":aggregate", {
|
||||||
|
description = "Aggregate",
|
||||||
|
tiles = {"nc_terrain_gravel.png^(nc_fire_ash.png^[mask:nc_concrete_mask.png)"},
|
||||||
|
groups = {
|
||||||
|
crumbly = 2,
|
||||||
|
falling_node = 1,
|
||||||
|
falling_repose = 1
|
||||||
|
},
|
||||||
|
crush_damage = 1,
|
||||||
|
sounds = nodecore.sounds("nc_terrain_chompy")
|
||||||
|
})
|
||||||
|
|
||||||
|
local wettile = "nc_terrain_stone.png^(nc_fire_ash.png^[mask:nc_concrete_mask.png)"
|
||||||
|
local wetdef = {
|
||||||
|
description = "Wet Aggregate",
|
||||||
|
tiles = {wettile},
|
||||||
|
special_tiles = {wettile, wettile},
|
||||||
|
liquid_viscosity = 15,
|
||||||
|
liquid_renewable = false,
|
||||||
|
liquid_range = 1,
|
||||||
|
liquid_alternative_flowing = modname .. ":wet_flowing",
|
||||||
|
liquid_alternative_source = modname .. ":wet_source",
|
||||||
|
walkable = false,
|
||||||
|
diggable = false,
|
||||||
|
drowning = 1,
|
||||||
|
post_effect_color = {a = 240, r = 32, g = 32, b = 32},
|
||||||
|
sounds = nodecore.sounds("nc_terrain_chompy")
|
||||||
|
}
|
||||||
|
minetest.register_node(modname .. ":wet_source", nodecore.underride({
|
||||||
|
liquidtype = "source"
|
||||||
|
}, wetdef))
|
||||||
|
minetest.register_node(modname .. ":wet_flowing", nodecore.underride({
|
||||||
|
drawtype = "flowingliquid",
|
||||||
|
liquidtype = "flowing",
|
||||||
|
paramtype2 = "flowingliquid"
|
||||||
|
}, wetdef))
|
After Width: | Height: | Size: 149 B |
|
@ -0,0 +1,9 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local include, nodecore
|
||||||
|
= include, nodecore
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
nodecore.amcoremod()
|
||||||
|
|
||||||
|
include("operate")
|
||||||
|
include("register")
|
|
@ -0,0 +1,2 @@
|
||||||
|
name = nc_doors
|
||||||
|
depends = nc_api, nc_api_craft, nc_fire, nc_lode, nc_terrain, nc_woodwork
|
|
@ -0,0 +1,107 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, pairs, vector
|
||||||
|
= minetest, nodecore, pairs, vector
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local function hingeaxis(pos, node)
|
||||||
|
local fd = node and node.param2 or 0
|
||||||
|
fd = nodecore.facedirs[fd]
|
||||||
|
fd = vector.multiply(vector.add(fd.f, fd.r), 0.5)
|
||||||
|
return {
|
||||||
|
x = fd.x == 0 and 0 or pos.x + fd.x,
|
||||||
|
y = fd.y == 0 and 0 or pos.y + fd.y,
|
||||||
|
z = fd.z == 0 and 0 or pos.z + fd.z
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local squelch = {}
|
||||||
|
minetest.register_globalstep(function() squelch = {} end)
|
||||||
|
|
||||||
|
local is_door = {groups = { door = true }}
|
||||||
|
|
||||||
|
function nodecore.operate_door(pos, node, dir)
|
||||||
|
if squelch[minetest.pos_to_string(pos)] then return end
|
||||||
|
node = node or minetest.get_node_or_nil(pos)
|
||||||
|
if (not node) or (not nodecore.match(node, is_door)) then return end
|
||||||
|
|
||||||
|
local fd = nodecore.facedirs[node.param2 or 0]
|
||||||
|
local rotdir
|
||||||
|
if vector.equals(dir, fd.k) or vector.equals(dir, fd.r) then
|
||||||
|
rotdir = "r"
|
||||||
|
elseif vector.equals(dir, fd.l) or vector.equals(dir, fd.f) then
|
||||||
|
rotdir = "f"
|
||||||
|
else return end
|
||||||
|
|
||||||
|
local found = {}
|
||||||
|
local hinge = hingeaxis(pos, node)
|
||||||
|
if nodecore.scan_flood(pos, 128, function(p)
|
||||||
|
local n = minetest.get_node_or_nil(p)
|
||||||
|
if not n then return true end
|
||||||
|
if (not nodecore.match(n, is_door))
|
||||||
|
or (not vector.equals(hingeaxis(p, n), hinge)) then return false end
|
||||||
|
found[minetest.pos_to_string(p)] = {pos = p, node = n}
|
||||||
|
end
|
||||||
|
) then return end
|
||||||
|
|
||||||
|
local toop = {}
|
||||||
|
for k, v in pairs(found) do
|
||||||
|
local ffd = nodecore.facedirs[v.node.param2 or 0]
|
||||||
|
local to = vector.add(v.pos, ffd[rotdir])
|
||||||
|
|
||||||
|
if (not found[minetest.pos_to_string(to)])
|
||||||
|
and (not nodecore.buildable_to(to))
|
||||||
|
then return end
|
||||||
|
|
||||||
|
local str = minetest.pos_to_string(to)
|
||||||
|
if squelch[str] then return end
|
||||||
|
|
||||||
|
v.str = str
|
||||||
|
v.to = to
|
||||||
|
v.fd = ffd
|
||||||
|
|
||||||
|
toop[k .. "l"] = {
|
||||||
|
pos = vector.add(v.pos, ffd.l),
|
||||||
|
dir = rotdir == "r" and ffd.k or ffd.f
|
||||||
|
}
|
||||||
|
toop[k .. "k"] = {
|
||||||
|
pos = vector.add(v.pos, ffd.k),
|
||||||
|
dir = rotdir == "r" and ffd.r or ffd.l
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local toset = {}
|
||||||
|
for k, v in pairs(found) do
|
||||||
|
toset[k] = {pos = v.pos, name = "air"}
|
||||||
|
squelch[k] = true
|
||||||
|
squelch[v.str] = true
|
||||||
|
end
|
||||||
|
for _, v in pairs(found) do
|
||||||
|
for i, xfd in pairs(nodecore.facedirs) do
|
||||||
|
if vector.equals(xfd.t, v.fd.t)
|
||||||
|
and vector.equals(xfd.r, rotdir == "r" and v.fd.f or v.fd.k) then
|
||||||
|
toset[minetest.pos_to_string(v.to)] = {
|
||||||
|
pos = v.to,
|
||||||
|
name = v.node.name,
|
||||||
|
param2 = i
|
||||||
|
}
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, v in pairs(toset) do
|
||||||
|
minetest.set_node(v.pos, v)
|
||||||
|
if v.name ~= "air" then
|
||||||
|
local p = vector.round(vector.multiply(v.pos, 0.25))
|
||||||
|
local k = "sfx" .. minetest.pos_to_string(p)
|
||||||
|
if not squelch[k] then
|
||||||
|
squelch[k] = true
|
||||||
|
minetest.sound_play("nc_doors_operate",
|
||||||
|
{pos = v.pos, gain = 0.5})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, v in pairs(toop) do
|
||||||
|
nodecore.operate_door(v.pos, nil, v.dir)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,148 @@
|
||||||
|
-- LUALOCALS < ---------------------------------------------------------
|
||||||
|
local minetest, nodecore, pairs, vector
|
||||||
|
= minetest, nodecore, pairs, vector
|
||||||
|
-- LUALOCALS > ---------------------------------------------------------
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
local function doorop(pos, node, _, _, pointed)
|
||||||
|
if (not pointed.above) or (not pointed.under) then return end
|
||||||
|
local force = vector.subtract(pointed.under, pointed.above)
|
||||||
|
return nodecore.operate_door(pos, node, force)
|
||||||
|
end
|
||||||
|
|
||||||
|
local tilemods = {
|
||||||
|
{idx = 1, part = "end", tran = "R180"},
|
||||||
|
{idx = 2, part = "end", tran = "FX"},
|
||||||
|
{idx = 3, part = "side", tran = "I"},
|
||||||
|
{idx = 6, part = "side", tran = "R180"}
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodecore.register_door(basemod, basenode, desc, pin)
|
||||||
|
local basefull = basemod .. ":" .. basenode
|
||||||
|
local basedef = minetest.registered_nodes[basefull]
|
||||||
|
|
||||||
|
local tiles = nodecore.underride({}, basedef.tiles)
|
||||||
|
while #tiles < 6 do tiles[#tiles + 1] = tiles[#tiles] end
|
||||||
|
for k, v in pairs(tiles) do tiles[k] = v.name or v end
|
||||||
|
for _, v in pairs(tilemods) do
|
||||||
|
tiles[v.idx] = tiles[v.idx] .. "^nc_doors_hinge_" .. v.part
|
||||||
|
.. "_base.png^[transform" .. v.tran
|
||||||
|
end
|
||||||
|
|
||||||
|
local paneldef = nodecore.underride({}, {
|
||||||
|
name = modname .. ":panel_" .. basenode,
|
||||||
|
description = (desc or basedef.description) .. " Panel",
|
||||||
|
tiles = tiles,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
silktouch = false,
|
||||||
|
on_rightclick = nodecore.node_spin_filtered(function(a, b)
|
||||||
|
return vector.equals(a.f, b.r)
|
||||||
|
and vector.equals(a.r, b.f)
|
||||||
|
end),
|
||||||
|
}, basedef)
|
||||||
|
paneldef.drop = nil
|
||||||
|
paneldef.alternate_loose = nil
|
||||||
|
paneldef.drop_in_place = nil
|
||||||
|
paneldef.after_dig_node = nil
|
||||||
|
|
||||||
|
minetest.register_node(paneldef.name, paneldef)
|
||||||
|
|
||||||
|
local t = minetest.registered_items[pin].tiles
|
||||||
|
t = t[3] or t[2] or t[1]
|
||||||
|
t = t.name or t
|
||||||
|
tiles = nodecore.underride({}, tiles)
|
||||||
|
for _, v in pairs(tilemods) do
|
||||||
|
tiles[v.idx] = tiles[v.idx] .. "^((" .. t .. ")^[mask:nc_doors_hinge_" .. v.part
|
||||||
|
.. "_mask.png^[transform" .. v.tran .. ")"
|
||||||
|
end
|
||||||
|
|
||||||
|
local groups = nodecore.underride({door = 1}, basedef.groups)
|
||||||
|
local doordef = nodecore.underride({
|
||||||
|
name = modname .. ":door_" .. basenode,
|
||||||
|
description = (desc or basedef.description) .. " Hinged Panel",
|
||||||
|
tiles = tiles,
|
||||||
|
drop = pin,
|
||||||
|
drop_in_place = paneldef.name,
|
||||||
|
on_rightclick = doorop,
|
||||||
|
groups = groups
|
||||||
|
}, paneldef)
|
||||||
|
|
||||||
|
minetest.register_node(doordef.name, doordef)
|
||||||
|
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "drill door " .. basenode:lower(),
|
||||||
|
action = "pummel",
|
||||||
|
toolgroups = {thumpy = 3},
|
||||||
|
normal = {y = 1},
|
||||||
|
nodes = {
|
||||||
|
{
|
||||||
|
match = "nc_lode:rod_tempered",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
y = -1,
|
||||||
|
match = basefull,
|
||||||
|
replace = paneldef.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "lubricate door " .. basenode:lower(),
|
||||||
|
check = function(_, data)
|
||||||
|
return minetest.get_meta(data.rel(0, -1, 0))
|
||||||
|
:get_float("doorlube") ~= 1
|
||||||
|
end,
|
||||||
|
nodes = {
|
||||||
|
{
|
||||||
|
match = "nc_fire:lump_coal",
|
||||||
|
replace = "air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
y = -1,
|
||||||
|
match = paneldef.name,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
after = function(pos, data)
|
||||||
|
minetest.get_meta(data.rel(0, -1, 0)):set_float("doorlube", 1)
|
||||||
|
return nodecore.digparticles(
|
||||||
|
minetest.registered_nodes["nc_fire:coal8"],
|
||||||
|
{
|
||||||
|
collisiondetection = true,
|
||||||
|
amount = 10,
|
||||||
|
time = 0.2,
|
||||||
|
minpos = {x = pos.x - 0.4, y = pos.y - 0.5, z = pos.z - 0.4},
|
||||||
|
maxpos = {x = pos.x + 0.4, y = pos.y - 0.45, z = pos.z + 0.4},
|
||||||
|
minexptime = 0.1,
|
||||||
|
maxexptime = 1,
|
||||||
|
minsize = 1,
|
||||||
|
maxsize = 3
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
})
|
||||||
|
nodecore.register_craft({
|
||||||
|
label = "door pin " .. basenode:lower(),
|
||||||
|
action = "pummel",
|
||||||
|
toolgroups = {thumpy = 1},
|
||||||
|
normal = {y = 1},
|
||||||
|
check = function(_, data)
|
||||||
|
return minetest.get_meta(data.rel(0, -1, 0))
|
||||||
|
:get_float("doorlube") == 1
|
||||||
|
end,
|
||||||
|
nodes = {
|
||||||
|
{
|
||||||
|
match = pin,
|
||||||
|
replace = "air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
y = -1,
|
||||||
|
match = paneldef.name,
|
||||||
|
replace = doordef.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
nodecore.register_door("nc_woodwork", "plank", "Wooden", "nc_woodwork:staff")
|
||||||
|
nodecore.register_door("nc_terrain", "cobble", "Cobble", "nc_lode:rod_tempered")
|
After Width: | Height: | Size: 96 B |