Compare commits
537 Commits
recipes_re
...
pr_647_tec
Author | SHA1 | Date | |
---|---|---|---|
2454382e90 | |||
6731db14e5 | |||
a9079c49e0 | |||
f80372a0f8 | |||
80dee96dbe | |||
d65c4aadd2 | |||
98675a2ae9 | |||
ba2bdf8368 | |||
d5ff69d1d9 | |||
f47da0c045 | |||
a08ba2bb93 | |||
410e341da5 | |||
5826c2feaa | |||
b221d69717 | |||
a296446da1 | |||
49d4105a2b | |||
fda8a3d042 | |||
dfcf64c1d0 | |||
0921c326a8 | |||
9b7c44b453 | |||
86e083c409 | |||
21e044478e | |||
521c0b74bb | |||
aad1b2875a | |||
66e20a9231 | |||
705961e2fe | |||
6a9dfec36f | |||
d4609f23f2 | |||
091bb2406d | |||
c40189eabf | |||
f61bb82bd1 | |||
7d39136764 | |||
4775d98fb7 | |||
d623715d94 | |||
718a5beda1 | |||
fa39b24ed5 | |||
bce5306abe | |||
167ab93905 | |||
5beb84bed9 | |||
f9b0906a82 | |||
9a39a94272 | |||
349676f243 | |||
0f6bdb1bde | |||
0211c582e9 | |||
d2b68a6bef | |||
140701c99e | |||
1c219487d3 | |||
43acec2900 | |||
0f7810e538 | |||
11e43ffe13 | |||
d8fe9ad16c | |||
c06a56daff | |||
cd5a3ee1ef | |||
a5b36b041e | |||
b9f89a0e39 | |||
03bb4dab46 | |||
d7336670f2 | |||
3c85abb3b2 | |||
11f2b4f4b3 | |||
00618d13b5 | |||
6154a04c00 | |||
438c0877f6 | |||
88f2bc388f | |||
a8daa417c4 | |||
befe3ecc86 | |||
df7f2e464a | |||
31a052d7e6 | |||
88f42539bb | |||
b2a124dd83 | |||
34f2894321 | |||
fb4fef783b | |||
4a9ad94bf9 | |||
f3828c1943 | |||
0e10e8360d | |||
fbc4cc8511 | |||
904800abde | |||
1a45ad19d4 | |||
e90b28895c | |||
7696546d47 | |||
da95be53ec | |||
76a39e71b9 | |||
08b660ba99 | |||
cb84439266 | |||
c41f6509cf | |||
d5df30c3ff | |||
e66bb281a4 | |||
768fbecc64 | |||
707fa5a97c | |||
505ad8d045 | |||
a75cb7252d | |||
662cc7e7ef | |||
e12220be79 | |||
19e045e042 | |||
e8e5df3f4a | |||
d119a67482 | |||
bb05ff8fd2 | |||
d1bf386b80 | |||
dc4f4f66e6 | |||
62fdb853ec | |||
8a987bb361 | |||
e8f1033d49 | |||
a9b10cc4b1 | |||
b81d1d3f2d | |||
c9ba4b329d | |||
700faca5cb | |||
c14521cbd2 | |||
4f78a69ffc | |||
5f6b87d43a | |||
6e58a8e939 | |||
8ebc1de29c | |||
e1a71a8fb0 | |||
701240bc3a | |||
aa82fa1d13 | |||
bdd13beeff | |||
f5bf0d98b1 | |||
3cafe7553a | |||
bc26b047d2 | |||
83ec1b2476 | |||
c068edec65 | |||
4ecb3d4334 | |||
d40946fa38 | |||
dc0689018d | |||
51d7bd81ff | |||
2b2411d1ee | |||
8409be32fc | |||
3d52b679b0 | |||
44cb8df048 | |||
f702a6597b | |||
e931041358 | |||
5b97d94dae | |||
92dd0f4af8 | |||
29f746369f | |||
488f80d950 | |||
d74c250a40 | |||
2e7859c35e | |||
86a04d860e | |||
9b40d02fbd | |||
d1b54a573c | |||
f013d2dd1f | |||
80c6a14566 | |||
fb93388f06 | |||
41f175986d | |||
6af0376c23 | |||
0fcc7a14c2 | |||
68fac3ed7b | |||
395089dfd8 | |||
6664714313 | |||
c93bfefd9f | |||
689766f15a | |||
a5db87f0f1 | |||
86fb981b44 | |||
215de5487b | |||
930c51eef9 | |||
37d49142cf | |||
e056800cea | |||
a84b5f3b28 | |||
9d5bd90b57 | |||
16146231b8 | |||
d4162be9a7 | |||
db480011fb | |||
4cc124ff9e | |||
bf58c77316 | |||
a495541c09 | |||
1a75cd9254 | |||
51f9df2cf2 | |||
9167d4fc6f | |||
844e2fad47 | |||
e1bb29c338 | |||
987cc5a6a4 | |||
83a4bb60ca | |||
97e1c8b7f2 | |||
9cc1a78371 | |||
42efc7e47c | |||
adc638bd8c | |||
557dc4db1b | |||
e65c8b7130 | |||
69feeef0af | |||
fc2f6d8976 | |||
06abe11dd0 | |||
6b8011eba7 | |||
1d20af1bcb | |||
7c11ff1876 | |||
a34ea59105 | |||
33455328bd | |||
14e0c4c48c | |||
170d3e09c5 | |||
970f608078 | |||
39bfb76cfb | |||
d2fb249d94 | |||
fab2c492c4 | |||
54004f4951 | |||
8479a8c984 | |||
0e9caf069d | |||
869d0597ef | |||
ca86550f26 | |||
a3a959ab5e | |||
3f8478086d | |||
092ab7e738 | |||
b6d343e928 | |||
bdd45f161a | |||
5d05f59482 | |||
a353a807bd | |||
db0f8e04a1 | |||
64f38f423e | |||
ceead2b5ab | |||
4eaf48290f | |||
11f20da744 | |||
7244f86ee5 | |||
af39221df9 | |||
72c536c04e | |||
b67bca1277 | |||
ef8bb38bfd | |||
6c4e90d39c | |||
4dda59da0c | |||
338f3b6a99 | |||
eb344ad804 | |||
78f16c3e8e | |||
9755127ffd | |||
b7cecd7f3d | |||
6abd857b3f | |||
383f7df22d | |||
767f5346e9 | |||
df15a5ee65 | |||
cb5e3e8ff4 | |||
600fc6ff7e | |||
f420aa4d37 | |||
7d76ff8d38 | |||
408128d800 | |||
2a7dbe0506 | |||
018d66f791 | |||
6341ac9638 | |||
0a701a0dcf | |||
7ea645496d | |||
10307f23a7 | |||
7d5329834d | |||
ae7625d9f7 | |||
0ad8012cd3 | |||
3ba5354f83 | |||
bf3498b736 | |||
e5f40f5c39 | |||
c4acb7225a | |||
8b222bc66b | |||
9382558d82 | |||
343c7946d9 | |||
5b473927ca | |||
088eea1e3b | |||
9cc5ad3d90 | |||
b4659d9356 | |||
186f9b70ac | |||
ec6354b6a5 | |||
67d5a88d05 | |||
35da22fcd2 | |||
60b5ca5594 | |||
dd580e7684 | |||
663d272870 | |||
32b6ca9816 | |||
05dfc14fdb | |||
314d8c6c23 | |||
8596ca7c19 | |||
d26797d9de | |||
ed2aab46e1 | |||
e3b33e21c7 | |||
ff6675ef28 | |||
d3f40e0fd0 | |||
1765c31eaa | |||
11610cd9cb | |||
fd609d0f7b | |||
1b0669d5eb | |||
dab5fa7105 | |||
5e19514c60 | |||
0139eab9a2 | |||
1f49ef973d | |||
cbe97434dc | |||
73afc40d9c | |||
b739ed6cb1 | |||
51be33deea | |||
1810f417d2 | |||
4888581bee | |||
8cab1a0aec | |||
5dd6191175 | |||
06dec20326 | |||
1da213a5e4 | |||
26de2f7c88 | |||
8ccb6d97ec | |||
6b52c78963 | |||
5f1919d2bc | |||
d39797aad8 | |||
1475ee6e40 | |||
e501c4622b | |||
cfd4cb7871 | |||
2b0a283556 | |||
63efc395cd | |||
7890ffe46b | |||
428b1b8709 | |||
99bebc8008 | |||
03df68461a | |||
e8ac23e111 | |||
413d20d6c8 | |||
322615542e | |||
3db3a9cc32 | |||
2258adb2a9 | |||
097d033585 | |||
584cd82b58 | |||
0c144cd75c | |||
85a984982c | |||
4a993c2de8 | |||
83c6494166 | |||
f9a8593c87 | |||
c5127f4b1b | |||
46f3f8ec7d | |||
e16a39b385 | |||
8ef83e8f7e | |||
798a885807 | |||
71b13ab0e8 | |||
2d86ee64e3 | |||
54b6d9976c | |||
e7d06b33d1 | |||
1b1780946e | |||
28ed3b29a3 | |||
ec3e3b348d | |||
cfd788358c | |||
e2ca7166f9 | |||
32d776293b | |||
a529baba47 | |||
a793747d92 | |||
d732c8dfbd | |||
7cd848a050 | |||
fcef0ef987 | |||
ae7f49de38 | |||
84812d2307 | |||
055ee23431 | |||
a4f7996b56 | |||
24eca043d0 | |||
e393617fa1 | |||
35b0f068af | |||
4cf1e63adb | |||
1615681e89 | |||
3f179e4c53 | |||
6b800758fb | |||
137695ea67 | |||
b00e942824 | |||
cf75916ea7 | |||
4874e29025 | |||
78bfa4f893 | |||
ab6f2b2556 | |||
b8c9028681 | |||
19f74d11ba | |||
3624aabcf9 | |||
e6f715062d | |||
db35c9b54b | |||
fe6965d89a | |||
01fd5d6e6b | |||
8b16fc1176 | |||
0113975160 | |||
c8cbd261ee | |||
c6464d3ebe | |||
3eefa2f181 | |||
4b179821d3 | |||
7ed1aa9398 | |||
ce40d1cfb8 | |||
5ac93cccc9 | |||
cbfeb0192c | |||
bccefd6997 | |||
d5db189cf4 | |||
48e02b8452 | |||
72d541a607 | |||
a13e7b7ed1 | |||
91e12c41fd | |||
96788677bb | |||
6ef3438832 | |||
41a10a86d5 | |||
c17732b16f | |||
49e82a604b | |||
3fd53dfe95 | |||
3bcd99f098 | |||
122e97ebd9 | |||
63fa7a856e | |||
4735055b94 | |||
d452d16fa6 | |||
e08de57ec6 | |||
9444eff7f7 | |||
18265de3b3 | |||
3dc01a6720 | |||
d9bf9830b0 | |||
0c3f55e0c9 | |||
6dd7ffc455 | |||
a0cf9eb8f3 | |||
b9173be3b8 | |||
91fceece18 | |||
5a395928fa | |||
f330d58354 | |||
56e96b2593 | |||
80f79f5e1e | |||
a8c097bcd9 | |||
3cc568ddbd | |||
9d3f7304fb | |||
e4c34c9c32 | |||
1d81e6d4d1 | |||
581afee261 | |||
9087abcde0 | |||
00f61dfb81 | |||
a8b711a7f4 | |||
fe4372649f | |||
3252da05d1 | |||
f250e1632f | |||
86dd5852aa | |||
c38da0945c | |||
ec73a8508f | |||
7e92fe0a46 | |||
9e1c5740d3 | |||
d6b0deb989 | |||
1a7a17f3d7 | |||
3726bd9bd2 | |||
80cb6a495a | |||
0114feaf04 | |||
2e04374de8 | |||
bc0ac581aa | |||
4ac36e9d27 | |||
5382a88aef | |||
a413904ecd | |||
dd30838245 | |||
8da4d057b0 | |||
f13570b59b | |||
30a37a490f | |||
aef07eb604 | |||
f205e5f404 | |||
7c6c3b9679 | |||
42d0081367 | |||
4d1f9753e3 | |||
6d90ebb94e | |||
0defb2e66d | |||
0de4fec07c | |||
fd527c2d98 | |||
23423ab79b | |||
1d46d71b25 | |||
45919b871a | |||
706e880f05 | |||
7c85726e9a | |||
8cec4180af | |||
04e911f94b | |||
3b1abaaa56 | |||
ec069aa43e | |||
16302cffce | |||
78646b2d89 | |||
0cf4133b97 | |||
7ab3f9bed2 | |||
2912e2da78 | |||
7a9d2ffe5f | |||
7d610b7c80 | |||
814646b542 | |||
d0efa15b98 | |||
390ade6e54 | |||
d0001a20c9 | |||
35b10adb40 | |||
849526cd76 | |||
830de45936 | |||
6cc471e986 | |||
1d0687556a | |||
049129d9b8 | |||
772c21cb04 | |||
baf7f61665 | |||
3b16a2858f | |||
b001a67979 | |||
38e85e9775 | |||
df7bf8c713 | |||
7112e742f4 | |||
5692c29a45 | |||
eed803349c | |||
ddb522d4cc | |||
e3b44be6ec | |||
488070c1ee | |||
7cfb3874a3 | |||
ab567e21ca | |||
4996d1824c | |||
a2d1fefe14 | |||
fc87eca4cd | |||
8275091347 | |||
daa6135211 | |||
beb480bec2 | |||
0003ec6a79 | |||
2a7ee141eb | |||
88bdac62e3 | |||
12d0c6522b | |||
0dfac3f484 | |||
60bc80692b | |||
b0faa70873 | |||
d60e3fe939 | |||
9f0b41fe71 | |||
dd65a68ce9 | |||
84cf6504c5 | |||
d59055dd2b | |||
67b90f3ad1 | |||
ec008d7045 | |||
17c5b66524 | |||
e64fdbf03b | |||
e11f0f8817 | |||
c5e9480d99 | |||
366fc3bc65 | |||
62e04b9c0d | |||
6771ad9d33 | |||
cca72f43f1 | |||
6a4cb16392 | |||
1bf52c2d5a | |||
1d7cb74053 | |||
2d9e06c479 | |||
29c7ff5228 | |||
ad0c310b6b | |||
14b30bfd0d | |||
7d5edcf23e | |||
87fc21443c | |||
37c06a9110 | |||
22a4bcf80d | |||
dd468c3aaa | |||
6ec12b51cb | |||
9290e6f00d | |||
69487e530b | |||
efd5ff644c | |||
7065ba9155 | |||
1af6313c69 | |||
1c617f2c5e | |||
563a4c071d | |||
871ded6e6a | |||
83e9cab3ad | |||
78128fd49a | |||
5e4a87b925 | |||
5e7c47a619 | |||
5ec2d10dbc | |||
f7819b4cb8 | |||
3f717cbb9e | |||
4958a77e21 | |||
68ea0acbd0 | |||
e8a5a6652d | |||
430b310eb4 | |||
636b0f20df | |||
611c7760eb | |||
e5cc3359e0 | |||
ad157d1b8f |
20
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a problem within technic
|
||||
title: ''
|
||||
labels: Bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Technic has no main developer and largely depends on
|
||||
user-provided Pull Requests. It will take a while until
|
||||
even important issues are noticed.
|
||||
Please consider proposing a PR directly.
|
||||
_______________________________________________
|
||||
|
||||
|
||||
**Bug description**
|
||||
|
||||
|
||||
**Steps to reproduce this issue**
|
11
.github/workflows/check-release.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
on: [push, pull_request]
|
||||
name: Check & Release
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- name: lint
|
||||
uses: Roang-zero1/factorio-mod-luacheck@master
|
||||
with:
|
||||
luacheckrc_url: ""
|
1
.gitignore
vendored
@ -48,7 +48,6 @@ local.properties
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
|
40
.luacheckrc
Normal file
@ -0,0 +1,40 @@
|
||||
unused_args = false
|
||||
allow_defined_top = true
|
||||
max_line_length = 150
|
||||
-- Allow shadowed variables (callbacks in callbacks)
|
||||
redefined = false
|
||||
|
||||
globals = {
|
||||
"technic", "minetest",
|
||||
"srcstack",
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
string = {fields = {"split", "trim"}},
|
||||
table = {fields = {"copy", "getn"}},
|
||||
|
||||
"intllib", "VoxelArea",
|
||||
"default", "stairsplus",
|
||||
|
||||
"PseudoRandom", "ItemStack",
|
||||
"mg", "tubelib", "vector",
|
||||
|
||||
"moretrees", "bucket",
|
||||
"unified_inventory", "digilines",
|
||||
|
||||
"pipeworks", "screwdriver",
|
||||
"VoxelManip", "unifieddyes",
|
||||
|
||||
"Settings", "mesecon",
|
||||
"digiline_remote",
|
||||
|
||||
"protector", "isprotect",
|
||||
"homedecor_expect_infinite_stacks",
|
||||
|
||||
"craftguide", "i3"
|
||||
}
|
||||
|
||||
-- Loop warning
|
||||
files["technic/machines/other/frames.lua"].ignore = { "" }
|
||||
-- Long lines
|
||||
files["technic_cnc/cnc_api.lua"].ignore = { "" }
|
4
.mailmap
Normal file
@ -0,0 +1,4 @@
|
||||
RealBadAngel <maciej.kasatkin@o2.pl> <mk@realbadangel.pl>
|
||||
Vanessa Ezekowitz <vanessaezekowitz@gmail.com>
|
||||
Vanessa Ezekowitz <vanessaezekowitz@gmail.com> <vanessa@rainbird.(none)>
|
||||
kaeza <kaeza@users.sf.net> Diego Martínez <kaeza@users.sf.net>
|
16
LICENSE.txt
Normal file
@ -0,0 +1,16 @@
|
||||
Minetest Mod: technic
|
||||
Copyright (C) 2012-2022 RealBadAngel and contributors
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
65
README.md
@ -1,22 +1,55 @@
|
||||
Technic
|
||||
=======
|
||||
# Technic
|
||||
|
||||
[](https://github.com/minetest-mods/technic/actions)
|
||||
[](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.en.html)
|
||||
|
||||
This Minetest modpack adds machinery and automation procedure content to your
|
||||
world. A few notable features:
|
||||
|
||||
* Electric circuits
|
||||
* Automated material processing (ores, wood, ...)
|
||||
* Extended chest functionalities
|
||||
|
||||
## Dependencies
|
||||
|
||||
* Minetest 5.0.0 or newer
|
||||
* [Minetest Game](https://github.com/minetest/minetest_game/)
|
||||
* [mesecons](https://github.com/minetest-mods/mesecons) -> signalling events
|
||||
* [pipeworks](https://github.com/mt-mods/pipeworks) -> automation of item transport
|
||||
* [moreores](https://github.com/minetest-mods/moreores/) -> additional ores
|
||||
* [basic_materials](https://github.com/mt-mods/basic_materials) -> basic craft items
|
||||
* Supports [moretrees](https://github.com/mt-mods/moretrees) -> rubber trees
|
||||
* Consult `depends.txt` or `mod.conf` of each mod for further dependency information.
|
||||
|
||||
|
||||
## FAQ
|
||||
|
||||
The modpack is explained in the **[Manual](manual.md)** included in this repository.
|
||||
Machine and tool descriptions can be found on the **[GitHub Wiki](https://github.com/minetest-mods/technic/wiki)**.
|
||||
|
||||
1. My technic circuit doesn't work. No power is distributed.
|
||||
* Make sure you have a switching station connected.
|
||||
2. My wires do not connect to the machines.
|
||||
* Each machine type requires its own cable type. If you do not have a
|
||||
matching circuit, consider using a "Supply Converter" for simplicity.
|
||||
|
||||
For modders: **[Technic Lua API](technic/doc/api.md)**
|
||||
|
||||
|
||||
## License
|
||||
|
||||
Unless otherwise stated, all components of this modpack are licensed under the
|
||||
[LGPLv2 or later](LICENSE.txt). See also the individual mod folders for their
|
||||
secondary/alternate licenses, if any.
|
||||
|
||||
|
||||
### Credits
|
||||
|
||||
Contributors in alphabetical order:
|
||||
|
||||
Credits for contributing to the project (in alphabetical order):
|
||||
* kpoppel
|
||||
* Nekogloop
|
||||
* Nore/Novatux
|
||||
* Nore/Ekdohibs
|
||||
* ShadowNinja
|
||||
* VanessaE
|
||||
* And many others...
|
||||
|
||||
FAQ
|
||||
---
|
||||
|
||||
1. My technic circuit doesn't work. No power is distrubuted.
|
||||
* A: Make sure you have a switching station connected.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
See mod folders for their licences
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
default
|
||||
intllib?
|
||||
|
@ -1,62 +1,35 @@
|
||||
--Minetest 0.4.7 mod: concrete
|
||||
--Minetest 0.4.7 mod: concrete
|
||||
--(c) 2013 by RealBadAngel <mk@realbadangel.pl>
|
||||
|
||||
local technic = technic or {}
|
||||
local technic = rawget(_G, "technic") or {}
|
||||
technic.concrete_posts = {}
|
||||
|
||||
-- Boilerplate to support localized strings if intllib mod is installed.
|
||||
local S
|
||||
if intllib then
|
||||
S = intllib.Getter()
|
||||
else
|
||||
S = function(s) return s end
|
||||
local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
|
||||
|
||||
for i = 0, 31 do
|
||||
minetest.register_alias("technic:concrete_post"..i,
|
||||
"technic:concrete_post")
|
||||
end
|
||||
|
||||
minetest.register_alias("technic:concrete_post", "technic:concrete_post0")
|
||||
minetest.register_alias("technic:concrete_post32", "technic:concrete_post12")
|
||||
minetest.register_alias("technic:concrete_post33", "technic:concrete_post3")
|
||||
minetest.register_alias("technic:concrete_post34", "technic:concrete_post28")
|
||||
minetest.register_alias("technic:concrete_post35", "technic:concrete_post19")
|
||||
|
||||
local steel_ingot
|
||||
if minetest.get_modpath("technic_worldgen") then
|
||||
steel_ingot = "technic:carbon_steel_ingot"
|
||||
else
|
||||
steel_ingot = "default:steel_ingot"
|
||||
for i = 32, 63 do
|
||||
minetest.register_alias("technic:concrete_post"..i,
|
||||
"technic:concrete_post_with_platform")
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:rebar 6',
|
||||
recipe = {
|
||||
{'','', steel_ingot},
|
||||
{'',steel_ingot,''},
|
||||
{steel_ingot, '', ''},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:concrete 5',
|
||||
recipe = {
|
||||
{'default:stone','technic:rebar','default:stone'},
|
||||
{'technic:rebar','default:stone','technic:rebar'},
|
||||
{'default:stone','technic:rebar','default:stone'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:concrete_post_platform 6',
|
||||
recipe = {
|
||||
{'technic:concrete','technic:concrete_post0','technic:concrete'},
|
||||
{'technic:concrete','technic:concrete_post','technic:concrete'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:concrete_post0 12',
|
||||
output = 'technic:concrete_post 12',
|
||||
recipe = {
|
||||
{'default:stone','technic:rebar','default:stone'},
|
||||
{'default:stone','technic:rebar','default:stone'},
|
||||
{'default:stone','technic:rebar','default:stone'},
|
||||
}
|
||||
{'default:stone','basic_materials:steel_bar','default:stone'},
|
||||
{'default:stone','basic_materials:steel_bar','default:stone'},
|
||||
{'default:stone','basic_materials:steel_bar','default:stone'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -68,195 +41,93 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
local box_platform = {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}
|
||||
local box_center = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
|
||||
local box_x1 = {0, -0.3, -0.1, 0.5, 0.3, 0.1}
|
||||
local box_z1 = {-0.1, -0.3, 0, 0.1, 0.3, 0.5}
|
||||
local box_x2 = {0, -0.3, -0.1, -0.5, 0.3, 0.1}
|
||||
local box_z2 = {-0.1, -0.3, 0, 0.1, 0.3, -0.5}
|
||||
|
||||
minetest.register_craftitem(":technic:rebar", {
|
||||
description = S("Rebar"),
|
||||
inventory_image = "technic_rebar.png",
|
||||
})
|
||||
|
||||
minetest.register_node(":technic:concrete", {
|
||||
description = S("Concrete Block"),
|
||||
tile_images = {"technic_concrete_block.png",},
|
||||
groups = {cracky=1, level=2, concrete=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
technic.update_posts(pos, false)
|
||||
end,
|
||||
after_dig_node = function (pos, oldnode, oldmetadata, digger)
|
||||
technic.update_posts(pos, false)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node(":technic:blast_resistant_concrete", {
|
||||
description = S("Blast-resistant Concrete Block"),
|
||||
tile_images = {"technic_blast_resistant_concrete_block.png",},
|
||||
groups={cracky=1, level=3, concrete=1},
|
||||
tiles = {"technic_blast_resistant_concrete_block.png",},
|
||||
groups = {cracky=1, level=3, concrete=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
after_place_node = function(pos, player, itemstack)
|
||||
technic.update_posts(pos, false)
|
||||
end,
|
||||
after_dig_node = function (pos, oldnode, oldmetadata, digger)
|
||||
technic.update_posts(pos, false)
|
||||
on_blast = function(pos, intensity)
|
||||
if intensity > 9 then
|
||||
minetest.remove_node(pos)
|
||||
return {"technic:blast_resistant_concrete"}
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
if minetest.get_modpath("moreblocks") then
|
||||
stairsplus:register_all("technic","blast_resistant_concrete","technic:blast_resistant_concrete",{
|
||||
description = "Blast-resistant Concrete",
|
||||
tiles = {"technic_blast_resistant_concrete_block.png",},
|
||||
groups = {cracky=1, level=3, concrete=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_blast = function(pos, intensity)
|
||||
if intensity > 1 then
|
||||
minetest.remove_node(pos)
|
||||
minetest.add_item(pos, "technic:blast_resistant_concrete")
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
local box_platform = {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}
|
||||
local box_post = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
|
||||
local box_front = {-0.1, -0.3, -0.5, 0.1, 0.3, 0}
|
||||
local box_back = {-0.1, -0.3, 0, 0.1, 0.3, 0.5}
|
||||
local box_left = {-0.5, -0.3, -0.1, 0, 0.3, 0.1}
|
||||
local box_right = {0, -0.3, -0.1, 0.5, 0.3, 0.1}
|
||||
|
||||
minetest.register_node(":technic:concrete_post_platform", {
|
||||
description = S("Concrete Post Platform"),
|
||||
tile_images = {"technic_concrete_block.png",},
|
||||
tiles = {"basic_materials_concrete_block.png",},
|
||||
groups={cracky=1, level=2},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {box_platform}
|
||||
},
|
||||
on_place = function (itemstack, placer, pointed_thing)
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
if not technic.concrete_posts[node.name] then
|
||||
return minetest.item_place_node(itemstack, placer, pointed_thing)
|
||||
if node.name ~= "technic:concrete_post" then
|
||||
return minetest.item_place_node(itemstack, placer, pointed_thing)
|
||||
end
|
||||
local links = technic.concrete_posts[node.name]
|
||||
if links[5] ~= 0 then -- The post already has a platform
|
||||
return minetest.item_place_node(itemstack, placer, pointed_thing)
|
||||
end
|
||||
local id = technic.get_post_id({links[1], links[2], links[3], links[4], 1})
|
||||
minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id})
|
||||
minetest.set_node(pointed_thing.under, {name="technic:concrete_post_with_platform"})
|
||||
itemstack:take_item()
|
||||
placer:set_wielded_item(itemstack)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
local function gen_post_nodebox(x1, x2, z1, z2, platform)
|
||||
local box = {box_center}
|
||||
if x1 ~= 0 then
|
||||
table.insert(box, box_x1)
|
||||
end
|
||||
if x2 ~= 0 then
|
||||
table.insert(box, box_x2)
|
||||
end
|
||||
if z1 ~= 0 then
|
||||
table.insert(box, box_z1)
|
||||
end
|
||||
if z2 ~= 0 then
|
||||
table.insert(box, box_z2)
|
||||
end
|
||||
if platform ~= 0 then
|
||||
table.insert(box, box_platform)
|
||||
end
|
||||
return box
|
||||
end
|
||||
|
||||
local function dig_post_with_platform(pos, oldnode, oldmetadata)
|
||||
oldnode.name = "technic:concrete_post0"
|
||||
minetest.set_node(pos, oldnode)
|
||||
technic.update_posts(pos, true)
|
||||
end
|
||||
|
||||
function technic.posts_should_connect(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if technic.concrete_posts[node.name] then
|
||||
return "post"
|
||||
elseif minetest.get_item_group(node.name, "concrete") ~= 0 then
|
||||
return "block"
|
||||
end
|
||||
end
|
||||
|
||||
function technic.get_post_id(links)
|
||||
return (links[4] * 1) + (links[3] * 2)
|
||||
+ (links[2] * 4) + (links[1] * 8)
|
||||
+ (links[5] * 16)
|
||||
end
|
||||
|
||||
function technic.update_posts(pos, set, secondrun)
|
||||
local node = minetest.get_node(pos)
|
||||
local link_positions = {
|
||||
{x=pos.x+1, y=pos.y, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y, z=pos.z},
|
||||
{x=pos.x, y=pos.y, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y, z=pos.z-1},
|
||||
}
|
||||
|
||||
local links = {0, 0, 0, 0, 0}
|
||||
|
||||
for i, link_pos in pairs(link_positions) do
|
||||
local connecttype = technic.posts_should_connect(link_pos)
|
||||
if connecttype then
|
||||
links[i] = 1
|
||||
-- Have posts next to us update theirselves,
|
||||
-- but only once. (We don't want to start an
|
||||
-- infinite loop of updates)
|
||||
if not secondrun and connecttype == "post" then
|
||||
technic.update_posts(link_pos, true, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
-- We don't want to set ourselves if we have been removed or we are
|
||||
-- updating a concrete node
|
||||
if set then
|
||||
-- Preserve platform
|
||||
local oldlinks = technic.concrete_posts[node.name]
|
||||
if oldlinks then
|
||||
links[5] = oldlinks[5]
|
||||
end
|
||||
minetest.set_node(pos, {name="technic:concrete_post"
|
||||
..technic.get_post_id(links)})
|
||||
end
|
||||
end
|
||||
|
||||
for x1 = 0, 1 do
|
||||
for x2 = 0, 1 do
|
||||
for z1 = 0, 1 do
|
||||
for z2 = 0, 1 do
|
||||
for platform = 0, 1 do
|
||||
local links = {x1, x2, z1, z2, platform}
|
||||
local id = technic.get_post_id(links)
|
||||
technic.concrete_posts["technic:concrete_post"..id] = links
|
||||
|
||||
local groups = {cracky=1, level=2, concrete_post=1}
|
||||
if id ~= 0 then
|
||||
groups.not_in_creative_inventory = 1
|
||||
end
|
||||
|
||||
local drop = "technic:concrete_post0"
|
||||
local after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
technic.update_posts(pos, false)
|
||||
end
|
||||
if platform ~= 0 then
|
||||
drop = "technic:concrete_post_platform"
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
dig_post_with_platform(pos, oldnode, oldmetadata)
|
||||
local after_dig_node = nil
|
||||
if platform == 1 then
|
||||
after_dig_node = function(pos, old_node)
|
||||
old_node.name = "technic:concrete_post"
|
||||
minetest.set_node(pos, old_node)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node(":technic:concrete_post"..id, {
|
||||
minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), {
|
||||
description = S("Concrete Post"),
|
||||
tiles = {"technic_concrete_block.png"},
|
||||
groups = groups,
|
||||
tiles = {"basic_materials_concrete_block.png"},
|
||||
groups = {cracky=1, level=2, concrete_post=1, not_in_creative_inventory=platform},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
drop = drop,
|
||||
drop = (platform == 1 and "technic:concrete_post_platform" or
|
||||
"technic:concrete_post"),
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "nodebox",
|
||||
drawtype = "nodebox",
|
||||
connects_to = {"group:concrete", "group:concrete_post"},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = gen_post_nodebox(x1, x2, z1, z2, platform),
|
||||
type = "connected",
|
||||
fixed = {box_post, (platform == 1 and box_platform or nil)},
|
||||
connect_front = box_front,
|
||||
connect_back = box_back,
|
||||
connect_left = box_left,
|
||||
connect_right = box_right,
|
||||
},
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
technic.update_posts(pos, true)
|
||||
end,
|
||||
after_dig_node = after_dig_node,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
8
concrete/locale/es.txt
Normal file
@ -0,0 +1,8 @@
|
||||
# technic_concrete traducido por Carlos Barraza
|
||||
|
||||
Rebar = Barra de refuerzo
|
||||
Concrete Block = Bloque de concreto
|
||||
Blast-resistant Concrete Block = Bloque de concreto resistente a explosiones
|
||||
Concrete Post Platform = Plataforma de concreto
|
||||
Concrete Post = Postes de concreto
|
||||
|
7
concrete/locale/fr.txt
Normal file
@ -0,0 +1,7 @@
|
||||
# technic_concrete translation template
|
||||
|
||||
Rebar = Armature
|
||||
Concrete Block = Bloc de béton
|
||||
Blast-resistant Concrete Block = Bloc de béton anti explosions
|
||||
Concrete Post Platform = Plateforme en béton
|
||||
Concrete Post = Pilier en béton
|
9
concrete/locale/ja.txt
Normal file
@ -0,0 +1,9 @@
|
||||
# technic_concrete japanese translation
|
||||
# technic_concreteの日本語への翻訳
|
||||
# by damiemk
|
||||
|
||||
Rebar = 鉄筋
|
||||
Concrete Block = コンクリートのブロック
|
||||
Blast-resistant Concrete Block = 耐爆性コンクリートのブロック
|
||||
Concrete Post Platform = コンクリートのプラットフォーム
|
||||
Concrete Post = コンクリートポスト
|
10
concrete/locale/pl.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# Polish Translation for technic_concrete
|
||||
# Polskie tłumaczenie technic_concrete
|
||||
# by mat9117
|
||||
|
||||
Rebar = Pręt zbrojeniowy
|
||||
Concrete Block = Blok betonu
|
||||
Blast-resistant Concrete Block = Przeciwwybuchowy blok betonu
|
||||
Concrete Post Platform = Betonowa platforma
|
||||
Concrete Post = Betonowy słup
|
||||
|
10
concrete/locale/pt_BR.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# Braziliam portuguese translation for technic_concrete
|
||||
# Tradução portuguesa brasileira para technic_concrete
|
||||
# By Sires
|
||||
|
||||
Rebar = Vergalhão
|
||||
Concrete Block = Bloco de Concreto
|
||||
Blast-resistant Concrete Block = Bloco de Concreto resistente-a-explosões
|
||||
Concrete Post Platform = Plataforma para Poste de Concreto
|
||||
Concrete Post = Poste de Concreto
|
||||
|
7
concrete/locale/tr.txt
Normal file
@ -0,0 +1,7 @@
|
||||
# turkish translation by mahmutelmas06
|
||||
|
||||
Rebar = Beton demiri
|
||||
Concrete Block = Beton blok
|
||||
Blast-resistant Concrete Block = Patlamaya dayanıklı beton blok
|
||||
Concrete Post Platform = Beton direk platformu
|
||||
Concrete Post = Beton direk
|
3
concrete/mod.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name = concrete
|
||||
depends = default
|
||||
optional_depends = basic_materials, intllib, moreblocks
|
Before Width: | Height: | Size: 311 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 500 B |
Before Width: | Height: | Size: 813 B |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 813 B After Width: | Height: | Size: 583 B |
@ -1,6 +0,0 @@
|
||||
default
|
||||
moreblocks
|
||||
technic_worldgen
|
||||
concrete
|
||||
intllib?
|
||||
|
@ -1,86 +1,326 @@
|
||||
-- Minetest 0.4.6 mod: extranodes
|
||||
-- namespace: technic
|
||||
-- Boilerplate to support localized strings if intllib mod is installed.
|
||||
local S
|
||||
if intllib then
|
||||
S = intllib.Getter()
|
||||
else
|
||||
S = function(s) return s end
|
||||
local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
|
||||
|
||||
if minetest.get_modpath("moreblocks") then
|
||||
|
||||
-- register stairsplus/circular_saw nodes
|
||||
-- we skip blast resistant concrete and uranium intentionally
|
||||
-- chrome seems to be too hard of a metal to be actually sawable
|
||||
|
||||
stairsplus:register_all("technic", "marble", "technic:marble", {
|
||||
description=S("Marble"),
|
||||
groups={cracky=3, not_in_creative_inventory=1},
|
||||
tiles={"technic_marble.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "marble_bricks", "technic:marble_bricks", {
|
||||
description=S("Marble Bricks"),
|
||||
groups={cracky=3, not_in_creative_inventory=1},
|
||||
tiles={"technic_marble_bricks.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "granite", "technic:granite", {
|
||||
description=S("Granite"),
|
||||
groups={cracky=1, not_in_creative_inventory=1},
|
||||
tiles={"technic_granite.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "granite_bricks", "technic:granite_bricks", {
|
||||
description=S("Granite Bricks"),
|
||||
groups={cracky=1, not_in_creative_inventory=1},
|
||||
tiles={"technic_granite_bricks.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "concrete", "technic:concrete", {
|
||||
description=S("Concrete"),
|
||||
groups={cracky=3, not_in_creative_inventory=1},
|
||||
tiles={"basic_materials_concrete_block.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "zinc_block", "technic:zinc_block", {
|
||||
description=S("Zinc Block"),
|
||||
groups={cracky=1, not_in_creative_inventory=1},
|
||||
tiles={"technic_zinc_block.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "cast_iron_block", "technic:cast_iron_block", {
|
||||
description=S("Cast Iron Block"),
|
||||
groups={cracky=1, not_in_creative_inventory=1},
|
||||
tiles={"technic_cast_iron_block.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "carbon_steel_block", "technic:carbon_steel_block", {
|
||||
description=S("Carbon Steel Block"),
|
||||
groups={cracky=1, not_in_creative_inventory=1},
|
||||
tiles={"technic_carbon_steel_block.png"},
|
||||
})
|
||||
|
||||
stairsplus:register_all("technic", "stainless_steel_block", "technic:stainless_steel_block", {
|
||||
description=S("Stainless Steel Block"),
|
||||
groups={cracky=1, not_in_creative_inventory=1},
|
||||
tiles={"technic_stainless_steel_block.png"},
|
||||
})
|
||||
|
||||
function register_technic_stairs_alias(origmod, origname, newmod, newname)
|
||||
local func = minetest.register_alias
|
||||
local function remap(kind, suffix)
|
||||
-- Old: stairsplus:slab_concrete_wall
|
||||
-- New: technic:slab_concrete_wall
|
||||
func(("%s:%s_%s%s"):format(origmod, kind, origname, suffix),
|
||||
("%s:%s_%s%s"):format(newmod, kind, newname, suffix))
|
||||
end
|
||||
|
||||
-- Slabs
|
||||
remap("slab", "")
|
||||
remap("slab", "_inverted")
|
||||
remap("slab", "_wall")
|
||||
remap("slab", "_quarter")
|
||||
remap("slab", "_quarter_inverted")
|
||||
remap("slab", "_quarter_wall")
|
||||
remap("slab", "_three_quarter")
|
||||
remap("slab", "_three_quarter_inverted")
|
||||
remap("slab", "_three_quarter_wall")
|
||||
|
||||
-- Stairs
|
||||
remap("stair", "")
|
||||
remap("stair", "_inverted")
|
||||
remap("stair", "_wall")
|
||||
remap("stair", "_wall_half")
|
||||
remap("stair", "_wall_half_inverted")
|
||||
remap("stair", "_half")
|
||||
remap("stair", "_half_inverted")
|
||||
remap("stair", "_right_half")
|
||||
remap("stair", "_right_half_inverted")
|
||||
remap("stair", "_inner")
|
||||
remap("stair", "_inner_inverted")
|
||||
remap("stair", "_outer")
|
||||
remap("stair", "_outer_inverted")
|
||||
|
||||
-- Other
|
||||
remap("panel", "_bottom")
|
||||
remap("panel", "_top")
|
||||
remap("panel", "_vertical")
|
||||
remap("micro", "_bottom")
|
||||
remap("micro", "_top")
|
||||
end
|
||||
|
||||
register_technic_stairs_alias("stairsplus", "concrete", "technic", "concrete")
|
||||
register_technic_stairs_alias("stairsplus", "marble", "technic", "marble")
|
||||
register_technic_stairs_alias("stairsplus", "granite", "technic", "granite")
|
||||
register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks")
|
||||
|
||||
end
|
||||
--register stairslike nodes
|
||||
register_stair_slab_panel_micro("technic", "marble", "technic:marble",
|
||||
{cracky=2, not_in_creative_inventory=1},
|
||||
{"technic_marble.png"},
|
||||
S("Marble"),
|
||||
"marble",
|
||||
"facedir",
|
||||
0)
|
||||
|
||||
register_stair_slab_panel_micro("technic", "marble_bricks", "technic:marble_bricks",
|
||||
{cracky=2, not_in_creative_inventory=1},
|
||||
{"technic_marble_bricks.png"},
|
||||
S("Marble Bricks"),
|
||||
"marble_bricks",
|
||||
"facedir",
|
||||
0)
|
||||
local iclip_def = {
|
||||
description = S("Insulator/cable clip"),
|
||||
drawtype = "mesh",
|
||||
mesh = "technic_insulator_clip.obj",
|
||||
tiles = {"technic_insulator_clip.png"},
|
||||
is_ground_content = false,
|
||||
groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1 },
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
}
|
||||
|
||||
register_stair_slab_panel_micro("technic", "granite", "technic:granite",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"technic_granite.png"},
|
||||
S("Granite"),
|
||||
"granite",
|
||||
"facedir",
|
||||
0)
|
||||
local iclipfence_def = {
|
||||
description = S("Insulator/cable clip"),
|
||||
tiles = {"technic_insulator_clip.png"},
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "connected",
|
||||
fixed = {
|
||||
{ -0.25, 0.75, -0.25, 0.25, 1.25, 0.25 }, -- the clip on top
|
||||
{ -0.125, 0.6875, -0.125, 0.125, 0.75, 0.125 },
|
||||
{ -0.1875, 0.625, -0.1875, 0.1875, 0.6875, 0.1875 },
|
||||
{ -0.125, 0.5625, -0.125, 0.125, 0.625, 0.125 },
|
||||
{ -0.1875, 0.5, -0.1875, 0.1875, 0.5625, 0.1875 },
|
||||
{ -0.125, 0.4375, -0.125, 0.125, 0.5, 0.125 },
|
||||
{ -0.1875, 0.375, -0.1875, 0.1875, 0.4375, 0.1875 },
|
||||
{ -0.125, -0.5, -0.125, 0.125, 0.375, 0.125 }, -- the post, slightly short
|
||||
},
|
||||
-- connect_top =
|
||||
-- connect_bottom =
|
||||
connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8},
|
||||
{-1/16,-5/16,-1/2,1/16,-3/16,-1/8}},
|
||||
connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16},
|
||||
{-1/2,-5/16,-1/16,-1/8,-3/16,1/16}},
|
||||
connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2},
|
||||
{-1/16,-5/16,1/8,1/16,-3/16,1/2}},
|
||||
connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16},
|
||||
{1/8,-5/16,-1/16,1/2,-3/16,1/16}},
|
||||
},
|
||||
connects_to = {"group:fence", "group:wood", "group:tree"},
|
||||
groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1 },
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
}
|
||||
|
||||
register_stair_slab_panel_micro("technic", "concrete", "technic:concrete",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"technic_concrete_block.png"},
|
||||
S("Concrete"),
|
||||
"concrete",
|
||||
"facedir",
|
||||
0)
|
||||
local sclip_tex = {
|
||||
"technic_insulator_clip.png",
|
||||
{ name = "strut.png^technic_steel_strut_overlay.png", color = "white" },
|
||||
{ name = "strut.png", color = "white" }
|
||||
}
|
||||
|
||||
--register nodes in circular saw if aviable
|
||||
if circular_saw then
|
||||
for i,v in ipairs({"concrete", "marble", "marble_bricks", "granite", "default:obsidian"}) do
|
||||
table.insert(circular_saw.known_stairs, "technic:" ..v);
|
||||
local streetsmod = minetest.get_modpath("streets") or minetest.get_modpath ("steelsupport")
|
||||
-- cheapie's fork breaks it into several individual mods, with differernt names for the same content.
|
||||
|
||||
if streetsmod then
|
||||
sclip_tex = {
|
||||
"technic_insulator_clip.png",
|
||||
{ name = "streets_support.png^technic_steel_strut_overlay.png", color = "white" },
|
||||
{ name = "streets_support.png", color = "white" }
|
||||
}
|
||||
end
|
||||
|
||||
local sclip_def = {
|
||||
description = S("Steel strut with insulator/cable clip"),
|
||||
drawtype = "mesh",
|
||||
mesh = "technic_steel_strut_with_insulator_clip.obj",
|
||||
tiles = sclip_tex,
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
groups = { choppy=1, cracky=1 },
|
||||
backface_culling = false
|
||||
}
|
||||
|
||||
if minetest.get_modpath("unifieddyes") then
|
||||
iclip_def.paramtype2 = "colorwallmounted"
|
||||
iclip_def.palette = "unifieddyes_palette_colorwallmounted.png"
|
||||
iclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
|
||||
end
|
||||
iclip_def.groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
|
||||
iclip_def.on_dig = unifieddyes.on_dig
|
||||
|
||||
iclipfence_def.paramtype2 = "color"
|
||||
iclipfence_def.palette = "unifieddyes_palette_extended.png"
|
||||
iclipfence_def.on_construct = unifieddyes.on_construct
|
||||
iclipfence_def.groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
|
||||
iclipfence_def.on_dig = unifieddyes.on_dig
|
||||
|
||||
sclip_def.paramtype2 = "colorwallmounted"
|
||||
sclip_def.palette = "unifieddyes_palette_colorwallmounted.png"
|
||||
sclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
|
||||
end
|
||||
sclip_def.on_dig = unifieddyes.on_dig
|
||||
sclip_def.groups = {choppy=1, cracky=1, ud_param2_colorable = 1}
|
||||
end
|
||||
|
||||
minetest.register_node(":technic:insulator_clip", iclip_def)
|
||||
minetest.register_node(":technic:insulator_clip_fencepost", iclipfence_def)
|
||||
|
||||
minetest.register_craft({
|
||||
output = "technic:insulator_clip",
|
||||
recipe = {
|
||||
{ "", "dye:white", ""},
|
||||
{ "", "technic:raw_latex", ""},
|
||||
{ "technic:raw_latex", "default:stone", "technic:raw_latex"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "technic:insulator_clip_fencepost 2",
|
||||
recipe = {
|
||||
{ "", "dye:white", ""},
|
||||
{ "", "technic:raw_latex", ""},
|
||||
{ "technic:raw_latex", "default:fence_wood", "technic:raw_latex"},
|
||||
}
|
||||
})
|
||||
|
||||
local steelmod = minetest.get_modpath("steel")
|
||||
|
||||
if streetsmod or steelmod then
|
||||
minetest.register_node(":technic:steel_strut_with_insulator_clip", sclip_def)
|
||||
|
||||
if steelmod then
|
||||
minetest.register_craft({
|
||||
output = "technic:steel_strut_with_insulator_clip",
|
||||
recipe = {
|
||||
{"technic:insulator_clip_fencepost"},
|
||||
{"steel:strut_mount"}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "technic:steel_strut_with_insulator_clip",
|
||||
recipe = {
|
||||
{"technic:insulator_clip_fencepost", "" },
|
||||
{"steel:strut", "default:steel_ingot" },
|
||||
}
|
||||
})
|
||||
|
||||
elseif streetsmod then
|
||||
minetest.register_craft({
|
||||
output = "technic:steel_strut_with_insulator_clip",
|
||||
recipe = {
|
||||
{"technic:insulator_clip_fencepost", "" },
|
||||
{"streets:steel_support", "default:steel_ingot" },
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function register_technic_stairs_alias(modname, origname, newmod, newname)
|
||||
minetest.register_alias(modname .. ":slab_" .. origname, newmod..":slab_" .. newname)
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_inverted", newmod..":slab_" .. newname .. "_inverted")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_wall", newmod..":slab_" .. newname .. "_wall")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter", newmod..":slab_" .. newname .. "_quarter")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter_inverted", newmod..":slab_" .. newname .. "_quarter_inverted")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter_wall", newmod..":slab_" .. newname .. "_quarter_wall")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter", newmod..":slab_" .. newname .. "_three_quarter")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter_inverted", newmod..":slab_" .. newname .. "_three_quarter_inverted")
|
||||
minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter_wall", newmod..":slab_" .. newname .. "_three_quarter_wall")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname, newmod..":stair_" .. newname)
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_inverted", newmod..":stair_" .. newname .. "_inverted")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_wall", newmod..":stair_" .. newname .. "_wall")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half", newmod..":stair_" .. newname .. "_wall_half")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_half", newmod..":stair_" .. newname .. "_half")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_half_inverted", newmod..":stair_" .. newname .. "_half_inverted")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_right_half", newmod..":stair_" .. newname .. "_right_half")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_right_half_inverted", newmod..":stair_" .. newname .. "_right_half_inverted")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half", newmod..":stair_" .. newname .. "_wall_half")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_inner", newmod..":stair_" .. newname .. "_inner")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_inner_inverted", newmod..":stair_" .. newname .. "_inner_inverted")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_outer", newmod..":stair_" .. newname .. "_outer")
|
||||
minetest.register_alias(modname .. ":stair_" .. origname .. "_outer_inverted", newmod..":stair_" .. newname .. "_outer_inverted")
|
||||
minetest.register_alias(modname .. ":panel_" .. origname .. "_bottom", newmod..":panel_" .. newname .. "_bottom")
|
||||
minetest.register_alias(modname .. ":panel_" .. origname .. "_top", newmod..":panel_" .. newname .. "_top")
|
||||
minetest.register_alias(modname .. ":panel_" .. origname .. "_vertical", newmod..":panel_" .. newname .. "_vertical")
|
||||
minetest.register_alias(modname .. ":micro_" .. origname .. "_bottom", newmod..":micro_" .. newname .. "_bottom")
|
||||
minetest.register_alias(modname .. ":micro_" .. origname .. "_top", newmod..":micro_" .. newname .. "_top")
|
||||
end
|
||||
if minetest.get_modpath("unifieddyes") then
|
||||
|
||||
register_technic_stairs_alias("stairsplus", "concrete", "technic", "concrete")
|
||||
register_technic_stairs_alias("stairsplus", "marble", "technic", "marble")
|
||||
register_technic_stairs_alias("stairsplus", "granite", "technic", "granite")
|
||||
register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks")
|
||||
unifieddyes.register_color_craft({
|
||||
output = "technic:insulator_clip_fencepost",
|
||||
palette = "extended",
|
||||
type = "shapeless",
|
||||
neutral_node = "technic:insulator_clip_fencepost",
|
||||
recipe = {
|
||||
"NEUTRAL_NODE",
|
||||
"MAIN_DYE"
|
||||
}
|
||||
})
|
||||
|
||||
unifieddyes.register_color_craft({
|
||||
output = "technic:insulator_clip",
|
||||
palette = "wallmounted",
|
||||
type = "shapeless",
|
||||
neutral_node = "technic:insulator_clip",
|
||||
recipe = {
|
||||
"NEUTRAL_NODE",
|
||||
"MAIN_DYE"
|
||||
}
|
||||
})
|
||||
|
||||
unifieddyes.register_color_craft({
|
||||
output = "technic:steel_strut_with_insulator_clip",
|
||||
palette = "wallmounted",
|
||||
type = "shapeless",
|
||||
neutral_node = "",
|
||||
recipe = {
|
||||
"technic:steel_strut_with_insulator_clip",
|
||||
"MAIN_DYE"
|
||||
}
|
||||
})
|
||||
|
||||
if steelmod then
|
||||
unifieddyes.register_color_craft({
|
||||
output = "technic:steel_strut_with_insulator_clip",
|
||||
palette = "wallmounted",
|
||||
neutral_node = "",
|
||||
recipe = {
|
||||
{ "technic:insulator_clip_fencepost", "MAIN_DYE" },
|
||||
{ "steel:strut_mount", "" },
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if streetsmod then
|
||||
unifieddyes.register_color_craft({
|
||||
output = "technic:steel_strut_with_insulator_clip",
|
||||
palette = "wallmounted",
|
||||
neutral_node = "technic:steel_strut_with_insulator_clip",
|
||||
recipe = {
|
||||
{ "technic:insulator_clip_fencepost", "MAIN_DYE" },
|
||||
{ "streets:steel_support", "default:steel_ingot" },
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
|
7
extranodes/locale/es.txt
Normal file
@ -0,0 +1,7 @@
|
||||
# technic_extranodes traducido por Carlos Barraza
|
||||
|
||||
Marble = Mármol
|
||||
Marble Bricks = Ladrillos de mármol
|
||||
Granite = Granito
|
||||
Concrete = Concreto
|
||||
|
7
extranodes/locale/fr.txt
Normal file
@ -0,0 +1,7 @@
|
||||
# technic_extranodes translation template
|
||||
|
||||
Marble = Marbre
|
||||
Marble Bricks = Briques en marbre
|
||||
Granite = Granite
|
||||
Concrete = Béton
|
||||
|
8
extranodes/locale/ja.txt
Normal file
@ -0,0 +1,8 @@
|
||||
# technic_extranodes japanese translation
|
||||
# technic_extranodesの日本語への翻訳
|
||||
# by damiemk
|
||||
|
||||
Marble = 大理石
|
||||
Marble Bricks = 大理石のレンガ
|
||||
Granite = 花崗岩
|
||||
Concrete = コンクリート
|
9
extranodes/locale/pl.txt
Normal file
@ -0,0 +1,9 @@
|
||||
# Polish Translation for technic_extranodes
|
||||
# Polskie tłumaczenie technic_extranodes
|
||||
# by mat9117
|
||||
|
||||
Marble = Marmur
|
||||
Marble Bricks = Marmurowe cegły
|
||||
Granite = Granit
|
||||
Concrete = Beton
|
||||
|
9
extranodes/locale/pt_BR.txt
Normal file
@ -0,0 +1,9 @@
|
||||
# Braziliam portuguese translation for technic_extranodes
|
||||
# Tradução portuguesa brasileira para technic_extranodes
|
||||
# By Sires
|
||||
|
||||
Marble = Mármore
|
||||
Marble Bricks = Tijolos de Mármore
|
||||
Granite = Granito
|
||||
Concrete = Concreto
|
||||
|
6
extranodes/locale/tr.txt
Normal file
@ -0,0 +1,6 @@
|
||||
# turkish translation by mahmutelmas06
|
||||
|
||||
Marble = Mermer
|
||||
Marble Bricks = Mermer tuğla
|
||||
Granite = Granit
|
||||
Concrete = Beton
|
3
extranodes/mod.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name = extranodes
|
||||
depends = default, technic_worldgen, basic_materials, concrete
|
||||
optional_depends = unifieddyes, intllib, moreblocks, steel, streetsmod
|
173
extranodes/models/technic_insulator_clip.obj
Normal file
@ -0,0 +1,173 @@
|
||||
# Blender v2.72 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
o Cube
|
||||
v -0.500000 -0.500000 0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.500000 0.500000
|
||||
v -0.249997 0.500000 0.249997
|
||||
v -0.249997 0.500000 -0.249997
|
||||
v 0.249997 0.500000 -0.249997
|
||||
v 0.249997 0.500000 0.249997
|
||||
v -0.187500 0.500000 0.187500
|
||||
v -0.187500 0.500000 -0.187500
|
||||
v 0.187500 0.500000 -0.187500
|
||||
v 0.187500 0.500000 0.187500
|
||||
v -0.187500 0.750000 0.187500
|
||||
v -0.187500 0.750000 -0.187500
|
||||
v 0.187500 0.750000 -0.187500
|
||||
v 0.187500 0.750000 0.187500
|
||||
v -0.250000 0.750000 0.250000
|
||||
v -0.250000 0.750000 -0.250000
|
||||
v 0.250000 0.750000 -0.250000
|
||||
v 0.250000 0.750000 0.250000
|
||||
v -0.250000 1.250000 0.250000
|
||||
v -0.250000 1.250000 -0.250000
|
||||
v 0.250000 1.250000 -0.250000
|
||||
v 0.250000 1.250000 0.250000
|
||||
v -0.500000 0.312500 0.500000
|
||||
v -0.500000 0.312500 -0.500000
|
||||
v 0.500000 0.312500 -0.500000
|
||||
v 0.500000 0.312500 0.500000
|
||||
v 0.187500 0.625000 0.187500
|
||||
v 0.187500 0.625000 -0.187500
|
||||
v -0.187500 0.625000 -0.187500
|
||||
v -0.187500 0.625000 0.187500
|
||||
v 0.187500 0.562500 0.187500
|
||||
v 0.187500 0.687500 -0.187500
|
||||
v -0.187500 0.687500 -0.187500
|
||||
v -0.187500 0.562500 0.187500
|
||||
v 0.187500 0.687500 0.187500
|
||||
v 0.187500 0.562500 -0.187500
|
||||
v -0.187500 0.562500 -0.187500
|
||||
v -0.187500 0.687500 0.187500
|
||||
v 0.168668 0.531250 0.168668
|
||||
v 0.168668 0.718750 -0.168668
|
||||
v -0.168668 0.718750 -0.168668
|
||||
v -0.168668 0.531250 0.168668
|
||||
v 0.168668 0.656250 0.168668
|
||||
v 0.168668 0.593750 -0.168668
|
||||
v -0.168668 0.593750 -0.168668
|
||||
v -0.168668 0.656250 0.168668
|
||||
v 0.168668 0.593750 0.168668
|
||||
v 0.168668 0.656250 -0.168668
|
||||
v -0.168668 0.656250 -0.168668
|
||||
v -0.168668 0.593750 0.168668
|
||||
v 0.168668 0.718750 0.168668
|
||||
v 0.168668 0.531250 -0.168668
|
||||
v -0.168668 0.531250 -0.168668
|
||||
v -0.168668 0.718750 0.168668
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 0.749997 0.749997
|
||||
vt 0.749997 0.250003
|
||||
vt 0.250003 0.250003
|
||||
vt 0.250003 0.749997
|
||||
vt 0.000000 0.812500
|
||||
vt 1.000000 0.812500
|
||||
vt 0.312500 0.312500
|
||||
vt 0.312500 0.687500
|
||||
vt 0.687500 0.312500
|
||||
vt 0.687500 0.687500
|
||||
vt 0.331332 1.218750
|
||||
vt 0.668668 1.218750
|
||||
vt 0.687500 1.250000
|
||||
vt 0.312500 1.250000
|
||||
vt 0.750000 1.250000
|
||||
vt 0.750000 1.750000
|
||||
vt 0.250000 1.750000
|
||||
vt 0.250000 1.250000
|
||||
vt 0.331332 1.093750
|
||||
vt 0.668668 1.093750
|
||||
vt 0.687500 1.125000
|
||||
vt 0.312500 1.125000
|
||||
vt 0.331332 1.093750
|
||||
vt 0.668668 1.093750
|
||||
vt 0.331332 1.156250
|
||||
vt 0.668668 1.156250
|
||||
vt 0.687500 1.187500
|
||||
vt 0.312500 1.187500
|
||||
vt 0.331332 1.156250
|
||||
vt 0.668668 1.156250
|
||||
vt 0.331332 1.031250
|
||||
vt 0.668668 1.031250
|
||||
vt 0.687500 1.062500
|
||||
vt 0.312500 1.062500
|
||||
vt 0.312500 1.000000
|
||||
vt 0.687500 1.000000
|
||||
vn 0.000000 -1.000000 -0.000000
|
||||
vn -0.600000 0.800000 -0.000000
|
||||
vn 0.000000 0.800000 -0.600000
|
||||
vn 0.600000 0.800000 0.000000
|
||||
vn -0.000000 0.000000 1.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.856500 -0.516200 0.000000
|
||||
vn 0.000000 -0.516200 -0.856500
|
||||
vn -0.000000 -0.516200 0.856500
|
||||
vn -0.856500 -0.516200 -0.000000
|
||||
vn -1.000000 0.000000 -0.000000
|
||||
vn 0.000000 -0.000000 -1.000000
|
||||
vn 1.000000 -0.000000 0.000000
|
||||
vn -0.000000 0.800000 0.600000
|
||||
vn 0.856500 0.516200 0.000000
|
||||
vn 0.000000 0.516200 -0.856500
|
||||
vn -0.000000 0.516200 0.856500
|
||||
vn -0.856500 0.516200 -0.000000
|
||||
g Cube_Cube_Material
|
||||
s off
|
||||
f 1/1/1 2/2/1 3/3/1 4/4/1
|
||||
f 25/2/2 5/5/2 6/6/2 26/1/2
|
||||
f 26/1/3 6/6/3 7/7/3 27/4/3
|
||||
f 27/4/4 7/7/4 8/8/4 28/3/4
|
||||
f 25/9/5 1/4/5 4/1/5 28/10/5
|
||||
f 8/8/6 7/7/6 11/11/6 12/12/6
|
||||
f 7/7/6 6/6/6 10/13/6 11/11/6
|
||||
f 5/5/6 8/8/6 12/12/6 9/14/6
|
||||
f 6/6/6 5/5/6 9/14/6 10/13/6
|
||||
f 53/15/7 42/16/7 15/17/7 16/18/7
|
||||
f 42/15/8 43/16/8 14/17/8 15/18/8
|
||||
f 56/15/9 53/16/9 16/17/9 13/18/9
|
||||
f 43/15/10 56/16/10 13/17/10 14/18/10
|
||||
f 14/4/1 18/4/1 19/4/1 15/4/1
|
||||
f 17/19/11 21/20/11 22/21/11 18/22/11
|
||||
f 18/19/12 22/20/12 23/21/12 19/22/12
|
||||
f 19/19/13 23/20/13 24/21/13 20/22/13
|
||||
f 21/21/5 17/22/5 20/19/5 24/20/5
|
||||
f 21/5/6 24/8/6 23/7/6 22/6/6
|
||||
f 15/4/1 19/4/1 20/4/1 16/4/1
|
||||
f 16/4/1 20/4/1 17/4/1 13/4/1
|
||||
f 13/4/1 17/4/1 18/4/1 14/4/1
|
||||
f 1/1/11 25/10/11 26/9/11 2/4/11
|
||||
f 2/1/12 26/10/12 27/9/12 3/4/12
|
||||
f 3/1/13 27/10/13 28/9/13 4/4/13
|
||||
f 5/5/14 25/2/14 28/3/14 8/8/14
|
||||
f 49/23/7 46/24/7 30/25/7 29/26/7
|
||||
f 46/27/8 47/28/8 31/25/8 30/26/8
|
||||
f 52/23/9 49/24/9 29/25/9 32/26/9
|
||||
f 47/23/10 52/24/10 32/25/10 31/26/10
|
||||
f 45/29/7 50/30/7 34/31/7 37/32/7
|
||||
f 50/33/8 51/34/8 35/31/8 34/32/8
|
||||
f 48/33/9 45/34/9 37/31/9 40/32/9
|
||||
f 51/29/10 48/30/10 40/31/10 35/32/10
|
||||
f 41/35/7 54/36/7 38/37/7 33/38/7
|
||||
f 54/35/8 55/36/8 39/37/8 38/38/8
|
||||
f 44/35/9 41/36/9 33/37/9 36/38/9
|
||||
f 55/35/10 44/36/10 36/37/10 39/38/10
|
||||
f 37/32/15 34/31/15 42/16/15 53/15/15
|
||||
f 34/32/16 35/31/16 43/16/16 42/15/16
|
||||
f 40/32/17 37/31/17 53/16/17 56/15/17
|
||||
f 35/32/18 40/31/18 56/16/18 43/15/18
|
||||
f 33/38/15 38/37/15 46/24/15 49/23/15
|
||||
f 38/38/16 39/37/16 47/28/16 46/27/16
|
||||
f 36/38/17 33/37/17 49/24/17 52/23/17
|
||||
f 39/38/18 36/37/18 52/24/18 47/23/18
|
||||
f 29/26/15 30/25/15 50/30/15 45/29/15
|
||||
f 30/26/16 31/25/16 51/34/16 50/33/16
|
||||
f 32/26/17 29/25/17 45/34/17 48/33/17
|
||||
f 31/26/18 32/25/18 48/30/18 51/29/18
|
||||
f 12/39/15 11/40/15 54/36/15 41/35/15
|
||||
f 11/39/16 10/40/16 55/36/16 54/35/16
|
||||
f 9/39/17 12/40/17 41/36/17 44/35/17
|
||||
f 10/39/18 9/40/18 44/36/18 55/35/18
|
246
extranodes/models/technic_steel_strut_with_insulator_clip.obj
Normal file
@ -0,0 +1,246 @@
|
||||
# Blender v2.79 (sub 0) OBJ File: 'technic steel strut with insulator clip.blend'
|
||||
# www.blender.org
|
||||
o Cube_Cube_Material.001
|
||||
v -0.375000 0.500532 -0.250000
|
||||
v -0.249997 0.562500 -0.249997
|
||||
v 0.249997 0.562500 -0.249997
|
||||
v 0.375000 0.500532 -0.250000
|
||||
v 0.249997 0.562500 0.249997
|
||||
v 0.375000 0.500532 0.250000
|
||||
v -0.249997 0.562500 0.249997
|
||||
v -0.375000 0.500532 0.250000
|
||||
v 0.187500 0.562500 -0.187500
|
||||
v -0.168668 0.718750 0.168668
|
||||
v 0.168668 0.718750 0.168668
|
||||
v 0.187500 0.750000 0.187500
|
||||
v -0.187500 0.750000 0.187500
|
||||
v 0.168668 0.718750 -0.168668
|
||||
v 0.187500 0.750000 -0.187500
|
||||
v -0.168668 0.718750 -0.168668
|
||||
v -0.187500 0.750000 -0.187500
|
||||
v 0.250000 0.750000 -0.250000
|
||||
v 0.250000 0.750000 0.250000
|
||||
v -0.250000 0.750000 -0.250000
|
||||
v -0.250000 1.250000 -0.250000
|
||||
v 0.250000 1.250000 -0.250000
|
||||
v 0.250000 1.250000 0.250000
|
||||
v -0.250000 1.250000 0.250000
|
||||
v -0.250000 0.750000 0.250000
|
||||
v -0.168668 0.593750 0.168668
|
||||
v 0.168668 0.593750 0.168668
|
||||
v 0.187500 0.625000 0.187500
|
||||
v -0.187500 0.625000 0.187500
|
||||
v 0.168668 0.593750 -0.168668
|
||||
v 0.187500 0.625000 -0.187500
|
||||
v -0.168668 0.593750 -0.168668
|
||||
v -0.187500 0.625000 -0.187500
|
||||
v -0.168668 0.656250 0.168668
|
||||
v 0.168668 0.656250 0.168668
|
||||
v 0.187500 0.687500 0.187500
|
||||
v -0.187500 0.687500 0.187500
|
||||
v 0.168668 0.656250 -0.168668
|
||||
v 0.187500 0.687500 -0.187500
|
||||
v -0.168668 0.656250 -0.168668
|
||||
v -0.187500 0.687500 -0.187500
|
||||
v 0.187500 0.562500 0.187500
|
||||
v -0.187500 0.562500 0.187500
|
||||
v -0.187500 0.562500 -0.187500
|
||||
v -0.499468 -0.499468 -0.499468
|
||||
v -0.499468 0.500000 -0.499468
|
||||
v 0.499468 -0.499468 -0.499468
|
||||
v -0.499468 -0.499468 0.499468
|
||||
v -0.499468 0.500000 0.499468
|
||||
v 0.499468 -0.499468 0.499468
|
||||
v 0.499468 0.500000 -0.499468
|
||||
v 0.499468 0.500000 0.499468
|
||||
vt 1.000000 0.875000
|
||||
vt 0.937500 0.750000
|
||||
vt 0.937500 0.250000
|
||||
vt 1.000000 0.125000
|
||||
vt 0.250000 0.875000
|
||||
vt 0.250000 0.750000
|
||||
vt 0.750000 0.750000
|
||||
vt 0.750000 0.875000
|
||||
vt 0.000000 0.125000
|
||||
vt 0.062500 0.250000
|
||||
vt 0.062500 0.750000
|
||||
vt 0.000000 0.875000
|
||||
vt 0.750000 0.250000
|
||||
vt 0.687500 0.687500
|
||||
vt 0.687500 0.312500
|
||||
vt 0.312500 0.687500
|
||||
vt 0.250000 0.250000
|
||||
vt 0.312500 0.312500
|
||||
vt 0.331332 1.218750
|
||||
vt 0.668668 1.218750
|
||||
vt 0.687500 1.250000
|
||||
vt 0.312500 1.250000
|
||||
vt 0.531250 0.666667
|
||||
vt 0.531250 0.333333
|
||||
vt 0.500000 0.312500
|
||||
vt 0.500000 0.687500
|
||||
vt 0.531250 0.333333
|
||||
vt 0.531250 0.666667
|
||||
vt 0.500000 0.687500
|
||||
vt 0.500000 0.312500
|
||||
vt 0.331332 1.218750
|
||||
vt 0.668668 1.218750
|
||||
vt 0.687500 1.250000
|
||||
vt 0.312500 1.250000
|
||||
vt 0.687500 0.312500
|
||||
vt 0.750000 0.250000
|
||||
vt 0.750000 0.750000
|
||||
vt 0.687500 0.687500
|
||||
vt 0.500000 0.250000
|
||||
vt 0.500000 0.750000
|
||||
vt 0.000000 0.750000
|
||||
vt 0.000000 0.250000
|
||||
vt 0.500000 0.250000
|
||||
vt 0.000000 0.250000
|
||||
vt 0.000000 0.750000
|
||||
vt 0.500000 0.750000
|
||||
vt 0.500000 0.250000
|
||||
vt 0.500000 0.750000
|
||||
vt 0.000000 0.750000
|
||||
vt 0.000000 0.250000
|
||||
vt 0.000000 0.250000
|
||||
vt 0.500000 0.750000
|
||||
vt 0.250000 0.250000
|
||||
vt 0.750000 0.250000
|
||||
vt 0.750000 0.750000
|
||||
vt 0.250000 0.750000
|
||||
vt 0.250000 0.750000
|
||||
vt 0.312500 0.687500
|
||||
vt 0.250000 0.250000
|
||||
vt 0.312500 0.312500
|
||||
vt 0.250000 0.125000
|
||||
vt 0.750000 0.125000
|
||||
vt 0.331332 1.093750
|
||||
vt 0.668668 1.093750
|
||||
vt 0.687500 1.125000
|
||||
vt 0.312500 1.125000
|
||||
vt 0.656250 0.666667
|
||||
vt 0.656250 0.333333
|
||||
vt 0.625000 0.312500
|
||||
vt 0.625000 0.687500
|
||||
vt 0.656250 0.333333
|
||||
vt 0.656250 0.666667
|
||||
vt 0.625000 0.687500
|
||||
vt 0.625000 0.312500
|
||||
vt 0.331332 1.093750
|
||||
vt 0.668668 1.093750
|
||||
vt 0.687500 1.125000
|
||||
vt 0.312500 1.125000
|
||||
vt 0.331332 1.156250
|
||||
vt 0.668668 1.156250
|
||||
vt 0.687500 1.187500
|
||||
vt 0.312500 1.187500
|
||||
vt 0.593750 0.666667
|
||||
vt 0.593750 0.333333
|
||||
vt 0.562500 0.312500
|
||||
vt 0.562500 0.687500
|
||||
vt 0.593750 0.333333
|
||||
vt 0.593750 0.666667
|
||||
vt 0.562500 0.687500
|
||||
vt 0.562500 0.312500
|
||||
vt 0.331332 1.156250
|
||||
vt 0.668668 1.156250
|
||||
vt 0.687500 1.187500
|
||||
vt 0.312500 1.187500
|
||||
vt 0.312500 1.062500
|
||||
vt 0.687500 1.062500
|
||||
vt 0.687500 0.312500
|
||||
vt 0.687500 0.312500
|
||||
vt 0.687500 0.687500
|
||||
vt 0.312500 1.062500
|
||||
vt 0.687500 1.062500
|
||||
vt 0.000000 0.750000
|
||||
vt 0.000000 0.250000
|
||||
vt 1.000000 0.250000
|
||||
vt 1.000000 0.750000
|
||||
vt 1.000000 1.000000
|
||||
vt -0.000000 1.000000
|
||||
vt 0.000000 -0.000000
|
||||
vt 1.000000 -0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt -0.000000 1.000000
|
||||
vt 0.000000 -0.000000
|
||||
vt 1.000000 -0.000000
|
||||
vt 0.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 -0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vt -0.000000 0.000000
|
||||
vn 0.0000 0.0000 -1.0000
|
||||
vn 0.4442 0.8960 -0.0000
|
||||
vn 0.0000 0.0000 1.0000
|
||||
vn 0.0000 1.0000 -0.0000
|
||||
vn 0.0000 -0.5161 0.8565
|
||||
vn 0.8565 -0.5161 0.0000
|
||||
vn -0.8565 -0.5161 0.0000
|
||||
vn 0.0000 -0.5161 -0.8565
|
||||
vn -0.0000 -1.0000 -0.0000
|
||||
vn 1.0000 -0.0000 0.0000
|
||||
vn -1.0000 0.0000 -0.0000
|
||||
vn -0.4442 0.8960 -0.0000
|
||||
vn -0.0000 0.5161 0.8565
|
||||
vn 0.8565 0.5161 -0.0000
|
||||
vn -0.8565 0.5161 -0.0000
|
||||
vn 0.0000 0.5161 -0.8565
|
||||
g Cube_Cube_Material.001_Cube_Cube_Material.001_clip
|
||||
s 1
|
||||
f 1/1/1 2/2/1 3/3/1 4/4/1
|
||||
f 4/5/2 3/6/2 5/7/2 6/8/2
|
||||
f 6/9/3 5/10/3 7/11/3 8/12/3
|
||||
f 7/13/4 5/7/4 42/14/4 43/15/4
|
||||
f 5/7/4 3/6/4 9/16/4 42/14/4
|
||||
f 2/17/4 7/13/4 43/15/4 44/18/4
|
||||
f 3/6/4 2/17/4 44/18/4 9/16/4
|
||||
f 10/19/5 11/20/5 12/21/5 13/22/5
|
||||
f 11/23/6 14/24/6 15/25/6 12/26/6
|
||||
f 16/27/7 10/28/7 13/29/7 17/30/7
|
||||
f 14/31/8 16/32/8 17/33/8 15/34/8
|
||||
f 15/35/9 18/36/9 19/37/9 12/38/9
|
||||
f 20/39/1 21/40/1 22/41/1 18/42/1
|
||||
f 18/43/10 22/44/10 23/45/10 19/46/10
|
||||
f 19/47/3 23/48/3 24/49/3 25/50/3
|
||||
f 21/51/11 20/39/11 25/52/11 24/49/11
|
||||
f 21/53/4 24/54/4 23/55/4 22/56/4
|
||||
f 12/38/9 19/37/9 25/57/9 13/58/9
|
||||
f 13/58/9 25/57/9 20/59/9 17/60/9
|
||||
f 17/60/9 20/59/9 18/36/9 15/35/9
|
||||
f 2/17/12 1/61/12 8/62/12 7/13/12
|
||||
f 26/63/5 27/64/5 28/65/5 29/66/5
|
||||
f 27/67/6 30/68/6 31/69/6 28/70/6
|
||||
f 32/71/7 26/72/7 29/73/7 33/74/7
|
||||
f 30/75/8 32/76/8 33/77/8 31/78/8
|
||||
f 34/79/5 35/80/5 36/81/5 37/82/5
|
||||
f 35/83/6 38/84/6 39/85/6 36/86/6
|
||||
f 40/87/7 34/88/7 37/89/7 41/90/7
|
||||
f 38/91/8 40/92/8 41/93/8 39/94/8
|
||||
f 37/82/13 36/81/13 11/20/13 10/19/13
|
||||
f 36/86/14 39/85/14 14/24/14 11/23/14
|
||||
f 41/90/15 37/89/15 10/28/15 16/27/15
|
||||
f 39/94/16 41/93/16 16/32/16 14/31/16
|
||||
f 43/95/13 42/96/13 27/64/13 26/63/13
|
||||
f 42/14/14 9/97/14 30/68/14 27/67/14
|
||||
f 44/98/15 43/99/15 26/72/15 32/71/15
|
||||
f 9/100/16 44/101/16 32/76/16 30/75/16
|
||||
f 29/66/13 28/65/13 35/80/13 34/79/13
|
||||
f 28/70/14 31/69/14 38/84/14 35/83/14
|
||||
f 33/74/15 29/73/15 34/88/15 40/87/15
|
||||
f 31/78/16 33/77/16 40/92/16 38/91/16
|
||||
f 8/102/9 1/103/9 4/104/9 6/105/9
|
||||
g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_with_band
|
||||
s off
|
||||
f 47/106/10 51/107/10 52/108/10 50/109/10
|
||||
f 48/110/11 49/111/11 46/112/11 45/113/11
|
||||
f 47/114/9 50/115/9 48/116/9 45/117/9
|
||||
f 51/118/4 46/112/4 49/111/4 52/119/4
|
||||
g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_without_band
|
||||
f 45/113/1 46/120/1 51/107/1 47/121/1
|
||||
f 50/109/3 52/119/3 49/111/3 48/122/3
|
BIN
extranodes/textures/technic_insulator_clip.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
extranodes/textures/technic_steel_strut_overlay.png
Normal file
After Width: | Height: | Size: 103 B |
3
modpack.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name = technic
|
||||
description = technic
|
||||
min_minetest_version = 5.0
|
@ -1 +0,0 @@
|
||||
|
@ -1,68 +0,0 @@
|
||||
Notes on iron and steel
|
||||
=======================
|
||||
|
||||
Alloying iron with carbon is of huge importance, but in some processes
|
||||
the alloying is an implicit side effect rather than the product of
|
||||
explicit mixing, so it is a complex area. In the real world, there is
|
||||
a huge variety of kinds of iron and steel, differing in the proportion
|
||||
of carbon included and in other elements added to the mix.
|
||||
|
||||
The Minetest default mod doesn't distinguish between types of iron and
|
||||
steel at all. This mod introduces multiple types in order to get a bit
|
||||
of complexity and flavour.
|
||||
|
||||
Leaving aside explicit addition of other elements, the iron/carbon
|
||||
spectrum is here represented by three substances: wrought iron,
|
||||
carbon steel, and cast iron. Wrought iron has low carbon content
|
||||
(less than 0.25%), resists shattering, and is easily welded, but is
|
||||
relatively soft and susceptible to rusting. It was used for rails,
|
||||
gates, chains, wire, pipes, fasteners, and other purposes. Cast iron
|
||||
has high carbon content (2.1% to 4%), is especially hard, and resists
|
||||
corrosion, but is relatively brittle, and difficult to work. It was used
|
||||
to build large structures such as bridges, and for cannons, cookware,
|
||||
and engine cylinders. Carbon steel has medium carbon content (0.25%
|
||||
to 2.1%), and intermediate properties: moderately hard and also tough,
|
||||
somewhat resistant to corrosion. It is now used for most of the purposes
|
||||
previously satisfied by wrought iron and many of those of cast iron,
|
||||
but has historically been especially important for its use in swords,
|
||||
armour, skyscrapers, large bridges, and machines.
|
||||
|
||||
Historically, the first form of iron to be refined was wrought iron,
|
||||
produced from ore by a low-temperature furnace process in which the
|
||||
ore/iron remains solid and impurities (slag) are progressively removed.
|
||||
Cast iron, by contrast, was produced somewhat later by a high-temperature
|
||||
process in a blast furnace, in which the metal is melted, and carbon is
|
||||
unavoidably incorporated from the furnace's fuel. (In fact, it's done
|
||||
in two stages, first producing pig iron from ore, and then remelting the
|
||||
pig iron to cast as cast iron.) Carbon steel requires a more advanced
|
||||
process, in which molten pig iron is processed to remove the carbon,
|
||||
and then a controlled amount of carbon is explicitly mixed back in.
|
||||
Other processes are possible to refine iron ore and to adjust its
|
||||
carbon content.
|
||||
|
||||
Unfortunately, Minetest doesn't let us readily distinguish between
|
||||
low-temperature and high-temperature processes: in the default game, the
|
||||
same furnace is used both to cook food (low temperature) and to cast metal
|
||||
ingots (varying high temperatures). So we can't sensibly have wrought
|
||||
iron and cast iron produced by different types of furnace. Nor can
|
||||
furnace recipes discriminate by which kind of fuel is used (and thus
|
||||
by the availability of carbon). The alloy furnace allows for explicit
|
||||
alloying, which appropriately represents how carbon steel is made, but
|
||||
is not sensible for the other two, and is a relatively advanced process.
|
||||
About the only option to make a second iron-processing furnace process
|
||||
readily available is to cook multiple times; happily, this bears a slight
|
||||
resemblance to the real process with pig iron as an intermediate product.
|
||||
|
||||
The default mod's refined iron, which it calls "steel", is identified
|
||||
with this mod's wrought iron. Cooking an iron lump (representing ore)
|
||||
initially produces wrought iron; the cooking process here represents a
|
||||
low-temperature bloomery process. Cooking wrought iron then produces
|
||||
cast iron; this time the cooking process represents a blast furnace.
|
||||
Alloy cooking wrought iron with coal dust (carbon) produces carbon steel;
|
||||
this represents the explicit mixing stage of carbon steel production.
|
||||
Additionally, alloy cooking carbon steel with coal dust produces cast
|
||||
iron, which is logical but not very useful. Furthermore, to make it
|
||||
possible to turn any of the forms of iron into any other, cooking carbon
|
||||
steel or cast iron produces wrought iron, in an abbreviated form of the
|
||||
bloomery process. As usual for metals, the same cooking and alloying
|
||||
processes can be performed in parallel forms on ingots or dust.
|
9
settingtypes.txt
Normal file
@ -0,0 +1,9 @@
|
||||
# Safety feature for the chainsaw tool aimed to prevent cutting structures
|
||||
# built by players.
|
||||
#
|
||||
# Trunk nodes generated by mapgen have a rotation of '0' whereas manually
|
||||
# placed trunks usually have another value. However, some mods might generate
|
||||
# trees with rotation != 0, which renders the chainsaw useless on them.
|
||||
#
|
||||
# Disabling this feature will sacrifice safety for convenience.
|
||||
technic_safe_chainsaw (Chainsaw safety feature) bool true
|
@ -1,15 +1,54 @@
|
||||
Technic
|
||||
=======
|
||||
# Technic (main mod)
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
## License
|
||||
|
||||
### Code
|
||||
|
||||
Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel)
|
||||
|
||||
Technic chests code is licensed under the GNU LGPLv2+.
|
||||
|
||||
Texture licenses:
|
||||
|
||||
### Textures
|
||||
|
||||
BlockMen modified by Zefram (CC BY-SA 3.0):
|
||||
* technic_chernobylite_block.png
|
||||
* technic_corium_flowing_animated.png
|
||||
* technic_corium_source_animated.png
|
||||
|
||||
celeron55 (Perttu Ahola) modified by Zefram (CC BY-SA 3.0):
|
||||
* technic_bucket_corium.png
|
||||
|
||||
sdzen (Elise Staudter) (CC BY-SA 3.0):
|
||||
* most of the older 16x16 textures
|
||||
|
||||
leftshift (CC BY-SA 3.0):
|
||||
* technic_river_water_can.png
|
||||
|
||||
Neuromancer vis Minetest Game (CC BY-SA 3.0)
|
||||
* `technic_*_electric_furnace_*.png` (derived)
|
||||
|
||||
[LB Photo Realism Reload](https://www.curseforge.com/minecraft/texture-packs/lb-photo-realism-reload) (CC 0)
|
||||
* `technic_geothermal_*.png` (derived)
|
||||
* `technic_water_mill_*.png` (derived)
|
||||
* `technic_*_alloy_furnace_*.png` (derived)
|
||||
* `technic_*_compressor_*.png` (derived)
|
||||
* `technic_*_grinder_*.png` (derived)
|
||||
|
||||
RealBadAngel: (WTFPL)
|
||||
* Everything.
|
||||
* Everything else.
|
||||
|
||||
|
||||
### Sounds
|
||||
|
||||
veikk0 (Veikko Mäkelä) (CC BY-SA 4.0):
|
||||
* technic_hv_nuclear_reactor_siren_danger_loop.ogg
|
||||
* Derived from "Nuclear alarm.wav" by Freesound.org user rene___ from <https://freesound.org/people/rene___/sounds/56778/>. Originally licensed under CC0 1.0 <https://creativecommons.org/publicdomain/zero/1.0/>
|
||||
|
||||
|
||||
### References
|
||||
|
||||
CC BY-SA 3.0: http://creativecommons.org/licenses/by-sa/3.0/
|
||||
|
||||
CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
|
@ -1,7 +1,4 @@
|
||||
|
||||
local worldpath = minetest.get_worldpath()
|
||||
|
||||
technic.config = Settings(worldpath.."/technic.conf")
|
||||
technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf")
|
||||
|
||||
local conf_table = technic.config:to_table()
|
||||
|
||||
@ -9,10 +6,13 @@ local defaults = {
|
||||
enable_mining_drill = "true",
|
||||
enable_mining_laser = "true",
|
||||
enable_flashlight = "false",
|
||||
enable_rubber_tree_generation = "true",
|
||||
enable_marble_generation = "true",
|
||||
enable_granite_generation = "true",
|
||||
enable_wind_mill = "false",
|
||||
enable_frames = "false",
|
||||
enable_corium_griefing = "true",
|
||||
enable_radiation_protection = "true",
|
||||
enable_entity_radiation_damage = "true",
|
||||
enable_longterm_radiation_damage = "true",
|
||||
enable_nuclear_reactor_digiline_selfdestruct = "false",
|
||||
}
|
||||
|
||||
for k, v in pairs(defaults) do
|
||||
@ -20,4 +20,3 @@ for k, v in pairs(defaults) do
|
||||
technic.config:set(k, v)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1,21 +1,64 @@
|
||||
-- check if we have the necessary dependencies to allow actually using these materials in the crafts
|
||||
local mesecons_materials = minetest.get_modpath("mesecons_materials")
|
||||
|
||||
-- Remove some recipes
|
||||
-- Bronze
|
||||
minetest.clear_craft({
|
||||
type = "shapeless",
|
||||
output = "default:bronze_ingot"
|
||||
})
|
||||
-- Restore recipe for bronze block to ingots
|
||||
minetest.register_craft({
|
||||
output = "default:bronze_ingot 9",
|
||||
recipe = {
|
||||
{"default:bronzeblock"}
|
||||
}
|
||||
})
|
||||
|
||||
-- Accelerator tube
|
||||
if pipeworks.enable_accelerator_tube then
|
||||
minetest.clear_craft({
|
||||
output = "pipeworks:accelerator_tube_1",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'pipeworks:accelerator_tube_1',
|
||||
recipe = {
|
||||
{'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'},
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
-- Teleport tube
|
||||
if pipeworks.enable_teleport_tube then
|
||||
minetest.clear_craft({
|
||||
output = "pipeworks:teleport_tube_1",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'pipeworks:teleport_tube_1',
|
||||
recipe = {
|
||||
{'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
|
||||
{'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'},
|
||||
{'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
-- basic materials' brass ingot
|
||||
|
||||
minetest.clear_craft({
|
||||
output = "basic_materials:brass_ingot",
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "basic_materials:brass_ingot 9",
|
||||
recipe = { "basic_materials:brass_block" },
|
||||
})
|
||||
|
||||
-- tubes crafting recipes
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'pipeworks:accelerator_tube_1',
|
||||
recipe = {
|
||||
{'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'pipeworks:teleport_tube_1',
|
||||
recipe = {
|
||||
{'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
|
||||
{'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'},
|
||||
{'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:diamond_drill_head',
|
||||
recipe = {
|
||||
@ -37,52 +80,42 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
output = 'technic:blue_energy_crystal',
|
||||
recipe = {
|
||||
{'default:gold_ingot', 'technic:battery', 'dye:blue'},
|
||||
{'moreores:mithril_ingot', 'technic:battery', 'dye:blue'},
|
||||
{'technic:battery', 'technic:green_energy_crystal', 'technic:battery'},
|
||||
{'dye:blue', 'technic:battery', 'default:gold_ingot'},
|
||||
{'dye:blue', 'technic:battery', 'moreores:mithril_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:red_energy_crystal',
|
||||
recipe = {
|
||||
{'default:gold_ingot', 'technic:battery', 'dye:red'},
|
||||
{'technic:battery', 'default:diamondblock', 'technic:battery'},
|
||||
{'dye:red', 'technic:battery', 'default:gold_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:fine_copper_wire 2',
|
||||
recipe = {
|
||||
{'', 'default:copper_ingot', ''},
|
||||
{'', 'default:copper_ingot', ''},
|
||||
{'', 'default:copper_ingot', ''},
|
||||
{'moreores:silver_ingot', 'technic:battery', 'dye:red'},
|
||||
{'technic:battery', 'basic_materials:energy_crystal_simple', 'technic:battery'},
|
||||
{'dye:red', 'technic:battery', 'moreores:silver_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:copper_coil 1',
|
||||
recipe = {
|
||||
{'technic:fine_copper_wire', 'technic:wrought_iron_ingot', 'technic:fine_copper_wire'},
|
||||
{'basic_materials:copper_wire', 'technic:wrought_iron_ingot', 'basic_materials:copper_wire'},
|
||||
{'technic:wrought_iron_ingot', '', 'technic:wrought_iron_ingot'},
|
||||
{'technic:fine_copper_wire', 'technic:wrought_iron_ingot', 'technic:fine_copper_wire'},
|
||||
}
|
||||
{'basic_materials:copper_wire', 'technic:wrought_iron_ingot', 'basic_materials:copper_wire'},
|
||||
},
|
||||
replacements = {
|
||||
{"basic_materials:copper_wire", "basic_materials:empty_spool"},
|
||||
{"basic_materials:copper_wire", "basic_materials:empty_spool"},
|
||||
{"basic_materials:copper_wire", "basic_materials:empty_spool"},
|
||||
{"basic_materials:copper_wire", "basic_materials:empty_spool"}
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:motor',
|
||||
recipe = {
|
||||
{'technic:carbon_steel_ingot', 'technic:copper_coil', 'technic:carbon_steel_ingot'},
|
||||
{'technic:carbon_steel_ingot', 'technic:copper_coil', 'technic:carbon_steel_ingot'},
|
||||
{'technic:carbon_steel_ingot', 'default:copper_ingot', 'technic:carbon_steel_ingot'},
|
||||
}
|
||||
})
|
||||
local isolation = mesecons_materials and "mesecons_materials:fiber" or "technic:rubber"
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_transformer',
|
||||
recipe = {
|
||||
{'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'},
|
||||
{isolation, 'technic:wrought_iron_ingot', isolation},
|
||||
{'technic:copper_coil', 'technic:wrought_iron_ingot', 'technic:copper_coil'},
|
||||
{'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'},
|
||||
}
|
||||
@ -91,7 +124,7 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
output = 'technic:mv_transformer',
|
||||
recipe = {
|
||||
{'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'},
|
||||
{isolation, 'technic:carbon_steel_ingot', isolation},
|
||||
{'technic:copper_coil', 'technic:carbon_steel_ingot', 'technic:copper_coil'},
|
||||
{'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'},
|
||||
}
|
||||
@ -100,7 +133,7 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
output = 'technic:hv_transformer',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
|
||||
{isolation, 'technic:stainless_steel_ingot', isolation},
|
||||
{'technic:copper_coil', 'technic:stainless_steel_ingot', 'technic:copper_coil'},
|
||||
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
@ -109,10 +142,11 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
output = 'technic:control_logic_unit',
|
||||
recipe = {
|
||||
{'', 'default:gold_ingot', ''},
|
||||
{'', 'basic_materials:gold_wire', ''},
|
||||
{'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'},
|
||||
{'', 'default:copper_ingot', ''},
|
||||
}
|
||||
{'', 'technic:chromium_ingot', ''},
|
||||
},
|
||||
replacements = { {"basic_materials:gold_wire", "basic_materials:empty_spool"}, },
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -120,7 +154,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
|
||||
{'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'},
|
||||
{'moreores:tin_ingot', 'moreores:tin_ingot', 'moreores:tin_ingot'},
|
||||
{'default:tin_ingot', 'default:tin_ingot', 'default:tin_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
@ -131,44 +165,45 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
-- Remove some recipes
|
||||
minetest.register_craftitem("technic:nothing", {
|
||||
description = "",
|
||||
inventory_image = "blank.png",
|
||||
minetest.register_craft({
|
||||
output = "technic:machine_casing",
|
||||
recipe = {
|
||||
{ "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" },
|
||||
{ "technic:cast_iron_ingot", "basic_materials:brass_ingot", "technic:cast_iron_ingot" },
|
||||
{ "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" },
|
||||
},
|
||||
})
|
||||
|
||||
if minetest.register_craft_predict then
|
||||
minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv)
|
||||
if itemstack:get_name() == "technic:nothing" then
|
||||
return ItemStack("")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- Bronze
|
||||
minetest.register_craft({
|
||||
output = "default:dirt 2",
|
||||
type = "shapeless",
|
||||
output = "technic:nothing",
|
||||
recipe = {"default:copper_ingot", "default:steel_ingot"}
|
||||
})
|
||||
|
||||
-- Accelerator tube
|
||||
minetest.register_craft({
|
||||
output = "technic:nothing",
|
||||
replacements = {{"bucket:bucket_water","bucket:bucket_empty"}},
|
||||
recipe = {
|
||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||
{ "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" },
|
||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
|
||||
"technic:stone_dust",
|
||||
"group:leaves",
|
||||
"bucket:bucket_water",
|
||||
"group:sand",
|
||||
},
|
||||
})
|
||||
|
||||
-- Teleport tube
|
||||
minetest.register_craft({
|
||||
output = "technic:nothing",
|
||||
output = "technic:rubber_goo",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||
{ "default:desert_stone", "default:mese_block", "default:desert_stone" },
|
||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
|
||||
"technic:raw_latex",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
"default:coal_lump",
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "technic:rubber",
|
||||
type = "cooking",
|
||||
recipe = "technic:rubber_goo",
|
||||
})
|
||||
|
@ -1,7 +0,0 @@
|
||||
default
|
||||
moreores
|
||||
pipeworks
|
||||
mesecons
|
||||
mesecons_mvps?
|
||||
intllib?
|
||||
unified_inventory?
|
277
technic/doc/api.md
Normal file
@ -0,0 +1,277 @@
|
||||
# technic API
|
||||
|
||||
This file documents the functions within the technic modpack for use in mods.
|
||||
|
||||
[Switch to plaintext format](https://raw.githubusercontent.com/minetest-mods/technic/master/technic/doc/api.md)
|
||||
|
||||
**Undocumented API may change at any time.**
|
||||
|
||||
|
||||
## Tiers
|
||||
Tier are network types. List of pre-registered tiers:
|
||||
|
||||
* `"LV"`, Low Voltage
|
||||
* `"MV"`, Medium Voltage
|
||||
* `"HV"`, High Voltage
|
||||
|
||||
Available functions:
|
||||
|
||||
* `technic.register_tier(tier, description)`
|
||||
* Registers a network type (tier)
|
||||
* `tier`: string, short name (ex. `LV`)
|
||||
* `description`: string, long name (ex. `Low Voltage`)
|
||||
* See also `tiers`
|
||||
|
||||
|
||||
## Cables
|
||||
* `technic.register_cable(tier, size)`
|
||||
* Registers an existing node as cable
|
||||
* `tier`: string
|
||||
* `size`: number, visual size of the wire
|
||||
* `technic.get_cable_tier(nodename)`
|
||||
* Retrieves the tier assigned to the provided node name
|
||||
* `nodename`: string, name of the node
|
||||
* Returns the tier (string) or `nil`
|
||||
* `technic.is_tier_cable(nodename, tier)`
|
||||
* Tells whether the node `nodename` is the cable of the tier `tier`.
|
||||
* Short version of `technic.get_cable_tier(nodename) == tier`
|
||||
* `technic.register_cable_tier(nodename, tier)`
|
||||
* Register user defined cable to list of known tier cables.
|
||||
* `nodename`: string, name of the node
|
||||
* `tier`: string, tier name
|
||||
|
||||
|
||||
## Machines
|
||||
The machine type indicates the direction of power flow.
|
||||
List of pre-registered machine types:
|
||||
|
||||
* `technic.receiver = "RE"`: consumes energy. e.g. grinder
|
||||
* `technic.producer = "PR"`: provides energy. e.g. solar panel
|
||||
* `technic.producer_receiver = "PR_RE"` supply converter
|
||||
* `technic.battery = "BA"`: stores energy. e.g. LV battery box
|
||||
|
||||
Available functions:
|
||||
|
||||
* `technic.register_base_machine(data)`
|
||||
* Registers a new node and defines the underlying machine behaviour. `data` fields:
|
||||
* `tier`: string, see #Tiers
|
||||
* `typename`: string, equivalent to the processing type registered
|
||||
by `technic.register_recipe`. Examples: `"cooking"` `"alloy"`
|
||||
* `machine_name`: string, node name
|
||||
* `machine_desc`: string, node description
|
||||
* `demand`: table, EU consumption values for each upgrade level.
|
||||
Up to three indices. Index 1 == no upgrade. Example: `{3000, 2000, 1000}`.
|
||||
* `upgrade`: (boolean), whether to add upgrade slots
|
||||
* `modname`: (string), mod origin
|
||||
* `tube`: (boolean), whether the machine has Pipeworks connectivity
|
||||
* `can_insert`: (func), see Pipeworks documentation
|
||||
* Accepts all inputs by default, if `tube = 1`
|
||||
* See also: `technic.can_insert_unique_stack`
|
||||
* `insert_object`: (func), see Pipeworks documentation
|
||||
* Accepts all inputs by default, if `tube = 1`
|
||||
* See also: `technic.insert_object_unique_stack`
|
||||
* `connect_sides`: (table), see Lua API documentation. Defaults to all directions but front.
|
||||
* `technic.register_machine(tier, nodename, machine_type)`
|
||||
* Register an existing node as machine, bound to the network tier
|
||||
* `tier`: string, see #Tiers
|
||||
* `nodename`: string, node name
|
||||
* `machine_type`: string, following options are possible:
|
||||
* `technic.receiver = "RE"`: Consumes energy
|
||||
* `technic.producer = "PR"`: Provides energy
|
||||
* `technic.battery = "BA"`: Energy storage
|
||||
* See also `Machine types`
|
||||
|
||||
Callbacks for pipeworks item transfer:
|
||||
|
||||
* `technic.can_insert_unique_stack(pos, node, stack, direction)`
|
||||
* `technic.insert_object_unique_stack(pos, node, stack, direction)`
|
||||
* Functions for the parameters `can_insert` and `insert_object` to avoid
|
||||
filling multiple inventory slots with same type of item.
|
||||
|
||||
### Recipes
|
||||
|
||||
* `technic.register_recipe_type(typename, recipedef)`
|
||||
* Registers a new recipe type used for machine processing
|
||||
* `typename`: string, name of the recipe type
|
||||
* Fields of `recipedef`:
|
||||
* `description`: string, descriptor of the recipe type
|
||||
* `input_size`: (numeric), count of input ItemStacks. default 1
|
||||
* `output_size`: (numeric), count of output ItemStacks. default 1
|
||||
* `technic.register_recipe(recipe)`
|
||||
* Registers a individual input/output recipe. Fields of `recipe`:
|
||||
* `input`: table, integer-indexed list of input ItemStacks.
|
||||
* `output`: table/ItemStack, single output or list of output ItemStacks.
|
||||
* `time`: numeric, process time in seconds.
|
||||
* `technic.get_recipe(typename, items)`
|
||||
* `typename`: string, see `technic.register_recipe_type`
|
||||
* `items`: table, integer-indexed list of input ItemStacks.
|
||||
* Returns: `recipe` table on success, `nil` otherwise
|
||||
|
||||
|
||||
The following functions can be used to register recipes for
|
||||
a specific machine type:
|
||||
|
||||
* Centrifuge
|
||||
* `technic.register_separating_recipe(recipe)`
|
||||
* Compressor
|
||||
* `technic.register_compressor_recipe(recipe)`
|
||||
* Furnaces (electric, normal)
|
||||
* `minetest.register_recipe(recipe)`
|
||||
* Extractor
|
||||
* `technic.register_extractor_recipe(recipe)`
|
||||
* Freezer
|
||||
* `technic.register_freezer_recipe(recipe)`
|
||||
* Grinder
|
||||
* `technic.register_grinder_recipe(recipe)`
|
||||
|
||||
|
||||
## Tools
|
||||
* `technic.register_power_tool(itemname, max_charge)`
|
||||
* Register or configure the maximal charge held by an existing item
|
||||
* `craftitem`: string, item or node name
|
||||
* `max_charge`: number, maximal EU capacity
|
||||
|
||||
|
||||
## Helper functions
|
||||
Unsorted functions:
|
||||
|
||||
* `technic.EU_string(num)`
|
||||
* Converts num to a human-readable string (see `pretty_num`)
|
||||
and adds the `EU` unit
|
||||
* Use this function when showing players energy values
|
||||
* `technic.pretty_num(num)`
|
||||
* Converts the number `num` to a human-readable string with SI prefixes
|
||||
* `technic.config:get(name)`
|
||||
* Some configuration function
|
||||
* `technic.tube_inject_item(pos, start_pos, velocity, item)`
|
||||
* Same as `pipeworks.tube_inject_item`
|
||||
|
||||
### Energy modifiers
|
||||
* `technic.set_RE_wear(itemstack, item_load, max_charge)`
|
||||
* Modifies the power tool wear of the given itemstack
|
||||
* `itemstack`: ItemStack to modify
|
||||
* `item_load`: number, used energy in EU
|
||||
* `max_charge`: number, maximal EU capacity of the tool
|
||||
* The itemdef field `wear_represents` must be set to `"technic_RE_charge"`,
|
||||
otherwise this function will do nothing.
|
||||
* Returns the modified itemstack
|
||||
* `technic.refill_RE_charge(itemstack)`
|
||||
* This function fully recharges an RE chargeable item.
|
||||
* If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this
|
||||
function does nothing, else that value is the maximum charge.
|
||||
* The itemstack metadata is changed to contain the charge.
|
||||
* `technic.get_charge(itemstack)`
|
||||
* Returns the charge and max charge of the given itemstack.
|
||||
* If the itemstack is not an RE chargeable item, both return values will be zero.
|
||||
* `technic.set_charge(itemstack, charge)`
|
||||
* Modifies the charge of the given itemstack.
|
||||
|
||||
### Node-specific
|
||||
* `technic.get_or_load_node(pos)`
|
||||
* If the mapblock is loaded, it returns the node at pos,
|
||||
else it loads the chunk and returns `nil`.
|
||||
* `technic.swap_node(pos, nodename)`
|
||||
* Same as `mintest.swap_node` but it only changes the nodename.
|
||||
* It uses `minetest.get_node` before swapping to ensure the new nodename
|
||||
is not the same as the current one.
|
||||
* `technic.trace_node_ray(pos, dir, range)`
|
||||
* Returns an iteration function (usable in the for loop) to iterate over the
|
||||
node positions along the specified ray.
|
||||
* The returned positions will not include the starting position `pos`.
|
||||
* `technic.trace_node_ray_fat(pos, dir, range)`
|
||||
* Like `technic.trace_node_ray` but includes extra positions near the ray.
|
||||
* The node ray functions are used for mining lasers.
|
||||
|
||||
|
||||
## Item Definition fields
|
||||
Groups:
|
||||
|
||||
* `technic_<tier> = 1`
|
||||
* Makes the node connect to the cables of the matching tier name
|
||||
* `<tier>`: name of the tier, in lowercase (ex. `lv`)
|
||||
* `technic_machine = 1`
|
||||
* UNRELIABLE. Indicates whether the item or node belongs to technic
|
||||
* `connect_sides = {"top", "left", ...}`
|
||||
* Extends the Minetest API. Indicates where the machine can be connected.
|
||||
|
||||
Additional definition fields:
|
||||
|
||||
* `<itemdef>.wear_represents = "string"`
|
||||
* Specifies how the tool wear level is handled. Available modes:
|
||||
* `"mechanical_wear"`: represents physical damage
|
||||
* `"technic_RE_charge"`: represents electrical charge
|
||||
* `<itemdef>.technic_run = function(pos, node) ...`
|
||||
* This callback is used to update the node.
|
||||
Modders have to manually change the information about supply etc. in the
|
||||
node metadata.
|
||||
* Technic-registered machines use this callback by default.
|
||||
* `<itemdef>.technic_disabled_machine_name = "string"`
|
||||
* Specifies the machine's node name to use when it's not connected connected to a network
|
||||
* `<itemdef>.technic_on_disable = function(pos, node) ...`
|
||||
* This callback is run when the machine is no longer connected to a technic-powered network.
|
||||
* `<itemdef>.technic_get_charge = function(itemstack) ...`
|
||||
* Optional callback to overwrite the default charge behaviour.
|
||||
* `itemstack`: ItemStack, the tool to analyse
|
||||
* Return values:
|
||||
* `charge`: Electrical charge of the tool
|
||||
* `max_charge`: Upper charge limit
|
||||
* Etc. `local charge, maxcharge = itemdef.technic_get_charge(itemstack)`
|
||||
* `<itemdef>.technic_set_charge = function(itemstack, charge) ...`
|
||||
* Optional callback to overwrite the default charge behaviour.
|
||||
* `itemstack`: ItemStack, the tool to update
|
||||
* `charge`: numeric, value between `0` and `max_charge`
|
||||
|
||||
|
||||
## Node Metadata fields
|
||||
Nodes connected to the network will have one or more of these parameters as meta
|
||||
data:
|
||||
|
||||
* `<tier>_EU_supply` - direction: output
|
||||
* For nodes registered as `PR` or `BA` tier
|
||||
* This is the EU value supplied by the node.
|
||||
* `<tier>_EU_demand` - direction: output
|
||||
* For nodes registered as `RE` or `BA` tier
|
||||
* This is the EU value the node requires to run.
|
||||
* `<tier>_EU_input` - direction: input
|
||||
* For nodes registered as `RE` or `BA` tier
|
||||
* This is the actual EU value the network can give the node.
|
||||
|
||||
`<tier>` corresponds to the tier name registered using
|
||||
`technic.register_tier` (ex. `LV`). It is possible for the machine to depend on
|
||||
multiple tiers (or networks).
|
||||
|
||||
|
||||
## Manual: Network basics
|
||||
|
||||
The switching station is the center of all power distribution on an electric
|
||||
network. This node is used to calculate the power supply of the network and
|
||||
to distribute the power across nodes.
|
||||
|
||||
The switching station is the center of all electricity distribution. It collects
|
||||
power from sources (PR), distributes it to sinks (RE), and uses the
|
||||
excess/shortfall to charge and discharge batteries (BA).
|
||||
|
||||
As a thumb of rule, "EU" (energy unit) values are expressed in kW.
|
||||
|
||||
Network functionality:
|
||||
|
||||
1. All PR, BA, RE nodes are indexed and tagged with one switching station.
|
||||
The tagging is a workaround to allow more stations to be built without allowing
|
||||
a cheat with duplicating power.
|
||||
2. All the RE nodes are queried for their current EU demand.
|
||||
If the total demand is less than the available power they are all updated
|
||||
with the demand number.
|
||||
3. BA nodes are evenly charged from energy surplus.
|
||||
4. Excess power draw will discharge batteries evenly.
|
||||
5. If the total demand is more than the available power all RE nodes will be shut
|
||||
down. We have a brown-out situation.
|
||||
|
||||
## Deprecated functions
|
||||
|
||||
Following functions are either no longer used by technic, or are planned to
|
||||
be removed soon. Please update mods depending on technic accordingly.
|
||||
|
||||
* `technic.get_RE_item_load`
|
||||
* Scales the tool wear to a certain numeric range
|
||||
* `technic.set_RE_item_load`
|
||||
* Scales a certain numeric range to the tool wear
|
@ -1,45 +1,234 @@
|
||||
minetest.swap_node = minetest.swap_node or function(pos, node)
|
||||
local oldmeta = minetest.get_meta(pos):to_table()
|
||||
minetest.set_node(pos, node)
|
||||
minetest.get_meta(pos):from_table(oldmeta)
|
||||
local constant_digit_count = technic.config:get("constant_digit_count")
|
||||
|
||||
-- converts a number to a readable string with SI prefix, e.g. 10000 → "10 k",
|
||||
-- 15 → "15 ", 0.1501 → "150.1 m"
|
||||
-- a non-breaking space (U+a0) instead of a usual one is put after number
|
||||
-- The precision is 4 digits
|
||||
local prefixes = {[-8] = "y", [-7] = "z", [-6] = "a", [-5] = "f", [-4] = "p",
|
||||
[-3] = "n", [-2] = "µ", [-1] = "m", [0] = "", [1] = "k", [2] = "M",
|
||||
[3] = "G", [4] = "T", [5] = "P", [6] = "E", [7] = "Z", [8] = "Y"}
|
||||
function technic.pretty_num(num)
|
||||
-- the small number added is due to floating point inaccuracy
|
||||
local b = math.floor(math.log10(math.abs(num)) +0.000001)
|
||||
local pref_i
|
||||
if b ~= 0 then
|
||||
-- b is decremented by 1 to avoid a single digit with many decimals,
|
||||
-- e.g. instead of 1.021 MEU, 1021 kEU is shown
|
||||
pref_i = math.floor((b - 1) / 3)
|
||||
else
|
||||
-- as special case, avoid showing e.g. 1100 mEU instead of 1.1 EU
|
||||
pref_i = 0
|
||||
end
|
||||
if not prefixes[pref_i] then
|
||||
-- This happens for 0, nan, inf, very big values, etc.
|
||||
if num == 0 then
|
||||
-- handle 0 explicilty to avoid showing "-0"
|
||||
if not constant_digit_count then
|
||||
return "0 "
|
||||
end
|
||||
-- gives 0.000
|
||||
return string.format("%.3f ", 0)
|
||||
end
|
||||
return string.format("%.4g ", num)
|
||||
end
|
||||
|
||||
num = num * 10 ^ (-3 * pref_i)
|
||||
if constant_digit_count then
|
||||
local comma_digits_cnt = 3 - (b - 3 * pref_i)
|
||||
return string.format("%." .. comma_digits_cnt .. "f %s",
|
||||
num, prefixes[pref_i])
|
||||
end
|
||||
return string.format("%.4g %s", num, prefixes[pref_i])
|
||||
end
|
||||
|
||||
-- Only changes name, keeps other params
|
||||
-- some unittests
|
||||
assert(technic.pretty_num(-0) == "0 ")
|
||||
assert(technic.pretty_num(0) == "0 ")
|
||||
assert(technic.pretty_num(1234) == "1234 ")
|
||||
assert(technic.pretty_num(123456789) == "123.5 M")
|
||||
|
||||
|
||||
-- used to display power values
|
||||
function technic.EU_string(num)
|
||||
return technic.pretty_num(num) .. "EU"
|
||||
end
|
||||
|
||||
|
||||
--- Same as minetest.swap_node, but only changes name
|
||||
-- and doesn't re-set if already set.
|
||||
function technic.swap_node(pos, name)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name ~= name then
|
||||
node.name = name
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
return node.name
|
||||
end
|
||||
|
||||
-- Fully charge RE chargeable item.
|
||||
|
||||
--- Returns the meta of an item
|
||||
-- Gets overridden when legacy.lua is loaded
|
||||
function technic.get_stack_meta(itemstack)
|
||||
return itemstack:get_meta()
|
||||
end
|
||||
|
||||
--- Same as technic.get_stack_meta for cans
|
||||
function technic.get_stack_meta_cans(itemstack)
|
||||
return itemstack:get_meta()
|
||||
end
|
||||
|
||||
|
||||
--- Fully charge RE chargeable item.
|
||||
-- Must be defined early to reference in item definitions.
|
||||
function technic.refill_RE_charge(stack)
|
||||
local max_charge = technic.power_tools[stack:get_name()]
|
||||
if not max_charge then return stack end
|
||||
local meta = technic.get_stack_meta(stack)
|
||||
meta:set_int("technic:charge", max_charge)
|
||||
technic.set_RE_wear(stack, max_charge, max_charge)
|
||||
local meta = minetest.deserialize(stack:get_metadata()) or {}
|
||||
meta.charge = max_charge
|
||||
stack:set_metadata(minetest.serialize(meta))
|
||||
return stack
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
local function resolve_name(function_name)
|
||||
local a = _G
|
||||
for key in string.gmatch(function_name, "([^%.]+)(%.?)") do
|
||||
if a[key] then
|
||||
a = a[key]
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
return a
|
||||
|
||||
-- If the node is loaded, returns it. If it isn't loaded, load it and return nil.
|
||||
function technic.get_or_load_node(pos)
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
if node then return node end
|
||||
local vm = VoxelManip()
|
||||
local _, _ = vm:read_from_map(pos, pos)
|
||||
return nil
|
||||
end
|
||||
|
||||
function technic.function_exists(function_name)
|
||||
return type(resolve_name(function_name)) == 'function'
|
||||
|
||||
technic.tube_inject_item = pipeworks.tube_inject_item or function(pos, start_pos, velocity, item)
|
||||
local tubed = pipeworks.tube_item(vector.new(pos), item)
|
||||
tubed:get_luaentity().start_pos = vector.new(start_pos)
|
||||
tubed:set_velocity(velocity)
|
||||
tubed:set_acceleration(vector.new(0, 0, 0))
|
||||
end
|
||||
|
||||
|
||||
--- Iterates over the node positions along the specified ray.
|
||||
-- The returned positions will not include the starting position.
|
||||
function technic.trace_node_ray(pos, dir, range)
|
||||
local x_step = dir.x > 0 and 1 or -1
|
||||
local y_step = dir.y > 0 and 1 or -1
|
||||
local z_step = dir.z > 0 and 1 or -1
|
||||
|
||||
local i = 1
|
||||
return function(p)
|
||||
-- Approximation of where we should be if we weren't rounding
|
||||
-- to nodes. This moves forward a bit faster then we do.
|
||||
-- A correction is done below.
|
||||
local real_x = pos.x + (dir.x * i)
|
||||
local real_y = pos.y + (dir.y * i)
|
||||
local real_z = pos.z + (dir.z * i)
|
||||
|
||||
-- How far off we've gotten from where we should be.
|
||||
local dx = math.abs(real_x - p.x)
|
||||
local dy = math.abs(real_y - p.y)
|
||||
local dz = math.abs(real_z - p.z)
|
||||
|
||||
-- If the real position moves ahead too fast, stop it so we
|
||||
-- can catch up. If it gets too far ahead it will smooth
|
||||
-- out our movement too much and we won't turn fast enough.
|
||||
if dx + dy + dz < 2 then
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
-- Step in whichever direction we're most off course in.
|
||||
if dx > dy then
|
||||
if dx > dz then
|
||||
p.x = p.x + x_step
|
||||
else
|
||||
p.z = p.z + z_step
|
||||
end
|
||||
elseif dy > dz then
|
||||
p.y = p.y + y_step
|
||||
else
|
||||
p.z = p.z + z_step
|
||||
end
|
||||
if vector.distance(pos, p) > range then
|
||||
return nil
|
||||
end
|
||||
return p
|
||||
end, vector.round(pos)
|
||||
end
|
||||
|
||||
|
||||
--- Like trace_node_ray, but includes extra positions close to the ray.
|
||||
function technic.trace_node_ray_fat(pos, dir, range)
|
||||
local x_step = dir.x > 0 and 1 or -1
|
||||
local y_step = dir.y > 0 and 1 or -1
|
||||
local z_step = dir.z > 0 and 1 or -1
|
||||
|
||||
local next_poses = {}
|
||||
|
||||
local i = 1
|
||||
return function(p)
|
||||
local ni, np = next(next_poses)
|
||||
if np then
|
||||
next_poses[ni] = nil
|
||||
return np
|
||||
end
|
||||
|
||||
-- Approximation of where we should be if we weren't rounding
|
||||
-- to nodes. This moves forward a bit faster then we do.
|
||||
-- A correction is done below.
|
||||
local real_x = pos.x + (dir.x * i)
|
||||
local real_y = pos.y + (dir.y * i)
|
||||
local real_z = pos.z + (dir.z * i)
|
||||
|
||||
-- How far off we've gotten from where we should be.
|
||||
local dx = math.abs(real_x - p.x)
|
||||
local dy = math.abs(real_y - p.y)
|
||||
local dz = math.abs(real_z - p.z)
|
||||
|
||||
-- If the real position moves ahead too fast, stop it so we
|
||||
-- can catch up. If it gets too far ahead it will smooth
|
||||
-- out our movement too much and we won't turn fast enough.
|
||||
if dx + dy + dz < 2 then
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
-- Step in whichever direction we're most off course in.
|
||||
local sx, sy, sz -- Whether we've already stepped along each axis
|
||||
if dx > dy then
|
||||
if dx > dz then
|
||||
sx = true
|
||||
p.x = p.x + x_step
|
||||
else
|
||||
sz = true
|
||||
p.z = p.z + z_step
|
||||
end
|
||||
elseif dy > dz then
|
||||
sy = true
|
||||
p.y = p.y + y_step
|
||||
else
|
||||
sz = true
|
||||
p.z = p.z + z_step
|
||||
end
|
||||
|
||||
if vector.distance(pos, p) > range then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Add other positions that we're significantly off on.
|
||||
-- We can just use fixed integer keys here because the
|
||||
-- table will be completely cleared before we reach this
|
||||
-- code block again.
|
||||
local dlen = math.sqrt(dx*dx + dy*dy + dz*dz)
|
||||
-- Normalized axis deltas
|
||||
local dxn, dyn, dzn = dx / dlen, dy / dlen, dz / dlen
|
||||
if not sx and dxn > 0.5 then
|
||||
next_poses[1] = vector.new(p.x + x_step, p.y, p.z)
|
||||
end
|
||||
if not sy and dyn > 0.5 then
|
||||
next_poses[2] = vector.new(p.x, p.y + y_step, p.z)
|
||||
end
|
||||
if not sz and dzn > 0.5 then
|
||||
next_poses[3] = vector.new(p.x, p.y, p.z + z_step)
|
||||
end
|
||||
|
||||
return p
|
||||
end, vector.round(pos)
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
|
@ -1,18 +1,36 @@
|
||||
-- Minetest 0.4.7 mod: technic
|
||||
-- namespace: technic
|
||||
-- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl>
|
||||
|
||||
technic = {}
|
||||
if not minetest.get_translator then
|
||||
error("[technic] Your Minetest version is no longer supported."
|
||||
.. " (version < 5.0.0)")
|
||||
end
|
||||
|
||||
local load_start = os.clock()
|
||||
|
||||
technic = rawget(_G, "technic") or {}
|
||||
technic.creative_mode = minetest.settings:get_bool("creative_mode")
|
||||
|
||||
|
||||
local modpath = minetest.get_modpath("technic")
|
||||
technic.modpath = modpath
|
||||
|
||||
|
||||
-- Boilerplate to support intllib
|
||||
if intllib then
|
||||
if rawget(_G, "intllib") then
|
||||
technic.getter = intllib.Getter()
|
||||
else
|
||||
technic.getter = function(s) return s end
|
||||
-- Intllib copypasta: TODO replace with the client-side translation API
|
||||
technic.getter = function(s,a,...)
|
||||
if a==nil then return s end
|
||||
a={a,...}
|
||||
return s:gsub("(@?)@(%(?)(%d+)(%)?)", function(e,o,n,c)
|
||||
if e==""then
|
||||
return a[tonumber(n)]..(o==""and c or"")
|
||||
end
|
||||
return "@"..o..n..c
|
||||
end)
|
||||
end
|
||||
end
|
||||
local S = technic.getter
|
||||
|
||||
@ -22,15 +40,18 @@ dofile(modpath.."/config.lua")
|
||||
-- Helper functions
|
||||
dofile(modpath.."/helpers.lua")
|
||||
|
||||
-- Items
|
||||
-- Items
|
||||
dofile(modpath.."/items.lua")
|
||||
|
||||
-- Craft recipes for items
|
||||
-- Craft recipes for items
|
||||
dofile(modpath.."/crafts.lua")
|
||||
|
||||
-- Register functions
|
||||
dofile(modpath.."/register.lua")
|
||||
|
||||
-- Radiation
|
||||
dofile(modpath.."/radiation.lua")
|
||||
|
||||
-- Machines
|
||||
dofile(modpath.."/machines/init.lua")
|
||||
|
||||
@ -40,7 +61,7 @@ dofile(modpath.."/tools/init.lua")
|
||||
-- Aliases for legacy node/item names
|
||||
dofile(modpath.."/legacy.lua")
|
||||
|
||||
if minetest.setting_get("log_mod") then
|
||||
if minetest.settings:get_bool("log_mods") then
|
||||
print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start))
|
||||
end
|
||||
|
||||
|
@ -11,11 +11,6 @@ minetest.register_craftitem( "technic:doped_silicon_wafer", {
|
||||
inventory_image = "technic_doped_silicon_wafer.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:enriched_uranium", {
|
||||
description = S("Enriched Uranium"),
|
||||
inventory_image = "technic_enriched_uranium.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:uranium_fuel", {
|
||||
description = S("Uranium Fuel"),
|
||||
inventory_image = "technic_uranium_fuel.png",
|
||||
@ -40,7 +35,7 @@ minetest.register_tool("technic:blue_energy_crystal", {
|
||||
fleshy = {times={}, uses=10000, maxlevel=0}
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
minetest.register_tool("technic:green_energy_crystal", {
|
||||
description = S("Green Energy Crystal"),
|
||||
@ -56,7 +51,7 @@ minetest.register_tool("technic:green_energy_crystal", {
|
||||
fleshy = {times={}, uses=10000, maxlevel=0}
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
minetest.register_tool("technic:red_energy_crystal", {
|
||||
description = S("Red Energy Crystal"),
|
||||
@ -72,12 +67,6 @@ minetest.register_tool("technic:red_energy_crystal", {
|
||||
fleshy = {times={}, uses=10000, maxlevel=0}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craftitem("technic:fine_copper_wire", {
|
||||
description = S("Fine Copper Wire"),
|
||||
inventory_image = "technic_fine_copper_wire.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:copper_coil", {
|
||||
@ -85,20 +74,11 @@ minetest.register_craftitem("technic:copper_coil", {
|
||||
inventory_image = "technic_copper_coil.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:motor", {
|
||||
description = S("Electric Motor"),
|
||||
inventory_image = "technic_motor.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:lv_transformer", {
|
||||
description = S("Low Voltage Transformer"),
|
||||
inventory_image = "technic_lv_transformer.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:lv_transformer", {
|
||||
description = S("Low Voltage Transformer"),
|
||||
inventory_image = "technic_lv_transformer.png",
|
||||
})
|
||||
minetest.register_craftitem("technic:mv_transformer", {
|
||||
description = S("Medium Voltage Transformer"),
|
||||
inventory_image = "technic_mv_transformer.png",
|
||||
@ -144,3 +124,85 @@ minetest.register_craftitem("technic:carbon_cloth", {
|
||||
inventory_image = "technic_carbon_cloth.png",
|
||||
})
|
||||
|
||||
minetest.register_node("technic:machine_casing", {
|
||||
description = S("Machine Casing"),
|
||||
groups = {cracky=2},
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
drawtype = "allfaces",
|
||||
tiles = {"technic_machine_casing.png"},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:rubber_goo", {
|
||||
description = S("Rubber Goo"),
|
||||
inventory_image = "technic_rubber_goo.png",
|
||||
})
|
||||
|
||||
for p = 0, 35 do
|
||||
local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil
|
||||
local psuffix = p == 7 and "" or p
|
||||
local ingot = "technic:uranium"..psuffix.."_ingot"
|
||||
local block = "technic:uranium"..psuffix.."_block"
|
||||
local ov = p == 7 and minetest.override_item or nil;
|
||||
(ov or minetest.register_craftitem)(ingot, {
|
||||
description = string.format(S("%.1f%%-Fissile Uranium Ingot"), p/10),
|
||||
inventory_image = "technic_uranium_ingot.png",
|
||||
groups = {uranium_ingot=1, not_in_creative_inventory=nici},
|
||||
});
|
||||
-- Note on radioactivity of blocks:
|
||||
-- Source: <http://www.wise-uranium.org/rup.html>
|
||||
-- The baseline radioactivity of an isotope is not especially
|
||||
-- correlated with whether it's fissile (i.e., suitable as
|
||||
-- reactor fuel). Natural uranium consists mainly of fissile
|
||||
-- U-235 and non-fissile U-238, and both U-235 and U-238 are
|
||||
-- significantly radioactive. U-235's massic activity is
|
||||
-- about 80.0 MBq/kg, and U-238's is about 12.4 MBq/kg, which
|
||||
-- superficially suggests that 3.5%-fissile uranium should have
|
||||
-- only 1.19 times the activity of fully-depleted uranium.
|
||||
-- But a third isotope affects the result hugely: U-234 has
|
||||
-- massic activity of 231 GBq/kg. Natural uranium has massic
|
||||
-- composition of 99.2837% U-238, 0.711% U-235, and 0.0053% U-234,
|
||||
-- so its activity comes roughly 49% each from U-234 and U-238
|
||||
-- and only 2% from U-235. During enrichment via centrifuge,
|
||||
-- the U-234 fraction is concentrated along with the U-235, with
|
||||
-- the U-234:U-235 ratio remaining close to its original value.
|
||||
-- (Actually the U-234 gets separated from U-238 slightly more
|
||||
-- than the U-235 is, so the U-234:U-235 ratio is slightly
|
||||
-- higher in enriched uranium.) A typical massic composition
|
||||
-- for 3.5%-fissile uranium is 96.47116% U-238, 3.5% U-235, and
|
||||
-- 0.02884% U-234. This gives 3.5%-fissile uranium about 6.55
|
||||
-- times the activity of fully-depleted uranium. The values we
|
||||
-- compute here for the "radioactive" group value are based on
|
||||
-- linear interpolation of activity along that scale, rooted at
|
||||
-- a natural (0.7%-fissile) uranium block having the activity of
|
||||
-- 9 uranium ore blocks (due to 9 ingots per block). The group
|
||||
-- value is proportional to the square root of the activity, and
|
||||
-- uranium ore has radioactive=1. This yields radioactive=1.0
|
||||
-- for a fully-depleted uranium block and radioactive=2.6 for
|
||||
-- a 3.5%-fissile uranium block.
|
||||
local radioactivity = math.floor(math.sqrt((1+5.55*p/35) * 18 / (1+5.55*7/35)) + 0.5);
|
||||
(ov or minetest.register_node)(block, {
|
||||
description = string.format(S("%.1f%%-Fissile Uranium Block"), p/10),
|
||||
tiles = {"technic_uranium_block.png"},
|
||||
is_ground_content = true,
|
||||
groups = {uranium_block=1, not_in_creative_inventory=nici,
|
||||
cracky=1, level=2, radioactive=radioactivity},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
});
|
||||
if not ov then
|
||||
minetest.register_craft({
|
||||
output = block,
|
||||
recipe = {
|
||||
{ingot, ingot, ingot},
|
||||
{ingot, ingot, ingot},
|
||||
{ingot, ingot, ingot},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = ingot.." 9",
|
||||
recipe = {{block}},
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -22,16 +22,57 @@ technic.legacy_nodenames = {
|
||||
["technic:compressor"] = "technic:lv_compressor",
|
||||
["technic:compressor_active"] = "technic:lv_compressor_active",
|
||||
["technic:hv_battery_box"] = "technic:hv_battery_box0",
|
||||
["technic:hv_cable"] = "technic:hv_cable0",
|
||||
["technic:lv_cable"] = "technic:lv_cable0",
|
||||
["technic:mv_cable"] = "technic:mv_cable0",
|
||||
["technic:mv_battery_box"] = "technic:mv_battery_box0",
|
||||
["technic:generator"] = "technic:lv_generator",
|
||||
["technic:generator_active"] = "technic:lv_generator_active",
|
||||
["technic:iron_dust"] = "technic:wrought_iron_dust",
|
||||
["technic:enriched_uranium"] = "technic:uranium35_ingot",
|
||||
}
|
||||
|
||||
for old, new in pairs(technic.legacy_nodenames) do
|
||||
minetest.register_alias(old, new)
|
||||
end
|
||||
|
||||
for i = 0, 64 do
|
||||
minetest.register_alias("technic:hv_cable"..i, "technic:hv_cable")
|
||||
minetest.register_alias("technic:mv_cable"..i, "technic:mv_cable")
|
||||
minetest.register_alias("technic:lv_cable"..i, "technic:lv_cable")
|
||||
end
|
||||
|
||||
-- Item meta
|
||||
|
||||
-- Meta keys that have changed
|
||||
technic.legacy_meta_keys = {
|
||||
["charge"] = "technic:charge",
|
||||
}
|
||||
|
||||
-- Converts legacy itemstack metadata string to itemstack meta and returns the ItemStackMetaRef
|
||||
function technic.get_stack_meta(itemstack)
|
||||
local meta = itemstack:get_meta()
|
||||
local legacy_string = meta:get("") -- Get deprecated metadata
|
||||
if legacy_string then
|
||||
local legacy_table = minetest.deserialize(legacy_string)
|
||||
if legacy_table then
|
||||
local table = meta:to_table()
|
||||
for k, v in pairs(legacy_table) do
|
||||
table.fields[technic.legacy_meta_keys[k] or k] = v
|
||||
end
|
||||
meta:from_table(table)
|
||||
end
|
||||
meta:set_string("", "") -- Remove deprecated metadata
|
||||
end
|
||||
return meta
|
||||
end
|
||||
|
||||
-- Same as technic.get_stack_meta for cans.
|
||||
-- (Cans didn't store a serialized table in the legacy metadata string, but just a number.)
|
||||
function technic.get_stack_meta_cans(itemstack)
|
||||
local meta = itemstack:get_meta()
|
||||
local legacy_string = meta:get("") -- Get deprecated metadata
|
||||
if legacy_string then
|
||||
meta:set_string("can_level", legacy_string)
|
||||
meta:set_string("", "") -- Remove deprecated metadata
|
||||
return meta
|
||||
end
|
||||
return meta
|
||||
end
|
||||
|
@ -25,21 +25,24 @@ Mixed Metal Ingot = Mischmetallbarren
|
||||
Composite Plate = Verbundplatte
|
||||
Copper Plate = Kupferplatte
|
||||
Carbon Plate = Kohlefaserplatte
|
||||
Graphite = Graphit
|
||||
Graphite = Graphit
|
||||
Carbon Cloth = Kohlefasergewebe
|
||||
Raw Latex = Rohlatex
|
||||
Rubber Fiber = Gummifaser
|
||||
%.1f%%-Fissile Uranium Ingot =
|
||||
%.1f%%-Fissile Uranium Block =
|
||||
|
||||
## Machine misc
|
||||
Machine cannot be removed because it is not empty = Die Maschine kann nicht entfernt werden, weil sie noch nicht leer ist.
|
||||
Inventory move disallowed due to protection = Das Inventar ist geschuetzt, Zugriff verweigert.
|
||||
# $1: Machine name (Includes tier)
|
||||
@1 Active (@2 EU) = @1 ist eingeschaltet (@2 EU)
|
||||
%s Active = %s ist eingeschaltet
|
||||
%s Disabled = %s ist ausgeschaltet
|
||||
%s Enabled =
|
||||
%s Idle = %s ist bereit
|
||||
%s Improperly Placed = %s ist falsch plaziert
|
||||
%s Unpowered = %s hat keine Stromversorgung
|
||||
%s Unpowered = %s hat keine Stromversorgung
|
||||
%s Out Of Fuel = %s hat keinen Brennstoff
|
||||
%s Has Bad Cabling = %s ist falsch verkabelt
|
||||
%s Has No Network = %s hat kein Netzwerk
|
||||
@ -50,19 +53,23 @@ Upgrade Slots = Verbesserungsfaecher
|
||||
In: = Rein:
|
||||
Out: = Raus:
|
||||
Slot %d = Fach %d
|
||||
Mode: %s = Methode: %s
|
||||
single items = Einzelstuecke
|
||||
whole stacks = Ganzer Stapel
|
||||
Itemwise = Einzelstuecke
|
||||
Stackwise = Ganzer Stapel
|
||||
Owner: =
|
||||
Unlocked =
|
||||
Locked =
|
||||
Radius: =
|
||||
Enabled =
|
||||
Disabled =
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace = %s Legierungsofen
|
||||
%s Battery Box = %s Batteriebox
|
||||
%s Cable = %s Kabel
|
||||
%s CNC Machine = %s CNC-Maschine
|
||||
%s Compressor = %s Kompressor
|
||||
%s Extractor = %s Extraktor
|
||||
%s Forcefield Emitter = %s Kraftfeld-Emitter
|
||||
%s Forcefield Emitter = %s Kraftfeld-Emitter
|
||||
%s Furnace = %s Ofen
|
||||
%s Grinder = %s Schleifmaschine
|
||||
%s Music Player = %s Musikspieler
|
||||
@ -75,7 +82,7 @@ Hydro %s Generator = %s Wassermuehle
|
||||
Nuclear %s Generator Core = %s Reaktorkern
|
||||
Small Solar %s Generator = %s Solarmodul
|
||||
Wind %s Generator = %s Windmuehle
|
||||
Injector = Injektor
|
||||
Self-Contained Injector = Selbstversorger-Injektor
|
||||
Constructor Mk%d = Konstruktor Modell %d
|
||||
Frame = Rahmen
|
||||
Frame Motor = Rahmenmotor
|
||||
@ -91,55 +98,27 @@ Fuel-Fired Furnace = Kohle-Ofen
|
||||
Wind Mill Frame = Windmuehlengeruest
|
||||
Forcefield = Kraftfeld
|
||||
Nuclear Reactor Rod Compartment = Brennstabfaecher
|
||||
Administrative World Anchor =
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
Charge = Aufladen
|
||||
Discharge = Entladen
|
||||
Power level = Energiestufe
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
%s Battery Box: %d/%d = %s Batteriebox: %d/%d
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
@1 Battery Box: @2/@3 = @1 Batteriebox: @2/@3
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
%s. Supply: %d Demand: %d = %s. Versorgung: %d Bedarf: %d
|
||||
@1. Supply: @2 Demand: @3 = @1. Versorgung: @2 Bedarf: @3
|
||||
Production at %d%% = Produktion bei %d%%
|
||||
Choose Milling Program: = Waehle ein Fraesprogramm:
|
||||
Slim Elements half / normal height: = Schmale Elemente von halber / normaler Hoehe:
|
||||
Current track %s = Aktueller Titel %s
|
||||
|
||||
## CNC
|
||||
Cylinder = Zylinder
|
||||
Element Cross = Halbes Kreuzelement
|
||||
Element Cross Double = Kreuzelement
|
||||
Element Edge = Halbes Eckelement
|
||||
Element Edge Double = Eckelement
|
||||
Element End = Halbes Endelement
|
||||
Element End Double = Endelement
|
||||
Element Straight = Halbes aufrechtes Element
|
||||
Element Straight Double = Aufrechtes Element
|
||||
Element T = Halbes T-Element
|
||||
Element T Double = T-Element
|
||||
Horizontal Cylinder = Liegender Zylinder
|
||||
One Curved Edge Block = Block mit einer abgerundeten Kante
|
||||
Pyramid = Pyramide
|
||||
Slope = Schraege
|
||||
Slope Edge = Schraege mit Ecke
|
||||
Slope Inner Edge = Schraege mit Innenecke
|
||||
Slope Lying = Liegende Schraege
|
||||
Slope Upside Down = Umgedrehte Schraege
|
||||
Slope Upside Down Edge = Umgedrehte Schraege mit Ecke
|
||||
Slope Upside Down Inner Edge = Umgedrehte Schraege mit Innenecke
|
||||
Sphere = Kugel
|
||||
Spike = Spitze
|
||||
Stick = Stange
|
||||
Two Curved Edge Block = Block mit zwei abgerundeten Kanten
|
||||
Brick = Ziegel:
|
||||
Cobble = Pflasterstein:
|
||||
Dirt = Erde:
|
||||
Leaves = Laub:
|
||||
Sandstone = Sandstein:
|
||||
Stone = Stein:
|
||||
Tree = Baumstamm:
|
||||
Wooden = Holz:
|
||||
Stopped =
|
||||
Keeping %d/%d map blocks loaded =
|
||||
Digging not started =
|
||||
Digging finished =
|
||||
Digging %d m above machine =
|
||||
Digging %d m below machine =
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
@ -162,6 +141,7 @@ Talinite = Talinite
|
||||
Tin = Zinn
|
||||
Wrought Iron = Schmiedeeisen
|
||||
Zinc = Zink
|
||||
%.1f%%-Fissile Uranium =
|
||||
|
||||
## Tools
|
||||
RE Battery = Akkubatterie
|
||||
|
@ -29,11 +29,14 @@ Graphite = Grafito
|
||||
Carbon Cloth = Tela de Carbon
|
||||
Raw Latex = Latex Crudo
|
||||
Rubber Fiber = Fibra de Hule
|
||||
%.1f%%-Fissile Uranium Ingot =
|
||||
%.1f%%-Fissile Uranium Block =
|
||||
|
||||
## Machine misc
|
||||
Machine cannot be removed because it is not empty = La maquina no puede removerse porque no esta vacia
|
||||
Inventory move disallowed due to protection =
|
||||
# $1: Machine name (Includes tier)
|
||||
@1 Active (@2 EU) = @1 Activo (@2 EU)
|
||||
%s Active = %s Activo
|
||||
%s Enabled =
|
||||
%s Idle = %s Quieto
|
||||
@ -46,13 +49,20 @@ Inventory move disallowed due to protection =
|
||||
%s Improperly Placed = %s No Colocado Apropiadamente
|
||||
Range = Alcance
|
||||
Enable/Disable = Habilitar/Deshabilitar
|
||||
Itemwise =
|
||||
Stackwise =
|
||||
Owner: =
|
||||
Unlocked =
|
||||
Locked =
|
||||
Radius: =
|
||||
Enabled =
|
||||
Disabled =
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace = Horno de Aleacion %s
|
||||
%s Battery Box = Caja de Bateria %s
|
||||
%s Cable = Cable %s
|
||||
%s CNC Machine = Maquina CNC %s
|
||||
%s Compressor = Compresor %s
|
||||
%s Extractor = Extractor %s
|
||||
%s Forcefield Emitter = Emisor de Campo de Fuerza %s
|
||||
@ -68,7 +78,7 @@ Hydro %s Generator = Molino de Agua %s
|
||||
Nuclear %s Generator Core = Nucleo de Reactor Nuclear %s
|
||||
Small Solar %s Generator = Panel Solar %s
|
||||
Wind %s Generator = Molino de Viento %s
|
||||
Injector =
|
||||
Self-Contained Injector =
|
||||
Constructor Mk%d =
|
||||
Frame =
|
||||
Frame Motor =
|
||||
@ -84,52 +94,25 @@ Fuel-Fired Furnace = Horno a Carbon
|
||||
Forcefield = Campo de Fuerza
|
||||
Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear
|
||||
Wind Mill Frame = Armazon de Molino de Viento
|
||||
Administrative World Anchor =
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
Charge = Cargar
|
||||
Discharge = Descargar
|
||||
Power level = Nivel de Poder
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
%s Battery Box: %d/%d = Caja de Bateria %s: %d/%d
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
@1 Battery Box: @2/@3 = Caja de Bateria @1: @2/@3
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
%s. Supply: %d Demand: %d = %s. Alimentacion: %d Demanda: %d
|
||||
@1. Supply: @2 Demand: @3 = @1. Alimentacion: @2 Demanda: @3
|
||||
# $1: Production percent
|
||||
Production at %d%% = Produccion en %d%%
|
||||
|
||||
## CNC Machine
|
||||
Element Edge = Elemento Borde
|
||||
Tree = Arbol
|
||||
Element Cross Double = Elemento Cruz Doble
|
||||
Spike = Pica
|
||||
Element Edge Double = Elemento Borde Doble
|
||||
Two Curved Edge Block = Dos Bloques de Borde Curvados
|
||||
Pyramid = Piramide
|
||||
Slope Upside Down Inner Edge = Borde Interno de Rampa Al Reves
|
||||
Slope Upside Down Edge = Borde de Rampa Al Reves
|
||||
Element Straight Double = Elemento Doble Recto
|
||||
Sphere = Esfera
|
||||
Element End Double = Doble Fin de Elemento
|
||||
Element Straight = Recta de Elemento
|
||||
Horizontal Cylinder = Cilindro Horizontal
|
||||
Slope Inner Edge = Borde Interno de Rampa
|
||||
One Curved Edge Block = Un Bloque de Borde Curvado
|
||||
Element Cross = Cruce de Elementos
|
||||
Stick = Varita
|
||||
Element End = Fin de Elemento
|
||||
Slope Lying = Rampa en Reposo
|
||||
Slope Upside Down = Rampa Al Reves
|
||||
Slope Edge = Borde de Rampa
|
||||
Slope = Rampa
|
||||
Element T = Elemento T
|
||||
Cylinder = Cilindro
|
||||
Cobble = Adoquines
|
||||
Stone = Piedra
|
||||
Brick = Ladrillo
|
||||
Dirt = Tierra
|
||||
Sandstone = Arenisca
|
||||
Wooden = Madera
|
||||
Leaves = Hojas
|
||||
Stopped =
|
||||
Keeping %d/%d map blocks loaded =
|
||||
Digging not started =
|
||||
Digging finished =
|
||||
Digging %d m above machine =
|
||||
Digging %d m below machine =
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
@ -152,6 +135,7 @@ Talinite = Talinita
|
||||
Tin = Estanio
|
||||
Wrought Iron = Hierro Forjado
|
||||
Zinc = Zinc
|
||||
%.1f%%-Fissile Uranium =
|
||||
|
||||
## Tools
|
||||
RE Battery =
|
||||
|
215
technic/locale/fr.txt
Normal file
@ -0,0 +1,215 @@
|
||||
# template.txt
|
||||
# Template for translations of Technic
|
||||
|
||||
## Misc
|
||||
[Technic] Loaded in %f seconds = [Technic] Chargement en %f secondes
|
||||
|
||||
## Items
|
||||
Silicon Wafer = Tranche de silicium
|
||||
Doped Silicon Wafer = Tranche de silicium doppée
|
||||
Enriched Uranium = Uranium enrichi
|
||||
Uranium Fuel = Uranium 235
|
||||
Diamond Drill Head = Tête de forage en diamant
|
||||
Blue Energy Crystal = Cristal d'énergie bleu
|
||||
Green Energy Crystal = Cristal d'énergie vert
|
||||
Red Energy Crystal = Cristal d'énergie rouge
|
||||
Fine Copper Wire = Fil en cuivre fin
|
||||
Fine Gold Wire = Fil en or fin
|
||||
Fine Silver Wire = Fil en argent fin
|
||||
Copper Coil = Bobine de cuivre
|
||||
Electric Motor = Moteur électrique
|
||||
Low Voltage Transformer = Transformateur basse tension
|
||||
Medium Voltage Transformer = Transformateur moyenne tension
|
||||
High Voltage Transformer = Transformateur haute tension
|
||||
Control Logic Unit = Unité de contrôle logique
|
||||
Mixed Metal Ingot = Lingot de métal allié
|
||||
Composite Plate = Plaque composite
|
||||
Copper Plate = Plaque de cuivre
|
||||
Carbon Plate = Plaque de carbone
|
||||
Graphite = Graphite
|
||||
Carbon Cloth = Fibre de carbone
|
||||
Raw Latex = Latex brut
|
||||
Rubber Fiber = Fibre de caoutchouc
|
||||
%.1f%%-Fissile Uranium Ingot = Lingot d'uranium fissile (%.1f%%)
|
||||
%.1f%%-Fissile Uranium Block = Bloc d'uranium fissile (%.1f%%)
|
||||
|
||||
## Machine misc
|
||||
Machine cannot be removed because it is not empty = La machine ne peut pas être retirée car elle n'est pas vide
|
||||
Inventory move disallowed due to protection = Le mouvement d'inventaire n'est pas autorisé en raison de la protection
|
||||
|
||||
# $1: Machine name (Includes tier)
|
||||
@1 Active (@2 EU) = @1 Active (@2 EU)
|
||||
%s Active = %s actif
|
||||
%s Disabled = %s désactivé
|
||||
%s Enabled = %s activé
|
||||
%s Idle = %s au repos
|
||||
%s Improperly Placed = %s est mal placé
|
||||
%s is empty = %s est vide
|
||||
%s Unpowered = %s non alimenté en énergie
|
||||
%s Out Of Fuel = %s plus de carburant
|
||||
%s Has Bad Cabling = %s est mal cablé
|
||||
%s (Slave) = %s (esclave)
|
||||
%s Has No Network = %s n'a pas de réseau
|
||||
%s Finished = %s a fini
|
||||
Enable/Disable = Activer/Désactiver
|
||||
Range = Plage
|
||||
Upgrade Slots = Emplacement d'amélioration
|
||||
In: = Entrée :
|
||||
Out: = Sortie :
|
||||
Slot %d = Emplacement %d
|
||||
Itemwise = Item par Item
|
||||
Stackwise = Stack par Stack
|
||||
Ignoring Mesecon Signal = Ignorer le signal Mesecon
|
||||
Controlled by Mesecon Signal = Contrôlé par signal Mesecon
|
||||
Owner: = Propriétaire :
|
||||
Unlocked = Déverrouillé
|
||||
Locked = Verrouillé
|
||||
Radius: = Rayon :
|
||||
Enabled = Activé
|
||||
Disabled = Désactivé
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace = Four à alliage %s
|
||||
%s Battery Box = Batterie %s
|
||||
%s Cable = Câble %s
|
||||
%s CNC Machine = Machine-outils %s
|
||||
%s Centrifuge = Centrifugeuse %s
|
||||
%s Compressor = Compresseur %s
|
||||
%s Extractor = Extracteur %s
|
||||
%s Forcefield Emitter = Emetteur de champ de force %s
|
||||
%s Furnace = Four %s
|
||||
%s Grinder = Broyeur %s
|
||||
%s Music Player = Grammophone %s
|
||||
%s Quarry = Carrière %s
|
||||
%s Tool Workshop = Atelier d'outillage %s
|
||||
Arrayed Solar %s Generator = Générateur solaire %s
|
||||
Fuel-Fired %s Generator = Générateur thermique %s
|
||||
Geothermal %s Generator = Géénarteur géothermique %s
|
||||
Hydro %s Generator = Générateur hydroélectrique %s
|
||||
Nuclear %s Generator Core = Générateur nucléaire %
|
||||
Small Solar %s Generator = Petit générateur solaire %s
|
||||
Wind %s Generator = Générateur éolien %s
|
||||
Self-Contained Injector = Injecteur autonome
|
||||
Constructor Mk%d = Constructeur Mk%d
|
||||
Frame = Cadre
|
||||
Frame Motor = Cadre de moteur
|
||||
Template = Modèle
|
||||
Template (replacing) =
|
||||
Template Motor =
|
||||
Template Tool =
|
||||
Battery Box = Compartiment à batterie
|
||||
Supply Converter = Convertisseur de tension
|
||||
Switching Station = Station de commutation
|
||||
Fuel-Fired Alloy Furnace = Four à alliage à carburant
|
||||
Fuel-Fired Furnace = Four à carburant
|
||||
Wind Mill Frame = Cadre d'éolienne
|
||||
Forcefield = Champ de force
|
||||
Nuclear Reactor Rod Compartment = Compartiment à barres du réacteur nucléaire
|
||||
Administrative World Anchor =
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
Charge = Charger
|
||||
Discharge = Décharger
|
||||
Power level = Niveau d'énergie
|
||||
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
@1 Battery Box: @2/@3 = @1 batterie : @2/@3
|
||||
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
@1. Supply: @2 Demand: @3 = @1. fournit : @2 demande : @3
|
||||
Production at %d%% = Production à %d%%
|
||||
Choose Milling Program: = Choisissez le programme de fraisage :
|
||||
Slim Elements half / normal height: =
|
||||
Current track %s = Morceau actuel %s
|
||||
Stopped = Arrêté
|
||||
Keeping %d/%d map blocks loaded =
|
||||
Digging not started = Creusement non démarré
|
||||
Digging finished = Creusement terminé
|
||||
Digging %d m above machine = Creusement à %dm au dessus de la machine
|
||||
Digging %d m below machine = Creusement à %dm en dessous de la machine
|
||||
@1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5)
|
||||
|
||||
## CNC
|
||||
Cylinder =
|
||||
Element Cross = Elément croisé
|
||||
Element Cross Double = Elément croisé (double)
|
||||
Element Edge = Elément de bordure
|
||||
Element Edge Double = Elément de bordure (double)
|
||||
Element End = Elément de fin
|
||||
Element End Double = Elément de fin (double)
|
||||
Element Straight = Elément droit
|
||||
Element Straight Double = Elément droit (double)
|
||||
Element T = Elément en T
|
||||
Element T Double = Elément en T (double)
|
||||
Horizontal Cylinder = Cylindre horizontal
|
||||
One Curved Edge Block = Bloc à un bord incurvé
|
||||
Pyramid = Pyramide
|
||||
Slope = Pente
|
||||
Slope Edge =
|
||||
Slope Inner Edge =
|
||||
Slope Lying =
|
||||
Slope Upside Down =
|
||||
Slope Upside Down Edge =
|
||||
Slope Upside Down Inner Edge =
|
||||
Sphere = Sphère
|
||||
Spike = Pointe
|
||||
Stick = Bâton
|
||||
Two Curved Edge Block = Bloc à deux bords incurvés
|
||||
Brick = Brique
|
||||
Cobble = Pierre taillée
|
||||
Dirt = Terre
|
||||
Leaves = Feuilles
|
||||
Sandstone = Grès
|
||||
Stone = Pierre
|
||||
Tree = Arbre
|
||||
Wooden = Bois
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
%s Dust = Poudre de %s
|
||||
Akalin =
|
||||
Alatro =
|
||||
Arol =
|
||||
Brass = Laiton
|
||||
Bronze = Bronze
|
||||
Carbon Steel = Acier au carbone
|
||||
Cast Iron = Fonte
|
||||
Chromium = Chrome
|
||||
Coal = Charbon
|
||||
Copper = Cuivre
|
||||
Gold = Or
|
||||
Mithril = Mithril
|
||||
Silver = Argent
|
||||
Stainless Steel = Acier inoxydable
|
||||
Talinite = Talanite
|
||||
Tin = Etain
|
||||
Wrought Iron = Fer
|
||||
Zinc = Zinc
|
||||
%.1f%%-Fissile Uranium = Uranium fissile (%.1f%%)
|
||||
|
||||
## Tools
|
||||
RE Battery = Batterie RE
|
||||
Water Can = Jerrycan d'eau
|
||||
Lava Can = Jerrycan de lave
|
||||
Chainsaw = Tronçonneuse
|
||||
Flashlight = Lampe-torche
|
||||
3 nodes deep. =
|
||||
3 nodes tall. =
|
||||
3 nodes wide. =
|
||||
3x3 nodes. =
|
||||
Use while sneaking to change Mining Drill Mk%d modes. =
|
||||
Mining Drill Mk%d Mode %d = Foreuse Mk%d Mode %d
|
||||
Mining Drill Mk%d = Foreuse Mk%d
|
||||
Mining Laser Mk%d = Foreuse laser Mk%d
|
||||
Single node. = Mode simple.
|
||||
Sonic Screwdriver = Tournevis supersonique
|
||||
Tree Tap = Robinet à sève
|
||||
|
||||
## Craft descriptions
|
||||
Alloy cooking = Fonderie d'alliage
|
||||
Grinding = Broyage
|
||||
Compressing = Compression
|
||||
Extracting = Extraction
|
||||
Separating = Séparation
|
@ -26,14 +26,17 @@ Graphite = Lastra in graffite
|
||||
Carbon Cloth = Fibra di carbonio
|
||||
Raw Latex = Latex grezzo
|
||||
Rubber Fiber = Fibra di gomma
|
||||
%.1f%%-Fissile Uranium Ingot = %.1f%%-Lingotto di uranio fissile
|
||||
%.1f%%-Fissile Uranium Block = %.1f%%-Blocco di uranio fissile
|
||||
|
||||
## Machine misc
|
||||
Machine cannot be removed because it is not empty = La macchina non può essere rimossa perchè non è vuota
|
||||
Inventory move disallowed due to protection = Impossibile muovere l'inventario a causa della protezione
|
||||
# $1: Machine name (Includes tier)
|
||||
@1 Active (@2 EU) = @1 Attivo (@2 EU)
|
||||
%s Active = %s Attivo
|
||||
%s Disabled = %s Disabilitato
|
||||
%s Enabled =
|
||||
%s Enabled = %s Abilitato
|
||||
%s Idle = %s Inattivo
|
||||
%s Improperly Placed = %s Piazzato impropiamente
|
||||
%s Unpowered = %s Non alimentato
|
||||
@ -43,20 +46,24 @@ Inventory move disallowed due to protection = Impossibile muovere l'inventario a
|
||||
%s Finished = %s Finito
|
||||
Enable/Disable = Abilita/Disabilita
|
||||
Range = Raggio
|
||||
Upgrade Slots =
|
||||
Upgrade Slots = Alloggi di aggiornamento
|
||||
In: = Ingresso:
|
||||
Out: = Uscita:
|
||||
Slot %d =
|
||||
Mode: %s = Modalità: %s
|
||||
single items = Singolo elemento
|
||||
whole stacks = pila completa
|
||||
Slot %d = Alloggio %d
|
||||
Itemwise = Singolo elemento
|
||||
Stackwise = pila completa
|
||||
Owner: = Proprietario:
|
||||
Unlocked = Non chiuso a chiave
|
||||
Locked = Chiuso a chiave
|
||||
Radius: = Raggio:
|
||||
Enabled = Abilitato
|
||||
Disabled = Disabilitato
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace = %s Fornace per leghe
|
||||
%s Battery Box = %s Box batterie
|
||||
%s Cable = Cavo %s
|
||||
%s CNC Machine = Tornio CNC %s
|
||||
%s Compressor = Compressore %s
|
||||
%s Extractor = Estrattore %s
|
||||
%s Forcefield Emitter = Emettitore di campo di forza %s
|
||||
@ -72,14 +79,14 @@ Hydro %s Generator = Turbina Elettrica %s
|
||||
Nuclear %s Generator Core = Reattore nucleare %s
|
||||
Small Solar %s Generator = %s Pannello solare
|
||||
Wind %s Generator = %s Generatore eolico
|
||||
Injector = Ignettore
|
||||
Self-Contained Injector = Ignettore
|
||||
Constructor Mk%d = Costruttore Mk%d
|
||||
Frame = Cornice
|
||||
Frame Motor = Cornice del motore
|
||||
Template =
|
||||
Template (replacing) = Template (rimpiazzato)
|
||||
Template Motor =
|
||||
Template Tool =
|
||||
Template = Sagoma
|
||||
Template (replacing) = Sagoma (di rimpiazzo)
|
||||
Template Motor = Motore per sagome
|
||||
Template Tool = Strumento per sagome
|
||||
Battery Box = Box batterie
|
||||
Supply Converter = Trasformatore
|
||||
Switching Station = Stazione di controllo
|
||||
@ -88,6 +95,7 @@ Fuel-Fired Furnace = Fornace a carbone
|
||||
Wind Mill Frame = Pala eolica
|
||||
Forcefield = Campo di forza
|
||||
Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare
|
||||
Administrative World Anchor = Ancora-mondo amministrativa
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
@ -95,48 +103,19 @@ Charge = Carica
|
||||
Discharge = Scarica
|
||||
Power level = Livello di potenza
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
%s Battery Box: %d/%d = %s Box Batterie: %d/%d
|
||||
@1 Battery Box: @2/@3 = @1 Box Batterie: @2/@3
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
%s. Supply: %d Demand: %d = %s. Prodotto: %d Consumato: %d
|
||||
@1. Supply: @2 Demand: @3 = @1. Prodotto: @2 Consumato: @3
|
||||
Production at %d%% = Produzione a %d%%
|
||||
Choose Milling Program: = Scegliere un programma di Fresatura
|
||||
Slim Elements half / normal height: = Metà elementi sottili / altezza normale:
|
||||
Current track %s = Traccia corrente %s
|
||||
|
||||
## CNC
|
||||
Cylinder = Cilindro
|
||||
Element Cross = Elemento a croce
|
||||
Element Cross Double = Elemento a croce doppio
|
||||
Element Edge = Elemento bordo
|
||||
Element Edge Double = Elemento bordo doppio
|
||||
Element End = Elemento finale
|
||||
Element End Double = Elemento finale doppio
|
||||
Element Straight = Elemento dritto
|
||||
Element Straight Double = Elemento dritto doppio
|
||||
Element T = Elemento a T
|
||||
Element T Double = Elemento a T doppio
|
||||
Horizontal Cylinder = Cilindro orizzontale
|
||||
One Curved Edge Block = Blocco con bordo curvo
|
||||
Pyramid = Piramide
|
||||
Slope = Inclinato
|
||||
Slope Edge = Bordo inclinato
|
||||
Slope Inner Edge = Bordo interno inclinato
|
||||
Slope Lying = Pendenza bugiarda
|
||||
Slope Upside Down = Pendenza capovolta
|
||||
Slope Upside Down Edge = Bordo inclinato capovolto
|
||||
Slope Upside Down Inner Edge = Bordo interno inclinato capovolto
|
||||
Sphere = Sfera
|
||||
Spike = Spuntone
|
||||
Stick = Bastone
|
||||
Two Curved Edge Block = Blocco con bordo a doppia curva
|
||||
Brick = Mattone
|
||||
Cobble = Ciottolato
|
||||
Dirt = Terra
|
||||
Leaves = Foglie
|
||||
Sandstone = Arenaria
|
||||
Stone = Pietra
|
||||
Tree = Albero
|
||||
Wooden = Legno
|
||||
Stopped = Fermato
|
||||
Keeping %d/%d map blocks loaded = Mantenimento di %d/%d blocchi mappa caricati
|
||||
Digging not started = Scavo non iniziato
|
||||
Digging finished = Scavo finito
|
||||
Digging %d m above machine = Scavo di %d m sopra la macchina
|
||||
Digging %d m below machine = Scavo di %d m sotto la macchina
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
@ -159,9 +138,10 @@ Talinite = Talinite
|
||||
Tin = Stagno
|
||||
Wrought Iron = Ferro Battuto
|
||||
Zinc = Zinco
|
||||
%.1f%%-Fissile Uranium = %.1f%%-Uranio fissile
|
||||
|
||||
## Tools
|
||||
RE Battery =
|
||||
RE Battery = Batteria RE
|
||||
Water Can = Serbatoio d'acqua
|
||||
Lava Can = Serbatoio di lava
|
||||
Chainsaw = Motosega
|
||||
|
175
technic/locale/pl.txt
Normal file
@ -0,0 +1,175 @@
|
||||
# Polish Translation for Technic mod
|
||||
# Polskie tłumaczenie Technic mod
|
||||
# by mat9117
|
||||
|
||||
## Misc
|
||||
[Technic] Loaded in %f seconds = [Technic] Wczytany w %f sekund
|
||||
|
||||
## Items
|
||||
Silicon Wafer = Płytka krzemowa
|
||||
Doped Silicon Wafer = Domieszkowana płytka krzemowa
|
||||
Enriched Uranium = Wzbogacony uran
|
||||
Uranium Fuel = Paliwo uranowe
|
||||
Diamond Drill Head = Diamentowa głowica wiertła
|
||||
Blue Energy Crystal = Niebieski kryształ energii
|
||||
Green Energy Crystal = Zielony kryształ energii
|
||||
Red Energy Crystal = Czerwony kryształ energii
|
||||
Fine Copper Wire = Cienki miedziany drut
|
||||
Copper Coil = Miedziana cewka
|
||||
Electric Motor = Silnik elektryczny
|
||||
Low Voltage Transformer = Transformator niskiego napięcia
|
||||
Medium Voltage Transformer = Transformator średniego napięcia
|
||||
High Voltage Transformer = Transformator wysokiego napięcia
|
||||
Control Logic Unit = Jednostka sterująca
|
||||
Mixed Metal Ingot = Sztabka zmieszanych metali
|
||||
Composite Plate = Płytka kompozytowa
|
||||
Copper Plate = Płytka miedziana
|
||||
Carbon Plate = Płytka węglowa
|
||||
Graphite = Grafit
|
||||
Carbon Cloth = Włókno węglowe
|
||||
Raw Latex = Lateks naturalny
|
||||
Rubber Fiber = Włókno gumowe
|
||||
%.1f%%-Fissile Uranium Ingot = %.1f%% Sztabka uranu
|
||||
%.1f%%-Fissile Uranium Block = %.1f%% Blok uranu
|
||||
|
||||
## Machine misc
|
||||
Machine cannot be removed because it is not empty = Nie można usunąć maszyny, ponieważ nie jest pusta
|
||||
Inventory move disallowed due to protection = Przenoszenie rzeczy z ekwipunku niemożliwe z powodu ochrony
|
||||
# $1: Machine name (Includes tier)
|
||||
@1 Active (@2 EU) = @1 Aktywny (@2 EU)
|
||||
%s Active = %s Aktywny/a
|
||||
%s Disabled = %s Wyłączony/a
|
||||
%s Enabled = %s Włączony/a
|
||||
%s Idle = %s Bezczynny/a
|
||||
%s Improperly Placed = %s Ustawiony/a nieprawidłowo
|
||||
%s is empty = %s jest pusty/a
|
||||
%s Unpowered = %s brak zasilania
|
||||
%s Out Of Fuel = %s brak paliwa
|
||||
%s Has Bad Cabling = %s Źle podłączono kable
|
||||
%s (Slave) =
|
||||
%s Has No Network = %s Nie podłączony/a do sieci
|
||||
%s Finished = %s Ukończony
|
||||
Enable/Disable = Włącz/Wyłącz
|
||||
Range = Zasięg
|
||||
Upgrade Slots = Miejsca na ulepszenia
|
||||
In: = Wejście
|
||||
Out: = Wyjście
|
||||
Slot %d = Otwór %d
|
||||
Itemwise = Jeden przedmiot
|
||||
Stackwise = Cały stack
|
||||
Ignoring Mesecon Signal = Ignoruj sygnał Mesecon
|
||||
Controlled by Mesecon Signal = Sterowany sygnałem Mesecon
|
||||
Owner: = Właściciel:
|
||||
Unlocked = Odblokowany/a
|
||||
Locked = Zablokowany/a
|
||||
Radius: = Promień:
|
||||
Enabled = Włączony/a
|
||||
Disabled = Wyłączony/a
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace = %s Piec stopowy
|
||||
%s Battery Box = %s Skrzynka baterii
|
||||
%s Cable = %s Przewód
|
||||
%s Centrifuge = %s Centryfuga
|
||||
%s Compressor = %s Kompresor
|
||||
%s Extractor = %s Ekstraktor
|
||||
%s Forcefield Emitter = %s Emiter pola siłowego
|
||||
%s Furnace = %s Piec
|
||||
%s Grinder = %s Młynek
|
||||
%s Music Player = %s Odtwarzacz muzyki
|
||||
%s Quarry = %s Kamieniołom
|
||||
%s Tool Workshop = %s Warsztat narzędzi
|
||||
Arrayed Solar %s Generator = %s Szeregowy generator słoneczny
|
||||
Fuel-Fired %s Generator = %s Generator zasilany paliwem
|
||||
Geothermal %s Generator = %s Generator geotermalny
|
||||
Hydro %s Generator = %s Hydrogenerator
|
||||
Nuclear %s Generator Core = %s Reaktor atomowy
|
||||
Small Solar %s Generator = %s Mały generator słoneczny
|
||||
Wind %s Generator = %s Generator wiatrowy
|
||||
Self-Contained Injector = Samowystarczalny wtryskiwacz
|
||||
Constructor Mk%d = Konstruktor Mk%d
|
||||
Frame = Klatka
|
||||
Frame Motor = Silnik klatkowy
|
||||
Template = Szablon
|
||||
Template (replacing) = Szablon (zastępczy)
|
||||
Template Motor =Szablon silnika
|
||||
Template Tool = Szablon narzędzia
|
||||
Battery Box = Skrzynka baterii
|
||||
Supply Converter = Konwerter zasilania
|
||||
Switching Station = Rozdzielnia
|
||||
Fuel-Fired Alloy Furnace = Piec stopowy zasilany paliwem
|
||||
Fuel-Fired Furnace = Piec zasilany paliwem
|
||||
Wind Mill Frame = Klatka wiatraka
|
||||
Forcefield = Pole siłowe
|
||||
Nuclear Reactor Rod Compartment = Komora rdzenia reaktora atomowego
|
||||
Administrative World Anchor = Administracyjna kotwica świata
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
Charge = Ładuj
|
||||
Discharge = Rozładuj
|
||||
Power level = Poziom zasilania
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
@1 Battery Box: @2/@3 = @1 Skrzynka baterii: @2/@3
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
@1. Supply: @2 Demand: @3 = @1. Zapas: @2 Pobór: @3
|
||||
Production at %d%% = Produkowanie w %d%%
|
||||
Choose Milling Program: = Wybierz program mielenia:
|
||||
Slim Elements half / normal height: = Małe elementy połowa / normalna wysokość:
|
||||
Current track %s =
|
||||
Stopped = Zatrzymany/a
|
||||
Keeping %d/%d map blocks loaded = Ciągle ładuję %d/%d bloki mapy
|
||||
Digging not started = Nie rozpoczęto kopania
|
||||
Digging finished = Kopanie skończone
|
||||
Digging %d m above machine = Kopię %d m nad maszyną
|
||||
Digging %d m below machine = Kopię %d m pod maszyną
|
||||
@1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5)
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
%s Dust = %s Pył
|
||||
Akalin = Akalinowy
|
||||
Alatro = Alatrowy
|
||||
Arol = Arolowy
|
||||
Brass = Mosiądzu
|
||||
Bronze = Brązu
|
||||
Carbon Steel = Stali węglowej
|
||||
Cast Iron = Żeliwa
|
||||
Chromium = Chromu
|
||||
Coal = Węglowy
|
||||
Copper = Miedzi
|
||||
Gold = Złoty
|
||||
Mithril = Mithrilu
|
||||
Silver = Srebrny
|
||||
Stainless Steel = Stali nierdzewnej
|
||||
Talinite = Talinitu
|
||||
Tin = Cyny
|
||||
Wrought Iron = Kutego żelaza
|
||||
Zinc = Cynku
|
||||
%.1f%%-Fissile Uranium = %.1f%% Uranu
|
||||
|
||||
## Tools
|
||||
RE Battery = Bateria ładowalna
|
||||
Water Can = Kanister wody
|
||||
Lava Can = Kanister lawy
|
||||
Chainsaw = Piła łańcuchowa
|
||||
Flashlight = Latarka
|
||||
3 nodes deep. = Głęboki na 3 bloki.
|
||||
3 nodes tall. = Wysoki na 3 bloki.
|
||||
3 nodes wide. = Szeroki na 3 bloki.
|
||||
3x3 nodes. = 3x3 bloki.
|
||||
Use while sneaking to change Mining Drill Mk%d modes. = Użyj podczas skradania, aby zmienić tryby wiertła górniczego Mk%d
|
||||
Mining Drill Mk%d Mode %d = Tryb wiertła górniczego Mk%d
|
||||
Mining Drill Mk%d = Wiertło górnicze Mk%d
|
||||
Mining Laser Mk%d = Laser górniczy Mk%d
|
||||
Single node. = Pojedynczy blok.
|
||||
Sonic Screwdriver = Dźwiękowy śrubokręt
|
||||
Tree Tap = Nacinak drzewny
|
||||
|
||||
## Craft descriptions
|
||||
Alloy cooking = Stapianie
|
||||
Grinding = Mielenie
|
||||
Compressing = Kompresowanie
|
||||
Extracting = Ekstrakcja
|
||||
Separating = Oddzielanie
|
211
technic/locale/pt_BR.txt
Normal file
@ -0,0 +1,211 @@
|
||||
# Braziliam portuguese translation for technic
|
||||
# Tradução portuguesa brasileira para technic
|
||||
# By Sires
|
||||
|
||||
## Misc
|
||||
[Technic] Loaded in %f seconds = [Technic] Carregado em %f segundos
|
||||
|
||||
## Items
|
||||
Silicon Wafer = Pastilha de Silício
|
||||
Doped Silicon Wafer = Pastilha de Silício Dopada
|
||||
Enriched Uranium = Urânio Enriquecido
|
||||
Uranium Fuel = Combustivel de Urânio
|
||||
Diamond Drill Head = Cabeça de Broca de Diamante
|
||||
Blue Energy Crystal = Cristal de Energia Azul
|
||||
Green Energy Crystal = Cristal de Energia Verde
|
||||
Red Energy Crystal = Cristal de Energia Vermelho
|
||||
Fine Copper Wire = Fio Fino de Cobre
|
||||
Copper Coil = Bobina de Cobre
|
||||
Electric Motor = Motor Elétrico
|
||||
Low Voltage Transformer = Transformador de Baixa Voltagem
|
||||
Medium Voltage Transformer = Transformador de Média Voltagem
|
||||
High Voltage Transformer = Transformador de Alta Voltagem
|
||||
Control Logic Unit = Unidade de Controle Lógico
|
||||
Mixed Metal Ingot = Lingote de Metal Misturado
|
||||
Composite Plate = Placa Composta
|
||||
Copper Plate = Placa de Cobre
|
||||
Carbon Plate = Placa de Carbono
|
||||
Graphite = Grafite
|
||||
Carbon Cloth = Recido de Carbono
|
||||
Raw Latex = Latex bruto
|
||||
Rubber Fiber = Fibra de Borracha
|
||||
%.1f%%-Fissile Uranium Ingot = Lingote de Urânio %.1f%%-Físsil
|
||||
%.1f%%-Fissile Uranium Block = Bloco de Urânio %.1f%%-Físsil
|
||||
|
||||
## Machine Misc
|
||||
Machine cannot be removed because it is not empty = A máquina não pode ser removida porque ela não está vazia
|
||||
Inventory move disallowed due to protection = Movimento de inventário não permitido pela proteção
|
||||
# $1: Machine name (includes tier)
|
||||
@1 Active (@2 EU) = @1 Ativo (@2 EU)
|
||||
%s Active = %s Ativo
|
||||
%s Disabled = %s Ativado
|
||||
%s Enabled = %s Desativado
|
||||
%s Idle = Ócio
|
||||
%s Improperly Placed = %s Colocado Inapropriadamente
|
||||
%s is empty = %s está vazio
|
||||
%s Unpowered = %s Sem energia
|
||||
%s Out Of Fuel = %s Sem Combustível
|
||||
%s Has Bad Cabling = %s Tem Cabeamento Ruim
|
||||
%s (Slave) = %s (Servo)
|
||||
%s Has No Network = %s Não Tem Rede
|
||||
%s Finished = %s Acabou
|
||||
Enable/Disable = Ativar/Desativar
|
||||
Range = Alcance
|
||||
Upgrade Slots = Lugares para Melhoria
|
||||
In: = Entrada:
|
||||
Out: = Saída:
|
||||
Slot %d = Lugar %d
|
||||
Itemwise = Por item
|
||||
Stackwise = Por pilha
|
||||
Ignoring Mesecon Signal = Ignorar Sinaal de Mesecon
|
||||
Controlled by Mesecon Signal = Controlado por Sinal de Mesecon
|
||||
Owner: = Dono:
|
||||
Unlocked = Destravado
|
||||
Locked = Travado
|
||||
Radius: = Raio:
|
||||
Enabled = Ativado
|
||||
Disabled = Desativado
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace = Fornalha de Liga %s
|
||||
%s Battery Box = Caixa de Bateria %s
|
||||
%s Cable = Cabo %s
|
||||
%s CNC Machine = Máquina CNC %s
|
||||
%s Centrifuge = Centrifuga %s
|
||||
%s Compressor = Compresso %s
|
||||
%s Extractor = Extrator %s
|
||||
%s Forcefield Emitter = Emissor de Campo de Força %s
|
||||
%s Furnace = Fornalha %s
|
||||
%s Grinder = Triturador %s
|
||||
%s Music Player = Tocador de Música %s
|
||||
%s Quarry = Pedreira %s
|
||||
%s Tool Workshop = Oficina de Ferramentas %s
|
||||
Arrayed Solar %s Generator = Gerador Solar Equipado %s
|
||||
Fuel-Fired %s Generator = Gerador Alimentado-por-Combustível %s
|
||||
Geothermal %s Generator = Gerador Geotermal %s
|
||||
Hydro %s Generator = Gerador Hidráulico %s
|
||||
Nuclear %s Generator Core = Núcleo de Gerador Nuclear %s
|
||||
Small Solar %s Generator = Gerador Solar Pequeno %s
|
||||
Wind %s Generator = Gerador de Energia Eólica %s
|
||||
Self-Contained Injector = Injetor Auto-Contido
|
||||
Constructor Mk%d = Construtor Nv%d
|
||||
Frame = Armação
|
||||
Frame Motor = Motor de Armação
|
||||
Template = Modelo
|
||||
Template (replacing) = Modelo (recolocando)
|
||||
Template Motor = Modelo de Motor
|
||||
Template Tool = Modelo de Ferramenta
|
||||
Battery Box = Caixa de Bateria
|
||||
Supply Converter = Conversor de Energia
|
||||
Switching Station = Estação de Comutação
|
||||
Fuel-Fired Alloy Furnace = Fornalha de Liga Alimentada-por-Combustível
|
||||
Fuel-Fired Furnace = Fornalha Alimentada-por-Combustível
|
||||
Wind Mill Frame = Armação de Moinho de Vento
|
||||
Forcefield = Campo de Força
|
||||
Nuclear Reactor Rod Compartment = Compartimento de Barra do Reator Nuclear
|
||||
Administrative World Anchor = Âncora de Mundo Administrativa
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
Charge = Carregar
|
||||
Discharge = Descarregar
|
||||
Power level = Nível de Energia
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
@1 Battery Box: @2/@3 = Caixa de Baterias @1: @2/@3
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
@1. Supply: @2 Demand: @3 = @1. Suprimento: @2 Demanda: @3
|
||||
Production at %d%% = Produção em %d%%
|
||||
Choose Milling Program: = Escolha o Programa de Serragem:
|
||||
Slim Elements half / normal height: = Metade de Elementos Finos / altura normal:
|
||||
Current track %s = Música Atual %s
|
||||
Stopped = Parado
|
||||
Keeping %d/%d map blocks loaded = Mantendo %d/%d blocos de mapa carregados
|
||||
Digging not started = Escavação não começada
|
||||
Digging finished = Escavação terminada
|
||||
Digging %d m above machine = Escavando %d m acima da máquina
|
||||
Digging %d m below machine = Escavando %d m abaixo da máquina
|
||||
@1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5)
|
||||
|
||||
## CNC
|
||||
Cylinder = Cilindro
|
||||
Element Cross = Cruz do Elemento
|
||||
Element Cross Double = Cruz Dupla do Elemento
|
||||
Element Edge = Borda do Elemento
|
||||
Element Edge Double = Borda Dupla do Elemento
|
||||
Element End = Final do Elemento
|
||||
Element End Double = Final Duplo do Elemento
|
||||
Element Straight = Elemento Contínuo
|
||||
Element Straight Double = Elemento Contínuo duplo
|
||||
Element T = Elemento em T
|
||||
Element T Double = Elemento em T Duplo
|
||||
Horizontal Cylinder = Cilindro Horizontal
|
||||
One Curved Edge Block = Uma Borda de Bloco Curvada
|
||||
Pyramid = Pirâmide
|
||||
Slope = Ladeira
|
||||
Slope Edge = Canto de Ladeira
|
||||
Slope Inner Edge = Canto de Dentro de Ladeira
|
||||
Slope Lying = Ladeira Deitada
|
||||
Slope Upside Down = Ladeira de Cabeça para Baixo
|
||||
Slope Upside Down Edge = Cande de Ladeira de Cabeça para Baixo
|
||||
Slope Upside Down Inner Edge = Canto de Dentro de Ladeira de Cabeça para Baixo
|
||||
Sphere = Esfera
|
||||
Spike = Espinho
|
||||
Stick = Graveto
|
||||
Two Curved Edge Block = Bloco de Duas Bordas Curvadas
|
||||
Brick = Tijolo
|
||||
Cobble = Pedregulho
|
||||
Dirt = Terra
|
||||
Leaves = Folhas
|
||||
Sandstone = Arenito
|
||||
Stone = Pedra
|
||||
Tree = Árvore
|
||||
Wooden = de Madeira
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
%s Dust = Pó de %s
|
||||
Akalin = Akalin
|
||||
Alatro = Alatro
|
||||
Arol = Arol
|
||||
Brass = Latão
|
||||
Bronze = Bronze
|
||||
Carbon Steel = Aço Carbono
|
||||
Cast Iron = Ferro Fundido
|
||||
Chromium = Crômio
|
||||
Coal = Carvão
|
||||
Copper = Cobre
|
||||
Gold = Ouro
|
||||
Mithril = Mithril
|
||||
Silver = Prata
|
||||
Stainless Steel = Aço Inoxidável
|
||||
Talinite = Talinite
|
||||
Tin = Estanho
|
||||
Wrought Iron = Ferro Forjado
|
||||
Zinc = Zinco
|
||||
%.1f%%-Fissile Uranium = Urânio %.1f%%-Físsil
|
||||
|
||||
## Tools
|
||||
RE Battery = Bateria RE
|
||||
Water Can = Lata de Água
|
||||
Lava Can = Lata de Lava
|
||||
Chainsaw = Motosserra
|
||||
Flashlight = Lanterna
|
||||
3 nodes deep. = 3 nodes de profundidade.
|
||||
3 nodes tall. = 3 nodes de altura.
|
||||
3 nodes wide. = 3 nodes de largura.
|
||||
3x3 nodes. = 3x3 nodes.
|
||||
Use while sneaking to change Mining Drill Mk%d modes. = Use enquanto esgueirando para mudar os modos da Broca de Mineração Nv%d.
|
||||
Mining Drill Mk%d Mode %d = Broca de Mineração Nv%d Modo %d
|
||||
Mining Drill Mk%d = Broca de Mineração Nv%d
|
||||
Mining Laser Mk%d = Laser de Mineração Nv%d
|
||||
Single node. = Unico node.
|
||||
Sonic Screwdriver = Chave de Fenda Sônica.
|
||||
Tree Tap = Torneira de Árvore
|
||||
|
||||
## Craft descriptions
|
||||
Alloy cooking = Cozinhando em liga
|
||||
Grinding = Triturando
|
||||
Compressing = Comprimindo
|
||||
Extracting = Extraindo
|
||||
Separating = Separando
|
@ -15,6 +15,8 @@ Blue Energy Crystal =
|
||||
Green Energy Crystal =
|
||||
Red Energy Crystal =
|
||||
Fine Copper Wire =
|
||||
Fine Gold Wire =
|
||||
Fine Silver Wire =
|
||||
Copper Coil =
|
||||
Electric Motor =
|
||||
Low Voltage Transformer =
|
||||
@ -29,11 +31,14 @@ Graphite =
|
||||
Carbon Cloth =
|
||||
Raw Latex =
|
||||
Rubber Fiber =
|
||||
%.1f%%-Fissile Uranium Ingot =
|
||||
%.1f%%-Fissile Uranium Block =
|
||||
|
||||
## Machine misc
|
||||
Machine cannot be removed because it is not empty =
|
||||
Inventory move disallowed due to protection =
|
||||
# $1: Machine name (Includes tier)
|
||||
@1 Active (@2 EU) =
|
||||
%s Active =
|
||||
%s Disabled =
|
||||
%s Enabled =
|
||||
@ -43,6 +48,7 @@ Inventory move disallowed due to protection =
|
||||
%s Unpowered =
|
||||
%s Out Of Fuel =
|
||||
%s Has Bad Cabling =
|
||||
%s (Slave) =
|
||||
%s Has No Network =
|
||||
%s Finished =
|
||||
Enable/Disable =
|
||||
@ -51,16 +57,23 @@ Upgrade Slots =
|
||||
In: =
|
||||
Out: =
|
||||
Slot %d =
|
||||
Mode: %s =
|
||||
single items =
|
||||
whole stacks =
|
||||
Itemwise =
|
||||
Stackwise =
|
||||
Ignoring Mesecon Signal =
|
||||
Controlled by Mesecon Signal =
|
||||
Owner: =
|
||||
Unlocked =
|
||||
Locked =
|
||||
Radius: =
|
||||
Enabled =
|
||||
Disabled =
|
||||
|
||||
## Machine names
|
||||
# $1: Tier
|
||||
%s Alloy Furnace =
|
||||
%s Battery Box =
|
||||
%s Battery Box =
|
||||
%s Cable =
|
||||
%s CNC Machine =
|
||||
%s Centrifuge =
|
||||
%s Compressor =
|
||||
%s Extractor =
|
||||
%s Forcefield Emitter =
|
||||
@ -76,7 +89,7 @@ Hydro %s Generator =
|
||||
Nuclear %s Generator Core =
|
||||
Small Solar %s Generator =
|
||||
Wind %s Generator =
|
||||
Injector =
|
||||
Self-Contained Injector =
|
||||
Constructor Mk%d =
|
||||
Frame =
|
||||
Frame Motor =
|
||||
@ -92,55 +105,29 @@ Fuel-Fired Furnace =
|
||||
Wind Mill Frame =
|
||||
Forcefield =
|
||||
Nuclear Reactor Rod Compartment =
|
||||
Administrative World Anchor =
|
||||
|
||||
## Machine-specific
|
||||
# $1: Pruduced EU
|
||||
Charge =
|
||||
Discharge =
|
||||
Power level =
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
%s Battery Box: %d/%d =
|
||||
# $1: Tier $2: current_charge $3: max_charge
|
||||
@1 Battery Box: @2/@3 =
|
||||
# $1: Machine name $2: Supply $3: Demand
|
||||
%s. Supply: %d Demand: %d =
|
||||
@1. Supply: @2 Demand: @3 =
|
||||
Production at %d%% =
|
||||
Choose Milling Program: =
|
||||
Slim Elements half / normal height: =
|
||||
Current track %s =
|
||||
Stopped =
|
||||
Keeping %d/%d map blocks loaded =
|
||||
Digging not started =
|
||||
Digging finished =
|
||||
Digging %d m above machine =
|
||||
Digging %d m below machine =
|
||||
@1 (@2 @3 -> @4 @5) =
|
||||
|
||||
## CNC
|
||||
Cylinder =
|
||||
Element Cross =
|
||||
Element Cross Double =
|
||||
Element Edge =
|
||||
Element Edge Double =
|
||||
Element End =
|
||||
Element End Double =
|
||||
Element Straight =
|
||||
Element Straight Double =
|
||||
Element T =
|
||||
Element T Double =
|
||||
Horizontal Cylinder =
|
||||
One Curved Edge Block =
|
||||
Pyramid =
|
||||
Slope =
|
||||
Slope Edge =
|
||||
Slope Inner Edge =
|
||||
Slope Lying =
|
||||
Slope Upside Down =
|
||||
Slope Upside Down Edge =
|
||||
Slope Upside Down Inner Edge =
|
||||
Sphere =
|
||||
Spike =
|
||||
Stick =
|
||||
Two Curved Edge Block =
|
||||
Brick =
|
||||
Cobble =
|
||||
Dirt =
|
||||
Leaves =
|
||||
Sandstone =
|
||||
Stone =
|
||||
Tree =
|
||||
Wooden =
|
||||
|
||||
## Grinder Recipes
|
||||
# $1: Name
|
||||
@ -163,6 +150,7 @@ Talinite =
|
||||
Tin =
|
||||
Wrought Iron =
|
||||
Zinc =
|
||||
%.1f%%-Fissile Uranium =
|
||||
|
||||
## Tools
|
||||
RE Battery =
|
||||
@ -187,3 +175,4 @@ Alloy cooking =
|
||||
Grinding =
|
||||
Compressing =
|
||||
Extracting =
|
||||
Separating =
|
||||
|
@ -1,10 +1,11 @@
|
||||
-- HV battery box
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:hv_battery_box0',
|
||||
recipe = {
|
||||
{'technic:mv_battery_box0', 'technic:mv_battery_box0', 'technic:mv_battery_box0'},
|
||||
{'technic:mv_battery_box0', 'technic:hv_transformer', 'technic:mv_battery_box0'},
|
||||
{'', 'technic:hv_cable0', ''},
|
||||
{'', 'technic:hv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:hv_cable0 3',
|
||||
output = 'technic:hv_cable 3',
|
||||
recipe = {
|
||||
{'technic:rubber', 'technic:rubber', 'technic:rubber'},
|
||||
{'technic:mv_cable0', 'technic:mv_cable0', 'technic:mv_cable0'},
|
||||
{'technic:rubber', 'technic:rubber', 'technic:rubber'},
|
||||
{'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'},
|
||||
{'technic:mv_cable', 'technic:mv_cable', 'technic:mv_cable'},
|
||||
{'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'},
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
technic.register_cable("HV", 3/16)
|
||||
|
||||
|
@ -1,26 +1,40 @@
|
||||
-- Forcefield mod by ShadowNinja
|
||||
-- Modified by kpoppel
|
||||
--- Forcefield generator.
|
||||
-- @author ShadowNinja
|
||||
--
|
||||
-- Forcefields are powerful barriers but they consume huge amounts of power.
|
||||
-- Forcefield Generator is a HV machine.
|
||||
-- The forcefield Generator is an HV machine.
|
||||
|
||||
-- How expensive is the generator?
|
||||
-- Leaves room for upgrades lowering the power drain?
|
||||
local digilines_path = minetest.get_modpath("digilines")
|
||||
|
||||
local forcefield_power_drain = 10
|
||||
local forcefield_step_interval = 1
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local cable_entry = "^technic_cable_connection_overlay.png"
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:forcefield_emitter_off',
|
||||
output = "technic:forcefield_emitter_off",
|
||||
recipe = {
|
||||
{'default:mese', 'technic:deployer_off', 'default:mese' },
|
||||
{'technic:deployer_off', 'technic:motor', 'technic:deployer_off'},
|
||||
{'default:mese', 'technic:deployer_off', 'default:mese' },
|
||||
{"default:mese", "basic_materials:motor", "default:mese" },
|
||||
{"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"},
|
||||
{"default:mese", "technic:hv_cable", "default:mese" },
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
local replaceable_cids = {}
|
||||
|
||||
minetest.after(0, function()
|
||||
for name, ndef in pairs(minetest.registered_nodes) do
|
||||
if ndef.buildable_to == true and name ~= "ignore" then
|
||||
replaceable_cids[minetest.get_content_id(name)] = true
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
-- Idea: Let forcefields have different colors by upgrade slot.
|
||||
-- Idea: Let forcefields add up by detecting if one hits another.
|
||||
-- ___ __
|
||||
@ -28,26 +42,39 @@ minetest.register_craft({
|
||||
-- | |
|
||||
-- \___/\___/
|
||||
|
||||
local function update_forcefield(pos, range, active)
|
||||
local function update_forcefield(pos, meta, active)
|
||||
local shape = meta:get_int("shape")
|
||||
local range = meta:get_int("range")
|
||||
local vm = VoxelManip()
|
||||
local p1 = {x = pos.x-range, y = pos.y-range, z = pos.z-range}
|
||||
local p2 = {x = pos.x+range, y = pos.y+range, z = pos.z+range}
|
||||
local MinEdge, MaxEdge = vm:read_from_map(p1, p2)
|
||||
local MinEdge, MaxEdge = vm:read_from_map(vector.subtract(pos, range),
|
||||
vector.add(pos, range))
|
||||
local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
|
||||
local data = vm:get_data()
|
||||
|
||||
local c_air = minetest.get_content_id("air")
|
||||
local c_air = minetest.get_content_id("air")
|
||||
local c_field = minetest.get_content_id("technic:forcefield")
|
||||
|
||||
for z=-range, range do
|
||||
for y=-range, range do
|
||||
local vi = area:index(pos.x+(-range), pos.y+y, pos.z+z)
|
||||
for x=-range, range do
|
||||
if x*x+y*y+z*z <= range * range + range and
|
||||
x*x+y*y+z*z >= (range-1) * (range-1) + (range-1) then
|
||||
if active and data[vi] == c_air then
|
||||
for z = -range, range do
|
||||
for y = -range, range do
|
||||
local vi = area:index(pos.x + (-range), pos.y + y, pos.z + z)
|
||||
for x = -range, range do
|
||||
local relevant
|
||||
if shape == 0 then
|
||||
local squared = x * x + y * y + z * z
|
||||
relevant =
|
||||
squared <= range * range + range and
|
||||
squared >= (range - 1) * (range - 1) + (range - 1)
|
||||
else
|
||||
relevant =
|
||||
x == -range or x == range or
|
||||
y == -range or y == range or
|
||||
z == -range or z == range
|
||||
end
|
||||
if relevant then
|
||||
local cid = data[vi]
|
||||
if active and replaceable_cids[cid] then
|
||||
data[vi] = c_field
|
||||
elseif not active and data[vi] == c_field then
|
||||
elseif not active and cid == c_field then
|
||||
data[vi] = c_air
|
||||
end
|
||||
end
|
||||
@ -59,54 +86,216 @@ local function update_forcefield(pos, range, active)
|
||||
vm:set_data(data)
|
||||
vm:update_liquids()
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
|
||||
local function set_forcefield_formspec(meta)
|
||||
local formspec = "size[5,1.5]"..
|
||||
"field[2,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]"
|
||||
if meta:get_int("enabled") == 0 then
|
||||
formspec = formspec.."button[0,1;5,1;enable;"..S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
|
||||
local formspec
|
||||
if digilines_path then
|
||||
formspec = "size[5,3.25]"..
|
||||
"field[0.3,3;5,1;channel;Digiline Channel;"..meta:get_string("channel").."]"
|
||||
else
|
||||
formspec = formspec.."button[0,1;5,1;disable;"..S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
|
||||
formspec = "size[5,2.25]"
|
||||
end
|
||||
formspec = formspec..
|
||||
"field[0.3,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]"
|
||||
-- The names for these toggle buttons are explicit about which
|
||||
-- state they'll switch to, so that multiple presses (arising
|
||||
-- from the ambiguity between lag and a missed press) only make
|
||||
-- the single change that the user expects.
|
||||
if meta:get_int("shape") == 0 then
|
||||
formspec = formspec.."button[3,0.2;2,1;shape1;"..S("Sphere").."]"
|
||||
else
|
||||
formspec = formspec.."button[3,0.2;2,1;shape0;"..S("Cube").."]"
|
||||
end
|
||||
if meta:get_int("mesecon_mode") == 0 then
|
||||
formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]"
|
||||
else
|
||||
formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]"
|
||||
end
|
||||
-- TODO: String replacement with %s will stop working with client-side translations
|
||||
if meta:get_int("enabled") == 0 then
|
||||
formspec = formspec.."button[0,1.75;5,1;enable;"..
|
||||
S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
|
||||
else
|
||||
formspec = formspec.."button[0,1.75;5,1;disable;"..
|
||||
S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
|
||||
end
|
||||
meta:set_string("formspec", formspec)
|
||||
end
|
||||
|
||||
local forcefield_receive_fields = function(pos, formname, fields, sender)
|
||||
local player_name = sender:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
minetest.chat_send_player(player_name, "You are not allowed to edit this!")
|
||||
minetest.record_protection_violation(pos, player_name)
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
local range = nil
|
||||
if fields.range then
|
||||
local range = tonumber(fields.range) or 0
|
||||
range = tonumber(fields.range) or 0
|
||||
-- Smallest field is 5. Anything less is asking for trouble.
|
||||
-- Largest is 20. It is a matter of pratical node handling.
|
||||
-- At the maximim range updating the forcefield takes about 0.2s
|
||||
range = math.max(range, 5)
|
||||
range = math.min(range, 20)
|
||||
if meta:get_int("range") ~= range then
|
||||
update_forcefield(pos, meta:get_int("range"), false)
|
||||
meta:set_int("range", range)
|
||||
end
|
||||
if range == meta:get_int("range") then range = nil end
|
||||
end
|
||||
if fields.enable then meta:set_int("enabled", 1) end
|
||||
if fields.shape0 or fields.shape1 or range then
|
||||
update_forcefield(pos, meta, false)
|
||||
end
|
||||
if range then meta:set_int("range", range) end
|
||||
if fields.channel then meta:set_string("channel", fields.channel) end
|
||||
if fields.shape0 then meta:set_int("shape", 0) end
|
||||
if fields.shape1 then meta:set_int("shape", 1) end
|
||||
if fields.enable then meta:set_int("enabled", 1) end
|
||||
if fields.disable then meta:set_int("enabled", 0) end
|
||||
if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end
|
||||
if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end
|
||||
set_forcefield_formspec(meta)
|
||||
end
|
||||
|
||||
local mesecons = {
|
||||
effector = {
|
||||
action_on = function(pos, node)
|
||||
minetest.get_meta(pos):set_int("enabled", 0)
|
||||
minetest.get_meta(pos):set_int("mesecon_effect", 1)
|
||||
end,
|
||||
action_off = function(pos, node)
|
||||
minetest.get_meta(pos):set_int("enabled", 1)
|
||||
minetest.get_meta(pos):set_int("mesecon_effect", 0)
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
local digiline_def = {
|
||||
receptor = {action = function() end},
|
||||
effector = {
|
||||
action = function(pos, node, channel, msg)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if channel ~= meta:get_string("channel") then
|
||||
return
|
||||
end
|
||||
local msgt = type(msg)
|
||||
if msgt == "string" then
|
||||
local smsg = msg:lower()
|
||||
msg = {}
|
||||
if smsg == "get" then
|
||||
msg.command = "get"
|
||||
elseif smsg == "off" then
|
||||
msg.command = "off"
|
||||
elseif smsg == "on" then
|
||||
msg.command = "on"
|
||||
elseif smsg == "toggle" then
|
||||
msg.command = "toggle"
|
||||
elseif smsg:sub(1, 5) == "range" then
|
||||
msg.command = "range"
|
||||
msg.value = tonumber(smsg:sub(7))
|
||||
elseif smsg:sub(1, 5) == "shape" then
|
||||
msg.command = "shape"
|
||||
msg.value = smsg:sub(7):lower()
|
||||
msg.value = tonumber(msg.value) or msg.value
|
||||
end
|
||||
elseif msgt ~= "table" then
|
||||
return
|
||||
end
|
||||
if msg.command == "get" then
|
||||
digilines.receptor_send(pos, digilines.rules.default, channel, {
|
||||
enabled = meta:get_int("enabled"),
|
||||
range = meta:get_int("range"),
|
||||
shape = meta:get_int("shape")
|
||||
})
|
||||
return
|
||||
elseif msg.command == "off" then
|
||||
meta:set_int("enabled", 0)
|
||||
elseif msg.command == "on" then
|
||||
meta:set_int("enabled", 1)
|
||||
elseif msg.command == "toggle" then
|
||||
local onn = meta:get_int("enabled")
|
||||
onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0.
|
||||
meta:set_int("enabled", onn)
|
||||
elseif msg.command == "range" then
|
||||
if type(msg.value) ~= "number" then
|
||||
return
|
||||
end
|
||||
msg.value = math.max(msg.value, 5)
|
||||
msg.value = math.min(msg.value, 20)
|
||||
update_forcefield(pos, meta, false)
|
||||
meta:set_int("range", msg.value)
|
||||
elseif msg.command == "shape" then
|
||||
local valuet = type(msg.value)
|
||||
if valuet == "string" then
|
||||
if msg.value == "sphere" then
|
||||
msg.value = 0
|
||||
elseif msg.value == "cube" then
|
||||
msg.value = 1
|
||||
end
|
||||
elseif valuet ~= "number" then
|
||||
return
|
||||
end
|
||||
if not msg.value then
|
||||
return
|
||||
end
|
||||
update_forcefield(pos, meta, false)
|
||||
meta:set_int("shape", msg.value)
|
||||
else
|
||||
return
|
||||
end
|
||||
set_forcefield_formspec(meta)
|
||||
end
|
||||
},
|
||||
}
|
||||
|
||||
local function run(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int("HV_EU_input")
|
||||
local enabled = meta:get_int("enabled") ~= 0 and
|
||||
(meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0)
|
||||
local machine_name = S("%s Forcefield Emitter"):format("HV")
|
||||
|
||||
local range = meta:get_int("range")
|
||||
local power_requirement
|
||||
if meta:get_int("shape") == 0 then
|
||||
power_requirement = math.floor(4 * math.pi * range * range)
|
||||
else
|
||||
power_requirement = 24 * range * range
|
||||
end
|
||||
power_requirement = power_requirement * forcefield_power_drain
|
||||
|
||||
if not enabled then
|
||||
if node.name == "technic:forcefield_emitter_on" then
|
||||
update_forcefield(pos, meta, false)
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_off")
|
||||
meta:set_string("infotext", S("%s Disabled"):format(machine_name))
|
||||
end
|
||||
meta:set_int("HV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
meta:set_int("HV_EU_demand", power_requirement)
|
||||
if eu_input < power_requirement then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
if node.name == "technic:forcefield_emitter_on" then
|
||||
update_forcefield(pos, meta, false)
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_off")
|
||||
end
|
||||
elseif eu_input >= power_requirement then
|
||||
if node.name == "technic:forcefield_emitter_off" then
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_on")
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
end
|
||||
update_forcefield(pos, meta, true)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:forcefield_emitter_off", {
|
||||
description = S("%s Forcefield Emitter"):format("HV"),
|
||||
tiles = {"technic_forcefield_emitter_off.png"},
|
||||
groups = {cracky = 1},
|
||||
tiles = {
|
||||
"technic_forcefield_emitter_off.png",
|
||||
"technic_machine_bottom.png"..cable_entry,
|
||||
"technic_forcefield_emitter_off.png",
|
||||
"technic_forcefield_emitter_off.png",
|
||||
"technic_forcefield_emitter_off.png",
|
||||
"technic_forcefield_emitter_off.png"
|
||||
},
|
||||
groups = {cracky = 1, technic_machine = 1, technic_hv = 1},
|
||||
on_receive_fields = forcefield_receive_fields,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -114,37 +303,59 @@ minetest.register_node("technic:forcefield_emitter_off", {
|
||||
meta:set_int("HV_EU_demand", 0)
|
||||
meta:set_int("range", 10)
|
||||
meta:set_int("enabled", 0)
|
||||
meta:set_int("mesecon_mode", 0)
|
||||
meta:set_int("mesecon_effect", 0)
|
||||
if digilines_path then
|
||||
meta:set_string("channel", "forcefield"..minetest.pos_to_string(pos))
|
||||
end
|
||||
meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV"))
|
||||
set_forcefield_formspec(meta)
|
||||
end,
|
||||
mesecons = mesecons
|
||||
mesecons = mesecons,
|
||||
digiline = digiline_def,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:forcefield_emitter_on", {
|
||||
description = S("%s Forcefield Emitter"):format("HV"),
|
||||
tiles = {"technic_forcefield_emitter_on.png"},
|
||||
groups = {cracky = 1, not_in_creative_inventory=1},
|
||||
tiles = {
|
||||
"technic_forcefield_emitter_on.png",
|
||||
"technic_machine_bottom.png"..cable_entry,
|
||||
"technic_forcefield_emitter_on.png",
|
||||
"technic_forcefield_emitter_on.png",
|
||||
"technic_forcefield_emitter_on.png",
|
||||
"technic_forcefield_emitter_on.png"
|
||||
},
|
||||
groups = {cracky = 1, technic_machine = 1, technic_hv = 1,
|
||||
not_in_creative_inventory=1},
|
||||
drop = "technic:forcefield_emitter_off",
|
||||
on_receive_fields = forcefield_receive_fields,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local range = meta:get_int("range")
|
||||
meta:set_string("formspec", get_forcefield_formspec(range))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
update_forcefield(pos, meta:get_int("range"), false)
|
||||
update_forcefield(pos, meta, false)
|
||||
end,
|
||||
mesecons = mesecons,
|
||||
digiline = digiline_def,
|
||||
technic_run = run,
|
||||
technic_on_disable = function (pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
update_forcefield(pos, meta, false)
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_off")
|
||||
end,
|
||||
on_blast = function(pos, intensity)
|
||||
minetest.dig_node(pos)
|
||||
return {"technic:forcefield_emitter_off"}
|
||||
end,
|
||||
mesecons = mesecons
|
||||
})
|
||||
|
||||
minetest.register_node("technic:forcefield", {
|
||||
description = S("%s Forcefield"):format("HV"),
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
groups = {not_in_creative_inventory=1, unbreakable=1},
|
||||
groups = {not_in_creative_inventory=1},
|
||||
paramtype = "light",
|
||||
light_source = 15,
|
||||
light_source = default.LIGHT_MAX,
|
||||
diggable = false,
|
||||
drop = '',
|
||||
tiles = {{
|
||||
name = "technic_forcefield_animated.png",
|
||||
@ -155,53 +366,14 @@ minetest.register_node("technic:forcefield", {
|
||||
length = 1.0,
|
||||
},
|
||||
}},
|
||||
on_blast = function(pos, intensity)
|
||||
end,
|
||||
})
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:forcefield_emitter_on", "technic:forcefield_emitter_off"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int("HV_EU_input")
|
||||
local eu_demand = meta:get_int("HV_EU_demand")
|
||||
local enabled = meta:get_int("enabled")
|
||||
local machine_name = S("%s Forcefield Emitter"):format("HV")
|
||||
-- Power off automatically if no longer connected to a switching station
|
||||
technic.switching_station_timeout_count(pos, "HV")
|
||||
|
||||
local power_requirement = math.floor(
|
||||
4 * math.pi * math.pow(meta:get_int("range"), 2)
|
||||
) * forcefield_power_drain
|
||||
|
||||
if meta:get_int("enabled") == 0 then
|
||||
if node.name == "technic:forcefield_emitter_on" then
|
||||
meta:set_int("HV_EU_demand", 0)
|
||||
update_forcefield(pos, meta:get_int("range"), false)
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_off")
|
||||
meta:set_string("infotext", S("%s Disabled"):format(machine_name))
|
||||
return
|
||||
end
|
||||
elseif eu_input < power_requirement then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
if node.name == "technic:forcefield_emitter_on" then
|
||||
update_forcefield(pos, meta:get_int("range"), false)
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_off")
|
||||
end
|
||||
elseif eu_input >= power_requirement then
|
||||
if node.name == "technic:forcefield_emitter_off" then
|
||||
technic.swap_node(pos, "technic:forcefield_emitter_on")
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
end
|
||||
update_forcefield(pos, meta:get_int("range"), true)
|
||||
end
|
||||
meta:set_int("HV_EU_demand", power_requirement)
|
||||
end
|
||||
})
|
||||
|
||||
if minetest.get_modpath("mesecons_mvps") then
|
||||
mesecon:register_mvps_stopper("technic:forcefield")
|
||||
mesecon.register_mvps_stopper("technic:forcefield")
|
||||
end
|
||||
-- TODO: Register a stopper for frames
|
||||
|
||||
technic.register_machine("HV", "technic:forcefield_emitter_on", technic.receiver)
|
||||
technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver)
|
||||
|
@ -3,8 +3,8 @@ minetest.register_alias("hv_generator", "technic:hv_generator")
|
||||
minetest.register_craft({
|
||||
output = 'technic:hv_generator',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_generator', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:carbon_plate', 'technic:mv_generator', 'technic:composite_plate'},
|
||||
{'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
@ -1,244 +1,504 @@
|
||||
-- The enriched uranium rod driven EU generator.
|
||||
-- A very large and advanced machine providing vast amounts of power.
|
||||
-- Very efficient but also expensive to run as it needs uranium. (10000EU 86400 ticks (one week))
|
||||
-- Provides HV EUs that can be down converted as needed.
|
||||
--
|
||||
-- The nuclear reactor core needs water and a protective shield to work.
|
||||
-- This is checked now and then and if the machine is tampered with... BOOM!
|
||||
--[[
|
||||
The enriched uranium rod driven EU generator.
|
||||
A very large and advanced machine providing vast amounts of power.
|
||||
Very efficient but also expensive to run as it needs uranium.
|
||||
Provides 10000 HV EUs for one week (only counted when loaded).
|
||||
|
||||
local burn_ticks = 7 * 24 * 60 * 60 -- (seconds).
|
||||
local power_supply = 100000 -- EUs
|
||||
local fuel_type = "technic:uranium_fuel" -- The reactor burns this stuff
|
||||
The nuclear reactor core requires a casing of water and a protective
|
||||
shield to work. This is checked now and then and if the casing is not
|
||||
intact the reactor will melt down!
|
||||
--]]
|
||||
|
||||
local burn_ticks = 7 * 24 * 60 * 60 -- Seconds
|
||||
local power_supply = 100000 -- EUs
|
||||
local fuel_type = "technic:uranium_fuel" -- The reactor burns this
|
||||
local digiline_meltdown = technic.config:get_bool("enable_nuclear_reactor_digiline_selfdestruct")
|
||||
local digiline_remote_path = minetest.get_modpath("digiline_remote")
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
-- FIXME: recipe must make more sense like a rod recepticle, steam chamber, HV generator?
|
||||
local reactor_desc = S("@1 Nuclear Reactor Core", S("HV"))
|
||||
local cable_entry = "^technic_cable_connection_overlay.png"
|
||||
|
||||
-- FIXME: Recipe should make more sense like a rod recepticle, steam chamber, HV generator?
|
||||
minetest.register_craft({
|
||||
output = 'technic:hv_nuclear_reactor_core',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
|
||||
{'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'},
|
||||
{'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'},
|
||||
{'technic:carbon_plate', 'default:obsidian_glass', 'technic:carbon_plate'},
|
||||
{'technic:composite_plate', 'technic:machine_casing', 'technic:composite_plate'},
|
||||
{'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
local generator_formspec =
|
||||
"invsize[8,9;]"..
|
||||
"label[0,0;"..S("Nuclear Reactor Rod Compartment").."]"..
|
||||
"list[current_name;src;2,1;3,2;]"..
|
||||
"list[current_player;main;0,5;8,4;]"
|
||||
local function make_reactor_formspec(meta)
|
||||
local f =
|
||||
"formspec_version[4]"..
|
||||
"size[10.75,10.75]"..
|
||||
"label[0.2,0.4;"..S("Nuclear Reactor Rod Compartment").."]"..
|
||||
"list[current_name;src;1.5,1;3,2;]"..
|
||||
"list[current_player;main;0.5,5.5;8,4;]"..
|
||||
"listring[]"..
|
||||
"button[5.7,1;2,1;start;Start]"..
|
||||
"checkbox[5.7,2.75;autostart;automatic Start;"..meta:get_string("autostart").."]"
|
||||
if not digiline_remote_path then
|
||||
return f
|
||||
end
|
||||
local digiline_enabled = meta:get_string("enable_digiline")
|
||||
f = f.."checkbox[1.5,3.75;enable_digiline;Enable Digiline channel;"..digiline_enabled.."]"
|
||||
if digiline_enabled ~= "true" then
|
||||
return f
|
||||
end
|
||||
return f..
|
||||
"field[2,4.2;4.25,1;remote_channel;;${remote_channel}]" ..
|
||||
"button_exit[6.5,4.2;2,1;save;Save]"
|
||||
end
|
||||
|
||||
-- "Boxy sphere"
|
||||
local nodebox = {
|
||||
{ -0.353, -0.353, -0.353, 0.353, 0.353, 0.353 }, -- Box
|
||||
{ -0.495, -0.064, -0.064, 0.495, 0.064, 0.064 }, -- Circle +-x
|
||||
{ -0.483, -0.128, -0.128, 0.483, 0.128, 0.128 },
|
||||
{ -0.462, -0.191, -0.191, 0.462, 0.191, 0.191 },
|
||||
{ -0.433, -0.249, -0.249, 0.433, 0.249, 0.249 },
|
||||
{ -0.397, -0.303, -0.303, 0.397, 0.303, 0.303 },
|
||||
{ -0.305, -0.396, -0.305, 0.305, 0.396, 0.305 }, -- Circle +-y
|
||||
{ -0.250, -0.432, -0.250, 0.250, 0.432, 0.250 },
|
||||
{ -0.191, -0.461, -0.191, 0.191, 0.461, 0.191 },
|
||||
{ -0.130, -0.482, -0.130, 0.130, 0.482, 0.130 },
|
||||
{ -0.066, -0.495, -0.066, 0.066, 0.495, 0.066 },
|
||||
{ -0.064, -0.064, -0.495, 0.064, 0.064, 0.495 }, -- Circle +-z
|
||||
{ -0.128, -0.128, -0.483, 0.128, 0.128, 0.483 },
|
||||
{ -0.191, -0.191, -0.462, 0.191, 0.191, 0.462 },
|
||||
{ -0.249, -0.249, -0.433, 0.249, 0.249, 0.433 },
|
||||
{ -0.303, -0.303, -0.397, 0.303, 0.303, 0.397 },
|
||||
}
|
||||
local SS_OFF = 0
|
||||
local SS_DANGER = 1
|
||||
local SS_CLEAR = 2
|
||||
|
||||
minetest.register_node("technic:hv_nuclear_reactor_core", {
|
||||
description = S("Nuclear %s Generator Core"):format("HV"),
|
||||
tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
||||
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
||||
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drawtype="nodebox",
|
||||
paramtype = "light",
|
||||
stack_max = 1,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = nodebox
|
||||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("Nuclear %s Generator Core"):format("HV"))
|
||||
meta:set_int("HV_EU_supply", 0)
|
||||
-- Signal to the switching station that this device burns some
|
||||
-- sort of fuel and needs special handling
|
||||
meta:set_int("HV_EU_from_fuel", 1)
|
||||
meta:set_int("burn_time", 0)
|
||||
meta:set_string("formspec", generator_formspec)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("src", 6)
|
||||
end,
|
||||
can_dig = technic.machine_can_dig,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
})
|
||||
local reactor_siren = {}
|
||||
local function siren_set_state(pos, state)
|
||||
local hpos = minetest.hash_node_position(pos)
|
||||
local siren = reactor_siren[hpos]
|
||||
if not siren then
|
||||
if state == SS_OFF then return end
|
||||
siren = {state=SS_OFF}
|
||||
reactor_siren[hpos] = siren
|
||||
end
|
||||
if state == SS_DANGER and siren.state ~= SS_DANGER then
|
||||
if siren.handle then minetest.sound_stop(siren.handle) end
|
||||
siren.handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_danger_loop",
|
||||
{pos=pos, gain=1.5, loop=true, max_hear_distance=48})
|
||||
siren.state = SS_DANGER
|
||||
elseif state == SS_CLEAR then
|
||||
if siren.handle then minetest.sound_stop(siren.handle) end
|
||||
local clear_handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_clear",
|
||||
{pos=pos, gain=1.5, loop=false, max_hear_distance=48})
|
||||
siren.handle = clear_handle
|
||||
siren.state = SS_CLEAR
|
||||
minetest.after(10, function()
|
||||
if siren.handle ~= clear_handle then return end
|
||||
minetest.sound_stop(clear_handle)
|
||||
if reactor_siren[hpos] == siren then
|
||||
reactor_siren[hpos] = nil
|
||||
end
|
||||
end)
|
||||
elseif state == SS_OFF and siren.state ~= SS_OFF then
|
||||
if siren.handle then minetest.sound_stop(siren.handle) end
|
||||
reactor_siren[hpos] = nil
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:hv_nuclear_reactor_core_active", {
|
||||
tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
||||
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
||||
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop="technic:hv_nuclear_reactor_core",
|
||||
drawtype="nodebox",
|
||||
light_source = 15,
|
||||
paramtype = "light",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = nodebox
|
||||
},
|
||||
can_dig = technic.machine_can_dig,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
})
|
||||
local function siren_danger(pos, meta)
|
||||
meta:set_int("siren", 1)
|
||||
siren_set_state(pos, SS_DANGER)
|
||||
end
|
||||
|
||||
local check_reactor_structure = function(pos)
|
||||
-- The reactor consists of a 9x9x9 cube structure
|
||||
-- A cross section through the middle:
|
||||
-- CCCC CCCC
|
||||
-- CBBB BBBC
|
||||
-- CBSS SSBC
|
||||
-- CBSWWWSBC
|
||||
-- CBSW#WSBC
|
||||
-- CBSW|WSBC
|
||||
-- CBSS|SSBC
|
||||
-- CBBB|BBBC
|
||||
-- CCCC|CCCC
|
||||
-- C = Concrete, B = Blast resistant concrete, S = Stainless Steel,
|
||||
-- W = water node, # = reactor core, | = HV cable
|
||||
-- The man-hole and the HV cable is only in the middle
|
||||
-- The man-hole is optional
|
||||
local function siren_clear(pos, meta)
|
||||
if meta:get_int("siren") ~= 0 then
|
||||
siren_set_state(pos, SS_CLEAR)
|
||||
meta:set_int("siren", 0)
|
||||
end
|
||||
end
|
||||
|
||||
--[[
|
||||
The standard reactor structure consists of a 9x9x9 cube. A cross
|
||||
section through the middle:
|
||||
|
||||
CCCC CCCC
|
||||
CBBB BBBC
|
||||
CBLL LLBC
|
||||
CBLWWWLBC
|
||||
CBLW#WLBC
|
||||
CBLW|WLBC
|
||||
CBLL|LLBC
|
||||
CBBB|BBBC
|
||||
CCCC|CCCC
|
||||
C = Concrete, B = Blast-resistant concrete, L = Lead,
|
||||
W = water node, # = reactor core, | = HV cable
|
||||
|
||||
The man-hole is optional (but necessary for refueling).
|
||||
|
||||
For the reactor to operate and not melt down, it insists on the inner
|
||||
7x7x7 portion (from the core out to the blast-resistant concrete)
|
||||
being intact. Intactness only depends on the number of nodes of the
|
||||
right type in each layer. The water layer must have water in all but
|
||||
at most one node; the steel and blast-resistant concrete layers must
|
||||
have the right material in all but at most two nodes. The permitted
|
||||
gaps are meant for the cable and man-hole, but can actually be anywhere
|
||||
and contain anything. For the reactor to be useful, a cable must
|
||||
connect to the core, but it can go in any direction.
|
||||
|
||||
The outer concrete layer of the standard structure is not required
|
||||
for the reactor to operate. It is noted here because it used to
|
||||
be mandatory, and for historical reasons (that it predates the
|
||||
implementation of radiation) it needs to continue being adequate
|
||||
shielding of legacy reactors. If it ever ceases to be adequate
|
||||
shielding for new reactors, legacy ones should be grandfathered.
|
||||
|
||||
For legacy reasons, if the reactor has a stainless steel layer instead
|
||||
of a lead layer it will be converted to a lead layer.
|
||||
--]]
|
||||
local function reactor_structure_badness(pos)
|
||||
local vm = VoxelManip()
|
||||
local pos1 = vector.subtract(pos, 4)
|
||||
local pos2 = vector.add(pos, 4)
|
||||
|
||||
-- Blast-resistant Concrete Block layer outer positions
|
||||
local pos1 = vector.subtract(pos, 3)
|
||||
local pos2 = vector.add(pos, 3)
|
||||
|
||||
local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2)
|
||||
local data = vm:get_data()
|
||||
local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge})
|
||||
|
||||
local c_concrete = minetest.get_content_id("technic:concrete")
|
||||
local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete")
|
||||
local c_stainless_steel = minetest.get_content_id("technic:stainless_steel_block")
|
||||
local c_lead = minetest.get_content_id("technic:lead_block")
|
||||
local c_steel = minetest.get_content_id("technic:stainless_steel_block")
|
||||
local c_water_source = minetest.get_content_id("default:water_source")
|
||||
local c_water_flowing = minetest.get_content_id("default:water_flowing")
|
||||
|
||||
local concretelayer, blastlayer, steellayer, waterlayer = 0, 0, 0, 0
|
||||
local blast_layer, steel_layer, lead_layer, water_layer = 0, 0, 0, 0
|
||||
|
||||
for z = pos1.z, pos2.z do
|
||||
for y = pos1.y, pos2.y do
|
||||
for x = pos1.x, pos2.x do
|
||||
-- If the position is in the outer layer
|
||||
-- In the entire volume, make sure there is:
|
||||
local cid = data[area:index(x, y, z)]
|
||||
if x == pos1.x or x == pos2.x or
|
||||
y == pos1.y or y == pos2.y or
|
||||
z == pos1.z or z == pos2.z then
|
||||
if data[area:index(x, y, z)] == c_concrete then
|
||||
concretelayer = concretelayer + 1
|
||||
-- r=3 : Blast-resistant Concrete Block shell
|
||||
if cid == c_blast_concrete then
|
||||
blast_layer = blast_layer + 1
|
||||
end
|
||||
elseif x == pos1.x+1 or x == pos2.x-1 or
|
||||
y == pos1.y+1 or y == pos2.y-1 or
|
||||
z == pos1.z+1 or z == pos2.z-1 then
|
||||
if data[area:index(x, y, z)] == c_blast_concrete then
|
||||
blastlayer = blastlayer + 1
|
||||
y == pos1.y+1 or y == pos2.y-1 or
|
||||
z == pos1.z+1 or z == pos2.z-1 then
|
||||
-- r=2 : Lead Block shell
|
||||
if cid == c_lead then
|
||||
lead_layer = lead_layer + 1
|
||||
elseif cid == c_steel then
|
||||
steel_layer = steel_layer + 1
|
||||
end
|
||||
elseif x == pos1.x+2 or x == pos2.x-2 or
|
||||
y == pos1.y+2 or y == pos2.y-2 or
|
||||
z == pos1.z+2 or z == pos2.z-2 then
|
||||
if data[area:index(x, y, z)] == c_stainless_steel then
|
||||
steellayer = steellayer + 1
|
||||
end
|
||||
elseif x == pos1.x+3 or x == pos2.x-3 or
|
||||
y == pos1.y+3 or y == pos2.y-3 or
|
||||
z == pos1.z+3 or z == pos2.z-3 then
|
||||
local cid = data[area:index(x, y, z)]
|
||||
y == pos1.y+2 or y == pos2.y-2 or
|
||||
z == pos1.z+2 or z == pos2.z-2 then
|
||||
-- r=1 : Water cooling
|
||||
if cid == c_water_source or cid == c_water_flowing then
|
||||
waterlayer = waterlayer + 1
|
||||
water_layer = water_layer + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if waterlayer >= 25 and
|
||||
steellayer >= 96 and
|
||||
blastlayer >= 216 and
|
||||
concretelayer >= 384 then
|
||||
return true
|
||||
|
||||
if steel_layer >= 96 then
|
||||
-- Legacy: convert stainless steel to lead
|
||||
-- Why don't we accept both without conversion?
|
||||
for z = pos1.z+1, pos2.z-1 do
|
||||
for y = pos1.y+1, pos2.y-1 do
|
||||
for x = pos1.x+1, pos2.x-1 do
|
||||
local vi = area:index(x, y, z)
|
||||
if x == pos1.x+1 or x == pos2.x-1 or
|
||||
y == pos1.y+1 or y == pos2.y-1 or
|
||||
z == pos1.z+1 or z == pos2.z-1 then
|
||||
if data[vi] == c_steel then
|
||||
data[vi] = c_lead
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
vm:set_data(data)
|
||||
vm:write_to_map()
|
||||
lead_layer = steel_layer
|
||||
end
|
||||
|
||||
if water_layer > 25 then water_layer = 25 end
|
||||
if lead_layer > 96 then lead_layer = 96 end
|
||||
if blast_layer > 216 then blast_layer = 216 end
|
||||
-- Amount of missing blocks
|
||||
return (25 - water_layer) + (96 - lead_layer) + (216 - blast_layer)
|
||||
end
|
||||
|
||||
local explode_reactor = function(pos)
|
||||
print("A reactor exploded at "..minetest.pos_to_string(pos))
|
||||
|
||||
local function melt_down_reactor(pos)
|
||||
minetest.log("action", "A reactor melted down at "..minetest.pos_to_string(pos))
|
||||
minetest.set_node(pos, {name = "technic:corium_source"})
|
||||
end
|
||||
|
||||
local function damage_nearby_players(pos)
|
||||
local objs = minetest.get_objects_inside_radius(pos, 4)
|
||||
for _, o in pairs(objs) do
|
||||
if o:is_player() then
|
||||
o:set_hp(math.max(o:get_hp() - 2, 0))
|
||||
|
||||
local function start_reactor(pos, meta)
|
||||
local correct_fuel_count = 6
|
||||
local msg_fuel_missing = "Error: You need to insert " .. correct_fuel_count .. " pieces of Uranium Fuel."
|
||||
|
||||
if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then
|
||||
return msg_fuel_missing
|
||||
end
|
||||
local inv = meta:get_inventory()
|
||||
if inv:is_empty("src") then
|
||||
return msg_fuel_missing
|
||||
end
|
||||
local src_list = inv:get_list("src")
|
||||
local fuel_count = 0
|
||||
for _, src_stack in pairs(src_list) do
|
||||
if src_stack and src_stack:get_name() == fuel_type then
|
||||
fuel_count = fuel_count + 1
|
||||
end
|
||||
end
|
||||
-- Check that the has the correct fuel
|
||||
if fuel_count ~= correct_fuel_count then
|
||||
return msg_fuel_missing
|
||||
end
|
||||
|
||||
-- Check that the reactor is complete
|
||||
if reactor_structure_badness(pos) ~= 0 then
|
||||
return "Error: The power plant seems to be built incorrectly."
|
||||
end
|
||||
|
||||
meta:set_int("burn_time", 1)
|
||||
technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
|
||||
meta:set_int("HV_EU_supply", power_supply)
|
||||
for idx, src_stack in pairs(src_list) do
|
||||
src_stack:take_item()
|
||||
inv:set_stack("src", idx, src_stack)
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:hv_nuclear_reactor_core", "technic:hv_nuclear_reactor_core_active"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
label = "Machines: reactor melt-down check",
|
||||
nodenames = {"technic:hv_nuclear_reactor_core_active"},
|
||||
interval = 4,
|
||||
chance = 1,
|
||||
action = function (pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local machine_name = S("Nuclear %s Generator Core"):format("HV")
|
||||
local badness = reactor_structure_badness(pos)
|
||||
local accum_badness = meta:get_int("structure_accumulated_badness")
|
||||
if badness == 0 then
|
||||
if accum_badness ~= 0 then
|
||||
meta:set_int("structure_accumulated_badness", math.max(accum_badness - 4, 0))
|
||||
siren_clear(pos, meta)
|
||||
end
|
||||
else
|
||||
siren_danger(pos, meta)
|
||||
accum_badness = accum_badness + badness
|
||||
if accum_badness >= 25 then
|
||||
melt_down_reactor(pos)
|
||||
else
|
||||
meta:set_int("structure_accumulated_badness", accum_badness)
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
local function run(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local burn_time = meta:get_int("burn_time") or 0
|
||||
if burn_time >= burn_ticks or burn_time == 0 then
|
||||
if digiline_remote_path and meta:get_int("HV_EU_supply") == power_supply then
|
||||
digiline_remote.send_to_node(pos, meta:get_string("remote_channel"),
|
||||
"fuel used", 6, true)
|
||||
end
|
||||
if meta:get_string("autostart") == "true" then
|
||||
if not start_reactor(pos, meta) then
|
||||
return
|
||||
end
|
||||
end
|
||||
meta:set_int("HV_EU_supply", 0)
|
||||
meta:set_int("burn_time", 0)
|
||||
meta:set_string("infotext", S("@1 Idle", reactor_desc))
|
||||
technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
|
||||
meta:set_int("structure_accumulated_badness", 0)
|
||||
siren_clear(pos, meta)
|
||||
elseif burn_time > 0 then
|
||||
burn_time = burn_time + 1
|
||||
meta:set_int("burn_time", burn_time)
|
||||
local percent = math.floor(burn_time / burn_ticks * 100)
|
||||
meta:set_string("infotext", reactor_desc.." ("..percent.."%)")
|
||||
meta:set_int("HV_EU_supply", power_supply)
|
||||
end
|
||||
end
|
||||
|
||||
local nuclear_reactor_receive_fields = function(pos, formname, fields, sender)
|
||||
local player_name = sender:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
minetest.chat_send_player(player_name, "You are not allowed to edit this!")
|
||||
minetest.record_protection_violation(pos, player_name)
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
local update_formspec = false
|
||||
if fields.remote_channel then
|
||||
meta:set_string("remote_channel", fields.remote_channel)
|
||||
end
|
||||
if fields.start then
|
||||
local start_error_msg = start_reactor(pos, meta)
|
||||
if not start_error_msg then
|
||||
minetest.chat_send_player(player_name, "Start successful")
|
||||
else
|
||||
minetest.chat_send_player(player_name, start_error_msg)
|
||||
end
|
||||
end
|
||||
if fields.autostart then
|
||||
meta:set_string("autostart", fields.autostart)
|
||||
update_formspec = true
|
||||
end
|
||||
if fields.enable_digiline then
|
||||
meta:set_string("enable_digiline", fields.enable_digiline)
|
||||
update_formspec = true
|
||||
end
|
||||
if update_formspec then
|
||||
meta:set_string("formspec", make_reactor_formspec(meta))
|
||||
end
|
||||
end
|
||||
|
||||
local digiline_remote_def = function(pos, channel, msg)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_string("enable_digiline") ~= "true" or
|
||||
channel ~= meta:get_string("remote_channel") then
|
||||
return
|
||||
end
|
||||
-- Convert string messages to tables:
|
||||
local msgt = type(msg)
|
||||
if msgt == "string" then
|
||||
local smsg = msg:lower()
|
||||
msg = {}
|
||||
if smsg == "get" then
|
||||
msg.command = "get"
|
||||
elseif smsg:sub(1, 13) == "self_destruct" then
|
||||
msg.command = "self_destruct"
|
||||
msg.timer = tonumber(smsg:sub(15)) or 0
|
||||
elseif smsg == "start" then
|
||||
msg.command = "start"
|
||||
end
|
||||
elseif msgt ~= "table" then
|
||||
return
|
||||
end
|
||||
|
||||
if msg.command == "get" then
|
||||
local inv = meta:get_inventory()
|
||||
local invtable = {}
|
||||
for i = 1, 6 do
|
||||
local stack = inv:get_stack("src", i)
|
||||
if stack:is_empty() then
|
||||
invtable[i] = 0
|
||||
elseif stack:get_name() == fuel_type then
|
||||
invtable[i] = stack:get_count()
|
||||
else
|
||||
invtable[i] = -stack:get_count()
|
||||
end
|
||||
end
|
||||
digiline_remote.send_to_node(pos, channel, {
|
||||
burn_time = meta:get_int("burn_time"),
|
||||
enabled = meta:get_int("HV_EU_supply") == power_supply,
|
||||
siren = meta:get_int("siren") == 1,
|
||||
structure_accumulated_badness = meta:get_int("structure_accumulated_badness"),
|
||||
rods = invtable
|
||||
}, 6, true)
|
||||
elseif digiline_meltdown and msg.command == "self_destruct" and
|
||||
minetest.get_node(pos).name == "technic:hv_nuclear_reactor_core_active" then
|
||||
if msg.timer ~= 0 and type(msg.timer) == "number" then
|
||||
siren_danger(pos, meta)
|
||||
minetest.after(msg.timer, melt_down_reactor, pos)
|
||||
else
|
||||
melt_down_reactor(pos)
|
||||
end
|
||||
elseif msg.command == "start" then
|
||||
local start_error_msg = start_reactor(pos, meta)
|
||||
if not start_error_msg then
|
||||
digiline_remote.send_to_node(pos, channel, "Start successful", 6, true)
|
||||
else
|
||||
digiline_remote.send_to_node(pos, channel, start_error_msg, 6, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:hv_nuclear_reactor_core", {
|
||||
description = reactor_desc,
|
||||
tiles = {
|
||||
"technic_hv_nuclear_reactor_core.png",
|
||||
"technic_hv_nuclear_reactor_core.png"..cable_entry
|
||||
},
|
||||
drawtype = "mesh",
|
||||
mesh = "technic_reactor.obj",
|
||||
groups = {cracky = 1, technic_machine = 1, technic_hv = 1, digiline_remote_receive = 1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
stack_max = 1,
|
||||
on_receive_fields = nuclear_reactor_receive_fields,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", reactor_desc)
|
||||
meta:set_string("formspec", make_reactor_formspec(meta))
|
||||
if digiline_remote_path then
|
||||
meta:set_string("remote_channel",
|
||||
"nucelear_reactor"..minetest.pos_to_string(pos))
|
||||
end
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("src", 6)
|
||||
end,
|
||||
_on_digiline_remote_receive = digiline_remote_def,
|
||||
can_dig = technic.machine_can_dig,
|
||||
on_destruct = function(pos) siren_set_state(pos, SS_OFF) end,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:hv_nuclear_reactor_core_active", {
|
||||
tiles = {
|
||||
"technic_hv_nuclear_reactor_core.png",
|
||||
"technic_hv_nuclear_reactor_core.png"..cable_entry
|
||||
},
|
||||
drawtype = "mesh",
|
||||
mesh = "technic_reactor.obj",
|
||||
groups = {cracky = 1, technic_machine = 1, technic_hv = 1, radioactive = 4,
|
||||
not_in_creative_inventory = 1, digiline_remote_receive = 1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop = "technic:hv_nuclear_reactor_core",
|
||||
light_source = 14,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
on_receive_fields = nuclear_reactor_receive_fields,
|
||||
_on_digiline_remote_receive = digiline_remote_def,
|
||||
can_dig = technic.machine_can_dig,
|
||||
after_dig_node = melt_down_reactor,
|
||||
on_destruct = function(pos) siren_set_state(pos, SS_OFF) end,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
technic_run = run,
|
||||
technic_on_disable = function(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(1)
|
||||
end,
|
||||
on_timer = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
-- Connected back?
|
||||
if meta:get_int("HV_EU_timeout") > 0 then return false end
|
||||
|
||||
local burn_time = meta:get_int("burn_time") or 0
|
||||
|
||||
if burn_time >= burn_ticks or burn_time == 0 then
|
||||
local inv = meta:get_inventory()
|
||||
if not inv:is_empty("src") then
|
||||
local srclist = inv:get_list("src")
|
||||
local correct_fuel_count = 0
|
||||
for _, srcstack in pairs(srclist) do
|
||||
if srcstack then
|
||||
if srcstack:get_name() == fuel_type then
|
||||
correct_fuel_count = correct_fuel_count + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Check that the reactor is complete as well
|
||||
-- as the correct number of correct fuel
|
||||
if correct_fuel_count == 6 and
|
||||
check_reactor_structure(pos) then
|
||||
meta:set_int("burn_time", 1)
|
||||
technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
|
||||
meta:set_int("HV_EU_supply", power_supply)
|
||||
for idx, srcstack in pairs(srclist) do
|
||||
srcstack:take_item()
|
||||
inv:set_stack("src", idx, srcstack)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
meta:set_int("HV_EU_supply", 0)
|
||||
meta:set_int("burn_time", 0)
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
|
||||
elseif burn_time > 0 then
|
||||
damage_nearby_players(pos)
|
||||
if not check_reactor_structure(pos) then
|
||||
explode_reactor(pos)
|
||||
end
|
||||
burn_time = burn_time + 1
|
||||
meta:set_int("burn_time", burn_time)
|
||||
local percent = math.floor(burn_time / burn_ticks * 100)
|
||||
meta:set_string("infotext", machine_name.." ("..percent.."%)")
|
||||
meta:set_int("HV_EU_supply", power_supply)
|
||||
meta:set_int("structure_accumulated_badness", 0)
|
||||
siren_clear(pos, meta)
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
meta:set_int("burn_time", burn_time + 1)
|
||||
return true
|
||||
end,
|
||||
})
|
||||
|
||||
technic.register_machine("HV", "technic:hv_nuclear_reactor_core", technic.producer)
|
||||
|
@ -1,193 +1,289 @@
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local tube_entry = "^pipeworks_tube_connection_metallic.png"
|
||||
local cable_entry = "^technic_cable_connection_overlay.png"
|
||||
|
||||
minetest.register_craft({
|
||||
recipe = {
|
||||
{"technic:carbon_steel_block", "pipeworks:filter", "technic:carbon_steel_block"},
|
||||
{"technic:carbon_steel_block", "technic:motor", "technic:carbon_steel_block"},
|
||||
{"technic:carbon_steel_block", "technic:diamond_drill_head", "technic:carbon_steel_block"}},
|
||||
{"technic:carbon_plate", "pipeworks:filter", "technic:composite_plate"},
|
||||
{"basic_materials:motor", "technic:machine_casing", "technic:diamond_drill_head"},
|
||||
{"technic:carbon_steel_block", "technic:hv_cable", "technic:carbon_steel_block"}},
|
||||
output = "technic:quarry",
|
||||
})
|
||||
|
||||
local quarry_dig_above_nodes = 3 -- How far above the quarry we will dig nodes
|
||||
local quarry_max_depth = 100
|
||||
local quarry_demand = 10000
|
||||
local quarry_eject_dir = vector.new(0, 1, 0)
|
||||
|
||||
local function set_quarry_formspec(meta)
|
||||
local formspec = "size[3,1.5]"..
|
||||
"field[1,0.5;2,1;size;Radius;"..meta:get_int("size").."]"
|
||||
local radius = meta:get_int("size")
|
||||
local formspec = "size[6,4.3]"..
|
||||
"list[context;cache;0,1;4,3;]"..
|
||||
"item_image[4.8,0;1,1;technic:quarry]"..
|
||||
"label[0,0.2;"..S("%s Quarry"):format("HV").."]"..
|
||||
"field[4.3,3.5;2,1;size;"..S("Radius:")..";"..radius.."]"
|
||||
if meta:get_int("enabled") == 0 then
|
||||
formspec = formspec.."button[0,1;3,1;enable;"..S("%s Disabled"):format(S("%s Quarry"):format("HV")).."]"
|
||||
formspec = formspec.."button[4,1;2,1;enable;"..S("Disabled").."]"
|
||||
else
|
||||
formspec = formspec.."button[0,1;3,1;disable;"..S("%s Enabled"):format(S("%s Quarry"):format("HV")).."]"
|
||||
formspec = formspec.."button[4,1;2,1;disable;"..S("Enabled").."]"
|
||||
end
|
||||
local diameter = radius*2 + 1
|
||||
local nd = meta:get_int("dug")
|
||||
local rel_y = quarry_dig_above_nodes - math.floor(nd / (diameter*diameter))
|
||||
formspec = formspec.."label[0,4;"..minetest.formspec_escape(
|
||||
nd == 0 and S("Digging not started") or
|
||||
(rel_y < -quarry_max_depth and S("Digging finished") or
|
||||
(meta:get_int("purge_on") == 1 and S("Purging cache") or
|
||||
S("Digging %d m "..(rel_y > 0 and "above" or "below").." machine")
|
||||
:format(math.abs(rel_y))))
|
||||
).."]"
|
||||
formspec = formspec.."button[4,2;2,1;restart;"..S("Restart").."]"
|
||||
meta:set_string("formspec", formspec)
|
||||
end
|
||||
|
||||
local function set_quarry_demand(meta)
|
||||
local radius = meta:get_int("size")
|
||||
local diameter = radius*2 + 1
|
||||
local machine_name = S("%s Quarry"):format("HV")
|
||||
local do_purge = meta:get_int("purge_on") == 1
|
||||
if meta:get_int("enabled") == 0 or do_purge then
|
||||
local infotext = do_purge and
|
||||
S("%s purging cache") or S("%s Disabled")
|
||||
meta:set_string("infotext", infotext:format(machine_name))
|
||||
meta:set_int("HV_EU_demand", 0)
|
||||
elseif meta:get_int("dug") == diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) then
|
||||
meta:set_string("infotext", S("%s Finished"):format(machine_name))
|
||||
meta:set_int("HV_EU_demand", 0)
|
||||
else
|
||||
local infotext = meta:get_int("HV_EU_input") >= quarry_demand
|
||||
and S("%s Active") or S("%s Unpowered")
|
||||
meta:set_string("infotext", infotext:format(machine_name))
|
||||
meta:set_int("HV_EU_demand", quarry_demand)
|
||||
end
|
||||
end
|
||||
|
||||
local function quarry_receive_fields(pos, formname, fields, sender)
|
||||
local player_name = sender:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
minetest.chat_send_player(player_name, "You are not allowed to edit this!")
|
||||
minetest.record_protection_violation(pos, player_name)
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
if fields.size then
|
||||
local size = tonumber(fields.size) or 0
|
||||
size = math.max(size, 2)
|
||||
size = math.min(size, 8)
|
||||
meta:set_int("size", size)
|
||||
if fields.size and string.find(fields.size, "^[0-9]+$") then
|
||||
local size = tonumber(fields.size)
|
||||
if size >= 2 and size <= 8 and size ~= meta:get_int("size") then
|
||||
meta:set_int("size", size)
|
||||
meta:set_int("dug", 0)
|
||||
end
|
||||
end
|
||||
if fields.enable then meta:set_int("enabled", 1) end
|
||||
if fields.disable then meta:set_int("enabled", 0) end
|
||||
if fields.restart then
|
||||
meta:set_int("dug", 0)
|
||||
meta:set_int("purge_on", 1)
|
||||
end
|
||||
set_quarry_formspec(meta)
|
||||
set_quarry_demand(meta)
|
||||
end
|
||||
|
||||
local function get_quarry_center(pos, size)
|
||||
local node = minetest.get_node(pos)
|
||||
local back_dir = minetest.facedir_to_dir(node.param2)
|
||||
local relative_center = vector.multiply(back_dir, size + 1)
|
||||
local center = vector.add(pos, relative_center)
|
||||
return center
|
||||
end
|
||||
|
||||
local function gen_next_digpos(center, digpos, size)
|
||||
digpos.x = digpos.x + 1
|
||||
if digpos.x > center.x + size then
|
||||
digpos.x = center.x - size
|
||||
digpos.z = digpos.z + 1
|
||||
end
|
||||
if digpos.z > center.z + size then
|
||||
digpos.x = center.x - size
|
||||
digpos.z = center.z - size
|
||||
digpos.y = digpos.y - 1
|
||||
end
|
||||
end
|
||||
|
||||
local function find_next_digpos(data, area, center, dig_y, size)
|
||||
local c_air = minetest.get_content_id("air")
|
||||
|
||||
for y = center.y + quarry_dig_above_nodes, dig_y - 1, -1 do
|
||||
for z = center.z - size, center.z + size do
|
||||
for x = center.x - size, center.x + size do
|
||||
if data[area:index(x, y, z)] ~= c_air then
|
||||
return vector.new(x, y, z)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function quarry_dig(pos, center, size)
|
||||
local function quarry_handle_purge(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local drops = {}
|
||||
local dig_y = meta:get_int("dig_y")
|
||||
local owner = meta:get_string("owner")
|
||||
|
||||
local vm = VoxelManip()
|
||||
local p1 = vector.new(
|
||||
center.x - size,
|
||||
center.y + quarry_dig_above_nodes,
|
||||
center.z - size)
|
||||
local p2 = vector.new(
|
||||
center.x + size,
|
||||
dig_y - 1, -- One node lower in case we have finished the current layer
|
||||
center.z + size)
|
||||
local e1, e2 = vm:read_from_map(p1, p2)
|
||||
local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2})
|
||||
local data = vm:get_data()
|
||||
|
||||
local digpos = find_next_digpos(data, area, center, dig_y, size)
|
||||
|
||||
if digpos then
|
||||
if digpos.y < pos.y - quarry_max_depth then
|
||||
meta:set_int("dig_y", digpos.y)
|
||||
return drops
|
||||
local inv = meta:get_inventory()
|
||||
local i = 0
|
||||
for _,stack in ipairs(inv:get_list("cache")) do
|
||||
i = i + 1
|
||||
if stack then
|
||||
local item = stack:to_table()
|
||||
if item then
|
||||
technic.tube_inject_item(pos, pos, quarry_eject_dir, item)
|
||||
stack:clear()
|
||||
inv:set_stack("cache", i, stack)
|
||||
break
|
||||
end
|
||||
end
|
||||
if minetest.is_protected and minetest.is_protected(digpos, owner) then
|
||||
meta:set_int("enabled", 0)
|
||||
set_quarry_formspec(meta)
|
||||
return {}
|
||||
end
|
||||
dig_y = digpos.y
|
||||
local node = minetest.get_node(digpos)
|
||||
local node_def = minetest.registered_nodes[node.name] or { diggable = false }
|
||||
if node_def.diggable and ((not node_def.can_dig) or node_def.can_dig(digpos, nil)) then
|
||||
minetest.remove_node(digpos)
|
||||
drops = minetest.get_node_drops(node.name, "")
|
||||
end
|
||||
elseif not (dig_y < pos.y - quarry_max_depth) then
|
||||
dig_y = dig_y - 16
|
||||
end
|
||||
|
||||
meta:set_int("dig_y", dig_y)
|
||||
return drops
|
||||
if inv:is_empty("cache") then
|
||||
meta:set_int("purge_on", 0)
|
||||
end
|
||||
end
|
||||
|
||||
local function send_items(items, pos, node)
|
||||
for _, item in pairs(items) do
|
||||
local tube_item = pipeworks.tube_item(vector.new(pos), item)
|
||||
tube_item:get_luaentity().start_pos = vector.new(pos)
|
||||
tube_item:setvelocity(vector.new(0, 1, 0))
|
||||
tube_item:setacceleration({x=0, y=0, z=0})
|
||||
-- Determines whether the quarry can dig the node at "pos"
|
||||
-- "startpos" is located a few nodes above the quarry in South West direction (X-, Z-)
|
||||
-- Returns the node to dig (to avoid double minetest.get_node lookup)
|
||||
local function quarry_can_dig_node(startpos, pos, quarry_owner)
|
||||
if minetest.is_protected(pos, quarry_owner) then
|
||||
return nil
|
||||
end
|
||||
|
||||
local node = technic.get_or_load_node(pos) or minetest.get_node(pos)
|
||||
local def = minetest.registered_nodes[node.name] or {diggable=false}
|
||||
-- doors mod among other thing does NOT like a nil digger...
|
||||
local fakedigger = pipeworks.create_fake_player({
|
||||
name = quarry_owner
|
||||
})
|
||||
if not def.diggable or (def.can_dig and not def.can_dig(pos, fakedigger)) then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Find airlike nodes on top of the current node. The entire Y column must be free.
|
||||
for ay = pos.y+1, startpos.y do
|
||||
local checkpos = {x=pos.x, y=ay, z=pos.z}
|
||||
local checknode = technic.get_or_load_node(checkpos) or minetest.get_node(checkpos)
|
||||
|
||||
local cdef = minetest.registered_nodes[checknode.name] or {}
|
||||
local is_kind_of_gas = cdef.buildable_to and cdef.sunlight_propagates and not cdef.walkable
|
||||
and not cdef.diggable and (cdef.drawtype == "airlike" or cdef.drawtype == "glasslike")
|
||||
if not is_kind_of_gas then
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
return node
|
||||
end
|
||||
|
||||
local function quarry_run(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
-- initialize cache for the case we load an older world
|
||||
inv:set_size("cache", 12)
|
||||
-- toss a coin whether we do an automatic purge. Chance 1:200
|
||||
local purge_rand = math.random()
|
||||
if purge_rand <= 0.005 then
|
||||
meta:set_int("purge_on", 1)
|
||||
end
|
||||
|
||||
if meta:get_int("enabled") and meta:get_int("HV_EU_input") >= quarry_demand and meta:get_int("purge_on") == 0 then
|
||||
local pdir = minetest.facedir_to_dir(node.param2)
|
||||
if pdir.y ~= 0 then
|
||||
-- faces up or down, not valid, otherwise depth-check would run endless and hang up the server
|
||||
return
|
||||
end
|
||||
|
||||
local qdir = pdir.x == 1 and vector.new(0,0,-1) or
|
||||
(pdir.z == -1 and vector.new(-1,0,0) or
|
||||
(pdir.x == -1 and vector.new(0,0,1) or
|
||||
vector.new(1,0,0)))
|
||||
local radius = meta:get_int("size")
|
||||
local diameter = radius*2 + 1
|
||||
local startpos = vector.add(vector.add(vector.add(pos,
|
||||
vector.new(0, quarry_dig_above_nodes, 0)),
|
||||
pdir),
|
||||
vector.multiply(qdir, -radius))
|
||||
local owner = meta:get_string("owner")
|
||||
local nd = meta:get_int("dug")
|
||||
while nd < diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) do
|
||||
local ry = math.floor(nd / (diameter*diameter))
|
||||
local ndl = nd % (diameter*diameter)
|
||||
if ry % 2 == 1 then
|
||||
ndl = diameter*diameter - 1 - ndl
|
||||
end
|
||||
local rq = math.floor(ndl / diameter)
|
||||
local rp = ndl % diameter
|
||||
if rq % 2 == 1 then rp = diameter - 1 - rp end
|
||||
local digpos = vector.add(vector.add(vector.add(startpos,
|
||||
vector.new(0, -ry, 0)),
|
||||
vector.multiply(pdir, rp)),
|
||||
vector.multiply(qdir, rq))
|
||||
|
||||
nd = nd + 1
|
||||
|
||||
local dignode = quarry_can_dig_node(startpos, digpos, owner)
|
||||
if dignode then
|
||||
minetest.remove_node(digpos)
|
||||
local drops = minetest.get_node_drops(dignode.name, "")
|
||||
for _, dropped_item in ipairs(drops) do
|
||||
local left = inv:add_item("cache", dropped_item)
|
||||
while not left:is_empty() do
|
||||
meta:set_int("purge_on", 1)
|
||||
quarry_handle_purge(pos)
|
||||
left = inv:add_item("cache", left)
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
if nd == diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) then
|
||||
-- if a quarry is finished, we enable purge mode
|
||||
meta:set_int("purge_on", 1)
|
||||
end
|
||||
meta:set_int("dug", nd)
|
||||
else
|
||||
-- if a quarry is disabled or has no power, we enable purge mode
|
||||
meta:set_int("purge_on", 1)
|
||||
end
|
||||
-- if something triggered a purge, we handle it
|
||||
if meta:get_int("purge_on") == 1 then
|
||||
quarry_handle_purge(pos)
|
||||
end
|
||||
set_quarry_formspec(meta)
|
||||
set_quarry_demand(meta)
|
||||
end
|
||||
|
||||
local function send_move_error(player)
|
||||
minetest.chat_send_player(player:get_player_name(),
|
||||
S("Manually taking/removing from cache by hand is not possible. "..
|
||||
"If you can't wait, restart or disable the quarry to start automatic purge."))
|
||||
return 0
|
||||
end
|
||||
|
||||
minetest.register_node("technic:quarry", {
|
||||
description = S("%s Quarry"):format("HV"),
|
||||
tiles = {"technic_carbon_steel_block.png", "technic_carbon_steel_block.png",
|
||||
"technic_carbon_steel_block.png", "technic_carbon_steel_block.png",
|
||||
"technic_carbon_steel_block.png^default_tool_mesepick.png", "technic_carbon_steel_block.png"},
|
||||
tiles = {
|
||||
"technic_carbon_steel_block.png"..tube_entry,
|
||||
"technic_carbon_steel_block.png"..cable_entry,
|
||||
"technic_carbon_steel_block.png"..cable_entry,
|
||||
"technic_carbon_steel_block.png"..cable_entry,
|
||||
"technic_carbon_steel_block.png^default_tool_mesepick.png",
|
||||
"technic_carbon_steel_block.png"..cable_entry
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=2, tubedevice=1},
|
||||
groups = {cracky=2, tubedevice=1, technic_machine=1, technic_hv=1},
|
||||
connect_sides = {"bottom", "front", "left", "right"},
|
||||
tube = {
|
||||
connect_sides = {top = 1},
|
||||
-- lower priority than other tubes, so that quarries will prefer any
|
||||
-- other tube to another quarry, which could lead to server freezes
|
||||
-- in certain quarry placements (2x2 for example would never eject)
|
||||
priority = 10,
|
||||
can_go = function(pos, node, velocity, stack)
|
||||
-- always eject the same, even if items came in another way
|
||||
-- this further mitigates loops and generally avoids random sideway movement
|
||||
-- that can be expected in certain quarry placements
|
||||
return { quarry_eject_dir }
|
||||
end
|
||||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("%s Quarry"):format("HV"))
|
||||
meta:set_int("size", 4)
|
||||
set_quarry_formspec(meta)
|
||||
meta:set_int("dig_y", pos.y)
|
||||
set_quarry_demand(meta)
|
||||
end,
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("owner", placer:get_player_name())
|
||||
pipeworks.scan_for_tube_objects(pos)
|
||||
end,
|
||||
can_dig = function(pos,player)
|
||||
local meta = minetest.get_meta(pos);
|
||||
local inv = meta:get_inventory()
|
||||
return inv:is_empty("cache")
|
||||
end,
|
||||
after_dig_node = pipeworks.scan_for_tube_objects,
|
||||
on_receive_fields = quarry_receive_fields,
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:quarry"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local size = meta:get_int("size")
|
||||
local eu_input = meta:get_int("HV_EU_input")
|
||||
local demand = 10000
|
||||
local center = get_quarry_center(pos, size)
|
||||
local dig_y = meta:get_int("dig_y")
|
||||
local machine_name = S("%s Quarry"):format("HV")
|
||||
|
||||
technic.switching_station_timeout_count(pos, "HV")
|
||||
|
||||
if meta:get_int("enabled") == 0 then
|
||||
meta:set_string("infotext", S("%s Disabled"):format(machine_name))
|
||||
meta:set_int("HV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < demand then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
elseif eu_input >= demand then
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
|
||||
local items = quarry_dig(pos, center, size)
|
||||
send_items(items, pos, node)
|
||||
|
||||
if dig_y < pos.y - quarry_max_depth then
|
||||
meta:set_string("infotext", S("%s Finished"):format(machine_name))
|
||||
end
|
||||
end
|
||||
meta:set_int("HV_EU_demand", demand)
|
||||
technic_run = quarry_run,
|
||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
return send_move_error(player)
|
||||
end,
|
||||
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
return send_move_error(player)
|
||||
end,
|
||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
return send_move_error(player)
|
||||
end
|
||||
})
|
||||
|
||||
technic.register_machine("HV", "technic:quarry", technic.receiver)
|
||||
|
||||
|
@ -5,8 +5,8 @@ minetest.register_craft({
|
||||
output = 'technic:solar_array_hv 1',
|
||||
recipe = {
|
||||
{'technic:solar_array_mv', 'technic:solar_array_mv', 'technic:solar_array_mv'},
|
||||
{'technic:carbon_steel_ingot', 'technic:hv_transformer', 'technic:carbon_steel_ingot'},
|
||||
{'', 'technic:hv_cable0', ''},
|
||||
{'technic:carbon_plate', 'technic:hv_transformer', 'technic:composite_plate'},
|
||||
{'', 'technic:hv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -4,9 +4,9 @@
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_alloy_furnace',
|
||||
recipe = {
|
||||
{'default:brick', 'default:brick', 'default:brick'},
|
||||
{'default:brick', '', 'default:brick'},
|
||||
{'technic:cast_iron_ingot', 'default:copper_ingot', 'technic:cast_iron_ingot'},
|
||||
{'default:brick', 'default:brick', 'default:brick'},
|
||||
{'default:brick', 'technic:machine_casing', 'default:brick'},
|
||||
{'default:brick', 'technic:lv_cable', 'default:brick'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
-- LV Battery box
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_battery_box0',
|
||||
recipe = {
|
||||
{'technic:battery', 'group:wood', 'technic:battery'},
|
||||
{'technic:battery', 'default:copper_ingot', 'technic:battery'},
|
||||
{'technic:cast_iron_ingot', 'technic:cast_iron_ingot', 'technic:cast_iron_ingot'},
|
||||
{'group:wood', 'group:wood', 'group:wood'},
|
||||
{'technic:battery', 'technic:machine_casing', 'technic:battery'},
|
||||
{'technic:battery', 'technic:lv_cable', 'technic:battery'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,12 +1,14 @@
|
||||
|
||||
minetest.register_alias("lv_cable", "technic:lv_cable0")
|
||||
minetest.register_alias("lv_cable", "technic:lv_cable")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_cable0 6',
|
||||
output = 'technic:lv_cable 6',
|
||||
recipe = {
|
||||
{'default:paper', 'default:paper', 'default:paper'},
|
||||
{'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'},
|
||||
{'default:paper', 'default:paper', 'default:paper'},
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
technic.register_cable("LV", 2/16)
|
||||
|
||||
|
@ -1,236 +0,0 @@
|
||||
-- Technic CNC v1.0 by kpoppel
|
||||
-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck
|
||||
|
||||
-- Idea:
|
||||
-- Somehow have a tabbed/paged panel if the number of shapes should expand
|
||||
-- beyond what is available in the panel today.
|
||||
-- I could imagine some form of API allowing modders to come with their own node
|
||||
-- box definitions and easily stuff it in the this machine for production.
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local shape = {}
|
||||
local onesize_products = {
|
||||
slope = 2,
|
||||
slope_edge = 1,
|
||||
slope_inner_edge = 1,
|
||||
pyramid = 2,
|
||||
spike = 1,
|
||||
cylinder = 2,
|
||||
sphere = 1,
|
||||
stick = 8,
|
||||
slope_upsdown = 2,
|
||||
slope_edge_upsdown = 1,
|
||||
slope_inner_edge_upsdown = 1,
|
||||
cylinder_horizontal = 2,
|
||||
slope_lying = 2,
|
||||
onecurvededge = 1,
|
||||
twocurvededge = 1,
|
||||
}
|
||||
local twosize_products = {
|
||||
element_straight = 4,
|
||||
element_end = 2,
|
||||
element_cross = 1,
|
||||
element_t = 1,
|
||||
element_edge = 2,
|
||||
}
|
||||
|
||||
local cnc_formspec =
|
||||
"invsize[9,11;]"..
|
||||
"label[1,0;"..S("Choose Milling Program:").."]"..
|
||||
"image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]"..
|
||||
"image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
|
||||
"image_button[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]"..
|
||||
"image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]"..
|
||||
"image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]"..
|
||||
"image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]"..
|
||||
"image_button[7,0.5;1,1;technic_cnc_sphere.png;sphere; ]"..
|
||||
"image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]"..
|
||||
|
||||
"image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]"..
|
||||
"image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]"..
|
||||
"image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]"..
|
||||
"image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]"..
|
||||
|
||||
"image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]"..
|
||||
"image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]"..
|
||||
"image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]"..
|
||||
|
||||
"label[1,3.5;"..S("Slim Elements half / normal height:").."]"..
|
||||
|
||||
"image_button[1,4;1,0.5;technic_cnc_full.png;full; ]"..
|
||||
"image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]"..
|
||||
"image_button[2,4;1,1;technic_cnc_element_straight.png;element_straight; ]"..
|
||||
"image_button[3,4;1,1;technic_cnc_element_end.png;element_end; ]"..
|
||||
"image_button[4,4;1,1;technic_cnc_element_cross.png;element_cross; ]"..
|
||||
"image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]"..
|
||||
"image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]"..
|
||||
|
||||
"label[0, 5.5;"..S("In:").."]"..
|
||||
"list[current_name;src;0.5,5.5;1,1;]"..
|
||||
"label[4, 5.5;"..S("Out:").."]"..
|
||||
"list[current_name;dst;5,5.5;4,1;]"..
|
||||
|
||||
"list[current_player;main;0,7;8,4;]"
|
||||
|
||||
local size = 1;
|
||||
|
||||
-- The form handler is declared here because we need it in both the inactive and active modes
|
||||
-- in order to be able to change programs wile it is running.
|
||||
local function form_handler(pos, formname, fields, sender)
|
||||
-- REGISTER MILLING PROGRAMS AND OUTPUTS:
|
||||
------------------------------------------
|
||||
-- Program for half/full size
|
||||
if fields["full"] then
|
||||
size = 1
|
||||
return
|
||||
end
|
||||
|
||||
if fields["half"] then
|
||||
size = 2
|
||||
return
|
||||
end
|
||||
|
||||
-- Resolve the node name and the number of items to make
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local inputstack = inv:get_stack("src", 1)
|
||||
local inputname = inputstack:get_name()
|
||||
local multiplier = 0
|
||||
for k, _ in pairs(fields) do
|
||||
-- Set a multipier for the half/full size capable blocks
|
||||
if twosize_products[k] ~= nil then
|
||||
multiplier = size * twosize_products[k]
|
||||
else
|
||||
multiplier = onesize_products[k]
|
||||
end
|
||||
|
||||
if onesize_products[k] ~= nil or twosize_products[k] ~= nil then
|
||||
meta:set_float( "cnc_multiplier", multiplier)
|
||||
meta:set_string("cnc_user", sender:get_player_name())
|
||||
end
|
||||
|
||||
if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then
|
||||
meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k)
|
||||
--print(inputname .. "_technic_cnc_" .. k)
|
||||
break
|
||||
end
|
||||
|
||||
if twosize_products[k] ~= nil and size==1 then
|
||||
meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k .. "_double")
|
||||
--print(inputname .. "_technic_cnc_" .. k .. "_double")
|
||||
break
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- The actual block inactive state
|
||||
minetest.register_node("technic:cnc", {
|
||||
description = S("%s CNC Machine"):format("LV"),
|
||||
tiles = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
|
||||
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"},
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
groups = {cracky=2},
|
||||
legacy_facedir_simple = true,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("%s CNC Machine"):format("LV"))
|
||||
meta:set_float("technic_power_machine", 1)
|
||||
meta:set_string("formspec", cnc_formspec)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("src", 1)
|
||||
inv:set_size("dst", 4)
|
||||
end,
|
||||
can_dig = technic.machine_can_dig,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
on_receive_fields = form_handler,
|
||||
})
|
||||
|
||||
-- Active state block
|
||||
minetest.register_node("technic:cnc_active", {
|
||||
description = S("%s CNC Machine"):format("LV"),
|
||||
tiles = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
|
||||
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front_active.png"},
|
||||
paramtype2 = "facedir",
|
||||
drop = "technic:cnc",
|
||||
groups = {cracky=2, not_in_creative_inventory=1},
|
||||
legacy_facedir_simple = true,
|
||||
can_dig = technic.machine_can_dig,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
on_receive_fields = form_handler,
|
||||
})
|
||||
|
||||
-- Action code performing the transformation
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:cnc","technic:cnc_active"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local eu_input = meta:get_int("LV_EU_input")
|
||||
local machine_name = S("%s CNC Machine"):format("LV")
|
||||
local machine_node = "technic:cnc"
|
||||
local demand = 450
|
||||
|
||||
-- Power off automatically if no longer connected to a switching station
|
||||
technic.switching_station_timeout_count(pos, "LV")
|
||||
|
||||
local result = meta:get_string("cnc_product")
|
||||
if inv:is_empty("src") or
|
||||
(not minetest.registered_nodes[result]) or
|
||||
(not inv:room_for_item("dst", result)) then
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_string("cnc_product", "")
|
||||
meta:set_int("LV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < demand then
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
elseif eu_input >= demand then
|
||||
technic.swap_node(pos, machine_node.."_active")
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
meta:set_int("src_time", meta:get_int("src_time") + 1)
|
||||
if meta:get_int("src_time") >= 3 then -- 3 ticks per output
|
||||
meta:set_int("src_time", 0)
|
||||
srcstack = inv:get_stack("src", 1)
|
||||
srcstack:take_item()
|
||||
inv:set_stack("src", 1, srcstack)
|
||||
inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier"))
|
||||
end
|
||||
end
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
end
|
||||
})
|
||||
|
||||
technic.register_machine("LV", "technic:cnc", technic.receiver)
|
||||
technic.register_machine("LV", "technic:cnc_active", technic.receiver)
|
||||
|
||||
-------------------------
|
||||
-- CNC Machine Recipe
|
||||
-------------------------
|
||||
minetest.register_craft({
|
||||
output = 'technic:cnc',
|
||||
recipe = {
|
||||
{'default:glass', 'technic:diamond_drill_head', 'default:glass'},
|
||||
{'technic:control_logic_unit', 'technic:motor', 'technic:carbon_steel_ingot'},
|
||||
{'technic:carbon_steel_ingot', 'default:copper_ingot', 'technic:carbon_steel_ingot'},
|
||||
},
|
||||
})
|
||||
|
@ -1,356 +0,0 @@
|
||||
-- API for the technic CNC machine
|
||||
-- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
technic.cnc = {}
|
||||
|
||||
technic.cnc.detail_level = 16
|
||||
|
||||
-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
|
||||
------------------------------------------------------
|
||||
local function cnc_sphere()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
local sehne
|
||||
for i = 1, detail - 1 do
|
||||
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
|
||||
nodebox[i]={-sehne, (i/detail) - 0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_cylinder_horizontal()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
local sehne
|
||||
for i = 1, detail - 1 do
|
||||
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
|
||||
nodebox[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_cylinder()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
local sehne
|
||||
for i = 1, detail - 1 do
|
||||
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
|
||||
nodebox[i]={(i/detail) - 0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_twocurvededge()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level * 2
|
||||
local sehne
|
||||
for i = (detail / 2) - 1, detail - 1 do
|
||||
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
|
||||
nodebox[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_onecurvededge()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level * 2
|
||||
local sehne
|
||||
for i = (detail / 2) - 1, detail - 1 do
|
||||
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
|
||||
nodebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_spike()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail - 1 do
|
||||
nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5,
|
||||
0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_pyramid()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level / 2
|
||||
for i = 0, detail - 1 do
|
||||
nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope_inner_edge_upsdown()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {0.5-(i/detail)-(1/detail), (i/detail)-0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
nodebox[i+detail+1] = {-0.5, (i/detail)-0.5, 0.5-(i/detail)-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope_edge_upsdown()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope_inner_edge()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {(i/detail)-0.5, -0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
nodebox[i+detail+1] = {-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope_edge()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope_upsdown()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope_lying()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
local function cnc_slope()
|
||||
local nodebox = {}
|
||||
local detail = technic.cnc.detail_level
|
||||
for i = 0, detail-1 do
|
||||
nodebox[i+1] = {-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
|
||||
end
|
||||
return nodebox
|
||||
end
|
||||
|
||||
-- Define slope boxes for the various nodes
|
||||
-------------------------------------------
|
||||
technic.cnc.programs = {
|
||||
{suffix = "technic_cnc_stick",
|
||||
nodebox = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
|
||||
desc = S("Stick")},
|
||||
|
||||
{suffix = "technic_cnc_element_end_double",
|
||||
nodebox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
|
||||
desc = S("Element End Double")},
|
||||
|
||||
{suffix = "technic_cnc_element_cross_double",
|
||||
nodebox = {
|
||||
{0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
|
||||
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
|
||||
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
|
||||
desc = S("Element Cross Double")},
|
||||
|
||||
{suffix = "technic_cnc_element_t_double",
|
||||
nodebox = {
|
||||
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
|
||||
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
|
||||
{0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
|
||||
desc = S("Element T Double")},
|
||||
|
||||
{suffix = "technic_cnc_element_edge_double",
|
||||
nodebox = {
|
||||
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
|
||||
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
|
||||
desc = S("Element Edge Double")},
|
||||
|
||||
{suffix = "technic_cnc_element_straight_double",
|
||||
nodebox = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
|
||||
desc = S("Element Straight Double")},
|
||||
|
||||
{suffix = "technic_cnc_element_end",
|
||||
nodebox = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
|
||||
desc = S("Element End")},
|
||||
|
||||
{suffix = "technic_cnc_element_cross",
|
||||
nodebox = {
|
||||
{0.3, -0.5, -0.3, 0.5, 0, 0.3},
|
||||
{-0.3, -0.5, -0.5, 0.3, 0, 0.5},
|
||||
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
|
||||
desc = S("Element Cross")},
|
||||
|
||||
{suffix = "technic_cnc_element_t",
|
||||
nodebox = {
|
||||
{-0.3, -0.5, -0.5, 0.3, 0, 0.3},
|
||||
{-0.5, -0.5, -0.3, -0.3, 0, 0.3},
|
||||
{0.3, -0.5, -0.3, 0.5, 0, 0.3}},
|
||||
desc = S("Element T")},
|
||||
|
||||
{suffix = "technic_cnc_element_edge",
|
||||
nodebox = {
|
||||
{-0.3, -0.5, -0.5, 0.3, 0, 0.3},
|
||||
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
|
||||
desc = S("Element Edge")},
|
||||
|
||||
{suffix = "technic_cnc_element_straight",
|
||||
nodebox = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
|
||||
desc = S("Element Straight")},
|
||||
|
||||
{suffix = "technic_cnc_sphere",
|
||||
nodebox = cnc_sphere(),
|
||||
desc = S("Sphere")},
|
||||
|
||||
{suffix = "technic_cnc_cylinder_horizontal",
|
||||
nodebox = cnc_cylinder_horizontal(),
|
||||
desc = S("Horizontal Cylinder")},
|
||||
|
||||
{suffix = "technic_cnc_cylinder",
|
||||
nodebox = cnc_cylinder(),
|
||||
desc = S("Cylinder")},
|
||||
|
||||
{suffix = "technic_cnc_twocurvededge",
|
||||
nodebox = cnc_twocurvededge(),
|
||||
desc = S("Two Curved Edge Block")},
|
||||
|
||||
{suffix = "technic_cnc_onecurvededge",
|
||||
nodebox = cnc_onecurvededge(),
|
||||
desc = S("One Curved Edge Block")},
|
||||
|
||||
{suffix = "technic_cnc_spike",
|
||||
nodebox = cnc_spike(),
|
||||
desc = S("Spike")},
|
||||
|
||||
{suffix = "technic_cnc_pyramid",
|
||||
nodebox = cnc_pyramid(),
|
||||
desc = S("Pyramid")},
|
||||
|
||||
{suffix = "technic_cnc_slope_inner_edge_upsdown",
|
||||
nodebox = cnc_slope_inner_edge_upsdown(),
|
||||
desc = S("Slope Upside Down Inner Edge")},
|
||||
|
||||
{suffix = "technic_cnc_slope_edge_upsdown",
|
||||
nodebox = cnc_slope_edge_upsdown(),
|
||||
desc = S("Slope Upside Down Edge")},
|
||||
|
||||
{suffix = "technic_cnc_slope_inner_edge",
|
||||
nodebox = cnc_slope_inner_edge(),
|
||||
desc = S("Slope Inner Edge")},
|
||||
|
||||
{suffix = "technic_cnc_slope_edge",
|
||||
nodebox = cnc_slope_edge(),
|
||||
desc = S("Slope Edge")},
|
||||
|
||||
{suffix = "technic_cnc_slope_upsdown",
|
||||
nodebox = cnc_slope_upsdown(),
|
||||
desc = S("Slope Upside Down")},
|
||||
|
||||
{suffix = "technic_cnc_slope_lying",
|
||||
nodebox = cnc_slope_lying(),
|
||||
desc = S("Slope Lying")},
|
||||
|
||||
{suffix = "technic_cnc_slope",
|
||||
nodebox = cnc_slope(),
|
||||
desc = S("Slope")},
|
||||
}
|
||||
|
||||
-- Allow disabling certain programs for some node. Default is allowing all types for all nodes
|
||||
technic.cnc.programs_disable = {
|
||||
-- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
|
||||
-- ...
|
||||
["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown", "technic_cnc_edge",
|
||||
"technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown",
|
||||
"technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick",
|
||||
"technic_cnc_cylinder_horizontal"}
|
||||
}
|
||||
|
||||
-- Generic function for registering all the different node types
|
||||
function technic.cnc.register_program(recipeitem, suffix, nodebox, groups, images, description)
|
||||
minetest.register_node(":"..recipeitem.."_"..suffix, {
|
||||
description = description,
|
||||
drawtype = "nodebox",
|
||||
tiles = images,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = nodebox
|
||||
},
|
||||
groups = groups,
|
||||
})
|
||||
end
|
||||
|
||||
-- function to iterate over all the programs the CNC machine knows
|
||||
function technic.cnc.register_all(recipeitem, groups, images, description)
|
||||
for _, data in ipairs(technic.cnc.programs) do
|
||||
-- Disable node creation for disabled node types for some material
|
||||
local do_register = true
|
||||
if technic.cnc.programs_disable[recipeitem] ~= nil then
|
||||
for __, disable in ipairs(technic.cnc.programs_disable[recipeitem]) do
|
||||
if disable == data.suffix then
|
||||
do_register = false
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Create the node if it passes the test
|
||||
if do_register then
|
||||
technic.cnc.register_program(recipeitem, data.suffix, data.nodebox, groups, images, description.." "..data.desc)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- REGISTER NEW TECHNIC_CNC_API's PART 2: technic.cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
|
||||
-----------------------------------------------------------------------------------------------------------------------
|
||||
function technic.cnc.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_sphere, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end)
|
||||
|
||||
technic.cnc.register_slope(recipeitem, groups, images, desc_slope)
|
||||
technic.cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
|
||||
technic.cnc.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
|
||||
technic.cnc.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
|
||||
technic.cnc.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
|
||||
technic.cnc.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge)
|
||||
technic.cnc.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
|
||||
technic.cnc.register_pyramid(recipeitem, groups, images, desc_pyramid)
|
||||
technic.cnc.register_spike(recipeitem, groups, images, desc_spike)
|
||||
technic.cnc.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)
|
||||
technic.cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
|
||||
technic.cnc.register_cylinder(recipeitem, groups, images, desc_cylinder)
|
||||
technic.cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
|
||||
technic.cnc.register_sphere(recipeitem, groups, images, desc_sphere)
|
||||
technic.cnc.register_element_straight(recipeitem, groups, images, desc_element_straight)
|
||||
technic.cnc.register_element_edge(recipeitem, groups, images, desc_element_edge)
|
||||
technic.cnc.register_element_t(recipeitem, groups, images, desc_element_t)
|
||||
technic.cnc.register_element_cross(recipeitem, groups, images, desc_element_cross)
|
||||
technic.cnc.register_element_end(recipeitem, groups, images, desc_element_end)
|
||||
end
|
||||
|
||||
-- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz)
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
function technic.cnc.register_stick_etc(recipeitem, groups, images, desc_stick)
|
||||
technic.cnc.register_stick(recipeitem, groups, images, desc_stick)
|
||||
end
|
||||
|
||||
function technic.cnc.register_elements(recipeitem, groups, images, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double)
|
||||
technic.cnc.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double)
|
||||
technic.cnc.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double)
|
||||
technic.cnc.register_element_t_double(recipeitem, groups, images, desc_element_t_double)
|
||||
technic.cnc.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double)
|
||||
technic.cnc.register_element_end_double(recipeitem, groups, images, desc_element_end_double)
|
||||
end
|
||||
|
@ -1,96 +0,0 @@
|
||||
-- REGISTER MATERIALS AND PROPERTIES FOR NONCUBIC ELEMENTS:
|
||||
-----------------------------------------------------------
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
-- DIRT
|
||||
-------
|
||||
technic.cnc.register_all("default:dirt",
|
||||
{snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
|
||||
{"default_grass.png", "default_dirt.png", "default_grass.png"},
|
||||
S("Dirt"))
|
||||
technic.cnc.programs_disable["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown",
|
||||
"technic_cnc_edge", "technic_cnc_inner_edge",
|
||||
"technic_cnc_slope_edge_upsdown", "technic_cnc_slope_inner_edge_upsdown",
|
||||
"technic_cnc_stick", "technic_cnc_cylinder_horizontal"}
|
||||
|
||||
-- WOOD
|
||||
-------
|
||||
technic.cnc.register_all("default:wood",
|
||||
{snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
|
||||
{"default_wood.png"},
|
||||
S("Wooden"))
|
||||
-- STONE
|
||||
--------
|
||||
technic.cnc.register_all("default:stone",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"default_stone.png"},
|
||||
S("Stone"))
|
||||
-- COBBLE
|
||||
---------
|
||||
technic.cnc.register_all("default:cobble",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"default_cobble.png"},
|
||||
S("Cobble"))
|
||||
-- BRICK
|
||||
--------
|
||||
technic.cnc.register_all("default:brick",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"default_brick.png"},
|
||||
S("Brick"))
|
||||
|
||||
-- SANDSTONE
|
||||
------------
|
||||
technic.cnc.register_all("default:sandstone",
|
||||
{crumbly=2, cracky=2, not_in_creative_inventory=1},
|
||||
{"default_sandstone.png"},
|
||||
S("Sandstone"))
|
||||
|
||||
-- LEAVES
|
||||
---------
|
||||
technic.cnc.register_all("default:leaves",
|
||||
{snappy=2, choppy=2, oddly_breakable_by_hand=3, not_in_creative_inventory=1},
|
||||
{"default_leaves.png"},
|
||||
S("Leaves"))
|
||||
-- TREE
|
||||
-------
|
||||
technic.cnc.register_all("default:tree",
|
||||
{snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, wood=1, not_in_creative_inventory=1},
|
||||
{"default_tree.png"},
|
||||
S("Tree"))
|
||||
|
||||
-- WROUGHT IRON
|
||||
---------------
|
||||
technic.cnc.register_all("default:steelblock",
|
||||
{cracky=1, level=2, not_in_creative_inventory=1},
|
||||
{"technic_wrought_iron_block.png"},
|
||||
S("Wrought Iron"))
|
||||
|
||||
-- Bronze
|
||||
--------
|
||||
technic.cnc.register_all("default:bronzeblock",
|
||||
{cracky=1, level=2, not_in_creative_inventory=1},
|
||||
{"default_bronze_block.png"},
|
||||
S("Bronze"))
|
||||
|
||||
-- Stainless Steel
|
||||
--------
|
||||
technic.cnc.register_all("technic:stainless_steel_block",
|
||||
{cracky=1, level=2, not_in_creative_inventory=1},
|
||||
{"technic_stainless_steel_block.png"},
|
||||
S("Stainless Steel"))
|
||||
|
||||
-- Marble
|
||||
------------
|
||||
technic.cnc.register_all("technic:marble",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"technic_marble.png"},
|
||||
S("Marble"))
|
||||
|
||||
-- Granite
|
||||
------------
|
||||
technic.cnc.register_all("technic:granite",
|
||||
{cracky=3, not_in_creative_inventory=1},
|
||||
{"technic_granite.png"},
|
||||
S("Granite"))
|
||||
|
@ -4,10 +4,14 @@ minetest.register_alias("compressor", "technic:lv_compressor")
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_compressor',
|
||||
recipe = {
|
||||
{'default:stone', 'default:stone', 'default:stone'},
|
||||
{'mesecons:piston', 'technic:motor', 'mesecons:piston'},
|
||||
{'default:stone', 'technic:lv_cable0', 'default:stone'},
|
||||
}
|
||||
{'default:stone', 'basic_materials:motor', 'default:stone'},
|
||||
{'mesecons:piston', 'technic:machine_casing', 'mesecons:piston'},
|
||||
{'basic_materials:silver_wire', 'technic:lv_cable', 'basic_materials:silver_wire'},
|
||||
},
|
||||
replacements = {
|
||||
{"basic_materials:silver_wire", "basic_materials:empty_spool"},
|
||||
{"basic_materials:silver_wire", "basic_materials:empty_spool"}
|
||||
},
|
||||
})
|
||||
|
||||
technic.register_compressor({tier = "LV", demand = {300}, speed = 1})
|
||||
|
@ -5,9 +5,9 @@
|
||||
minetest.register_craft({
|
||||
output = 'technic:electric_furnace',
|
||||
recipe = {
|
||||
{'default:cobble', 'default:cobble', 'default:cobble'},
|
||||
{'default:cobble', '', 'default:cobble'},
|
||||
{'technic:cast_iron_ingot', 'moreores:copper_ingot', 'technic:cast_iron_ingot'},
|
||||
{'default:cobble', 'default:cobble', 'default:cobble'},
|
||||
{'default:cobble', 'technic:machine_casing', 'default:cobble'},
|
||||
{'default:cobble', 'technic:lv_cable', 'default:cobble'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -4,9 +4,9 @@ minetest.register_alias("extractor", "technic:lv_extractor")
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_extractor',
|
||||
recipe = {
|
||||
{'technic:treetap', 'technic:motor', 'technic:treetap'},
|
||||
{'technic:treetap', 'technic:lv_cable0', 'technic:treetap'},
|
||||
{'', '', ''},
|
||||
{'technic:treetap', 'basic_materials:motor', 'technic:treetap'},
|
||||
{'technic:treetap', 'technic:machine_casing', 'technic:treetap'},
|
||||
{'', 'technic:lv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -8,9 +8,9 @@ minetest.register_alias("lv_generator", "technic:lv_generator")
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_generator',
|
||||
recipe = {
|
||||
{'default:stone', 'default:stone', 'default:stone'},
|
||||
{'default:stone', '', 'default:stone'},
|
||||
{'default:stone', 'default:copper_ingot', 'default:stone'},
|
||||
{'default:stone', 'default:furnace', 'default:stone'},
|
||||
{'default:stone', 'technic:machine_casing', 'default:stone'},
|
||||
{'default:stone', 'technic:lv_cable', 'default:stone'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -10,29 +10,93 @@ local S = technic.getter
|
||||
minetest.register_craft({
|
||||
output = 'technic:geothermal',
|
||||
recipe = {
|
||||
{'default:stone', 'default:stone', 'default:stone'},
|
||||
{'default:copper_ingot', 'default:diamond', 'default:copper_ingot'},
|
||||
{'default:stone', 'default:copper_ingot', 'default:stone'},
|
||||
}
|
||||
{'technic:granite', 'default:diamond', 'technic:granite'},
|
||||
{'basic_materials:copper_wire', 'technic:machine_casing', 'basic_materials:copper_wire'},
|
||||
{'technic:granite', 'technic:lv_cable', 'technic:granite'},
|
||||
},
|
||||
replacements = {
|
||||
{"basic_materials:copper_wire", "basic_materials:empty_spool"},
|
||||
{"basic_materials:copper_wire", "basic_materials:empty_spool"}
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craftitem("technic:geothermal", {
|
||||
description = S("Geothermal %s Generator"):format("LV"),
|
||||
})
|
||||
})
|
||||
|
||||
local check_node_around = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == "default:water_source" or node.name == "default:water_flowing" then return 1 end
|
||||
if node.name == "default:lava_source" or node.name == "default:lava_flowing" then return 2 end
|
||||
return 0
|
||||
end
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local water_nodes = 0
|
||||
local lava_nodes = 0
|
||||
local production_level = 0
|
||||
local eu_supply = 0
|
||||
|
||||
-- Correct positioning is water on one side and lava on the other.
|
||||
-- The two cannot be adjacent because the lava the turns into obsidian or rock.
|
||||
-- To get to 100% production stack the water and lava one extra block down as well:
|
||||
-- WGL (W=Water, L=Lava, G=the generator, |=an LV cable)
|
||||
-- W|L
|
||||
|
||||
local positions = {
|
||||
{x=pos.x+1, y=pos.y, z=pos.z},
|
||||
{x=pos.x+1, y=pos.y-1, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y-1, z=pos.z},
|
||||
{x=pos.x, y=pos.y, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y-1, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y, z=pos.z-1},
|
||||
{x=pos.x, y=pos.y-1, z=pos.z-1},
|
||||
}
|
||||
for _, p in pairs(positions) do
|
||||
local check = check_node_around(p)
|
||||
if check == 1 then water_nodes = water_nodes + 1 end
|
||||
if check == 2 then lava_nodes = lava_nodes + 1 end
|
||||
end
|
||||
|
||||
if water_nodes == 1 and lava_nodes == 1 then production_level = 25; eu_supply = 50 end
|
||||
if water_nodes == 2 and lava_nodes == 1 then production_level = 50; eu_supply = 100 end
|
||||
if water_nodes == 1 and lava_nodes == 2 then production_level = 75; eu_supply = 200 end
|
||||
if water_nodes == 2 and lava_nodes == 2 then production_level = 100; eu_supply = 300 end
|
||||
|
||||
if production_level > 0 then
|
||||
meta:set_int("LV_EU_supply", eu_supply)
|
||||
end
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Geothermal %s Generator"):format("LV").." ("..production_level.."%)")
|
||||
|
||||
if production_level > 0 and minetest.get_node(pos).name == "technic:geothermal" then
|
||||
technic.swap_node (pos, "technic:geothermal_active")
|
||||
return
|
||||
end
|
||||
if production_level == 0 then
|
||||
technic.swap_node(pos, "technic:geothermal")
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:geothermal", {
|
||||
description = S("Geothermal %s Generator"):format("LV"),
|
||||
tiles = {"technic_geothermal_top.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
|
||||
"technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_lv=1},
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("Geothermal %s Generator"):format("LV"))
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
end,
|
||||
end,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:geothermal_active", {
|
||||
@ -40,75 +104,14 @@ minetest.register_node("technic:geothermal_active", {
|
||||
tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
|
||||
"technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_lv=1, not_in_creative_inventory=1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop = "technic:geothermal",
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
local check_node_around = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == "default:water_source" or node.name == "default:water_flowing" then return 1 end
|
||||
if node.name == "default:lava_source" or node.name == "default:lava_flowing" then return 2 end
|
||||
return 0
|
||||
end
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:geothermal","technic:geothermal_active"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local water_nodes = 0
|
||||
local lava_nodes = 0
|
||||
local production_level = 0
|
||||
local eu_supply = 0
|
||||
|
||||
-- Correct positioning is water on one side and lava on the other.
|
||||
-- The two cannot be adjacent because the lava the turns into obsidian or rock.
|
||||
-- To get to 100% production stack the water and lava one extra block down as well:
|
||||
-- WGL (W=Water, L=Lava, G=the generator, |=an LV cable)
|
||||
-- W|L
|
||||
|
||||
local positions = {
|
||||
{x=pos.x+1, y=pos.y, z=pos.z},
|
||||
{x=pos.x+1, y=pos.y-1, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y-1, z=pos.z},
|
||||
{x=pos.x, y=pos.y, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y-1, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y, z=pos.z-1},
|
||||
{x=pos.x, y=pos.y-1, z=pos.z-1},
|
||||
}
|
||||
for _, p in pairs(positions) do
|
||||
local check = check_node_around(p)
|
||||
if check == 1 then water_nodes = water_nodes + 1 end
|
||||
if check == 2 then lava_nodes = lava_nodes + 1 end
|
||||
end
|
||||
|
||||
if water_nodes == 1 and lava_nodes == 1 then production_level = 25; eu_supply = 50 end
|
||||
if water_nodes == 2 and lava_nodes == 1 then production_level = 50; eu_supply = 100 end
|
||||
if water_nodes == 1 and lava_nodes == 2 then production_level = 75; eu_supply = 200 end
|
||||
if water_nodes == 2 and lava_nodes == 2 then production_level = 100; eu_supply = 300 end
|
||||
|
||||
if production_level > 0 then
|
||||
meta:set_int("LV_EU_supply", eu_supply)
|
||||
end
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Geothermal %s Generator"):format("LV").." ("..production_level.."%)")
|
||||
|
||||
if production_level > 0 and minetest.get_node(pos).name == "technic:geothermal" then
|
||||
technic.swap_node (pos, "technic:geothermal_active")
|
||||
return
|
||||
end
|
||||
if production_level == 0 then
|
||||
technic.swap_node(pos, "technic:geothermal")
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
technic.register_machine("LV", "technic:geothermal", technic.producer)
|
||||
technic.register_machine("LV", "technic:geothermal_active", technic.producer)
|
||||
|
||||
|
@ -1,13 +1,33 @@
|
||||
|
||||
minetest.register_alias("grinder", "technic:grinder")
|
||||
minetest.register_alias("grinder", "technic:lv_grinder")
|
||||
minetest.register_craft({
|
||||
output = 'technic:grinder',
|
||||
output = 'technic:lv_grinder',
|
||||
recipe = {
|
||||
{'default:desert_stone', 'default:desert_stone', 'default:desert_stone'},
|
||||
{'default:desert_stone', 'default:diamond', 'default:desert_stone'},
|
||||
{'default:stone', 'moreores:copper_ingot', 'default:stone'},
|
||||
{'default:desert_stone', 'default:diamond', 'default:desert_stone'},
|
||||
{'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'},
|
||||
{'technic:granite', 'technic:lv_cable', 'technic:granite'},
|
||||
}
|
||||
})
|
||||
|
||||
if (minetest.get_modpath('everness')) then
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_grinder',
|
||||
recipe = {
|
||||
{'everness:coral_desert_stone', 'default:diamond', 'everness:coral_desert_stone'},
|
||||
{'everness:coral_desert_stone', 'technic:machine_casing', 'everness:coral_desert_stone'},
|
||||
{'technic:granite', 'technic:lv_cable', 'technic:granite'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:lv_grinder',
|
||||
recipe = {
|
||||
{'everness:forsaken_desert_stone', 'default:diamond', 'everness:forsaken_desert_stone'},
|
||||
{'everness:forsaken_desert_stone', 'technic:machine_casing', 'everness:forsaken_desert_stone'},
|
||||
{'technic:granite', 'technic:lv_cable', 'technic:granite'},
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
technic.register_grinder({tier="LV", demand={200}, speed=1})
|
||||
|
||||
|
@ -14,10 +14,6 @@ dofile(path.."/geothermal.lua")
|
||||
dofile(path.."/water_mill.lua")
|
||||
dofile(path.."/generator.lua")
|
||||
|
||||
-- Coal-powered machines (TODO -> move to somewhere else?)
|
||||
dofile(path.."/coal_alloy_furnace.lua")
|
||||
dofile(path.."/coal_furnace.lua")
|
||||
|
||||
-- Machines
|
||||
dofile(path.."/alloy_furnace.lua")
|
||||
dofile(path.."/electric_furnace.lua")
|
||||
@ -26,8 +22,6 @@ dofile(path.."/extractor.lua")
|
||||
dofile(path.."/compressor.lua")
|
||||
|
||||
dofile(path.."/music_player.lua")
|
||||
|
||||
dofile(path.."/cnc.lua")
|
||||
dofile(path.."/cnc_api.lua")
|
||||
dofile(path.."/cnc_nodes.lua")
|
||||
|
||||
-- NEW LV LAMPS
|
||||
dofile(path.."/led.lua")
|
||||
dofile(path.."/lamp.lua")
|
||||
|
156
technic/machines/LV/lamp.lua
Normal file
@ -0,0 +1,156 @@
|
||||
|
||||
-- LV Lamp
|
||||
-- Illuminates a 7x7x3(H) volume below itself with light bright as the sun.
|
||||
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local desc = S("@1 Lamp", S("LV"))
|
||||
local active_desc = S("@1 Active", desc)
|
||||
local unpowered_desc = S("@1 Unpowered", desc)
|
||||
local off_desc = S("@1 Off", desc)
|
||||
local demand = 50
|
||||
|
||||
|
||||
-- Invisible light source node used for illumination
|
||||
minetest.register_node("technic:dummy_light_source", {
|
||||
description = S("Dummy light source node"),
|
||||
inventory_image = "technic_dummy_light_source.png",
|
||||
wield_image = "technic_dummy_light_source.png",
|
||||
paramtype = "light",
|
||||
drawtype = "airlike",
|
||||
light_source = 14,
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
diggable = false,
|
||||
pointable = false,
|
||||
--drop = "", -- Intentionally allowed to drop itself
|
||||
groups = {not_in_creative_inventory = 1}
|
||||
})
|
||||
|
||||
|
||||
local function illuminate(pos, active)
|
||||
local pos1 = {x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}
|
||||
local pos2 = {x = pos.x + 3, y = pos.y - 3, z = pos.z + 3}
|
||||
|
||||
local find_node = active and "air" or "technic:dummy_light_source"
|
||||
local set_node = {name = (active and "technic:dummy_light_source" or "air")}
|
||||
|
||||
for _,p in pairs(minetest.find_nodes_in_area(pos1, pos2, find_node)) do
|
||||
minetest.set_node(p, set_node)
|
||||
end
|
||||
end
|
||||
|
||||
local function lamp_run(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
if meta:get_int("LV_EU_demand") == 0 then
|
||||
return -- Lamp is turned off
|
||||
end
|
||||
|
||||
local eu_input = meta:get_int("LV_EU_input")
|
||||
|
||||
if node.name == "technic:lv_lamp_active" then
|
||||
if eu_input < demand then
|
||||
technic.swap_node(pos, "technic:lv_lamp")
|
||||
meta:set_string("infotext", unpowered_desc)
|
||||
illuminate(pos, false)
|
||||
else
|
||||
illuminate(pos, true)
|
||||
end
|
||||
elseif node.name == "technic:lv_lamp" then
|
||||
if eu_input >= demand then
|
||||
technic.swap_node(pos, "technic:lv_lamp_active")
|
||||
meta:set_string("infotext", active_desc)
|
||||
illuminate(pos, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function lamp_toggle(pos, node, player)
|
||||
if not player or minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_int("LV_EU_demand") == 0 then
|
||||
meta:set_string("infotext", active_desc)
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
else
|
||||
illuminate(pos, false)
|
||||
technic.swap_node(pos, "technic:lv_lamp")
|
||||
meta:set_string("infotext", off_desc)
|
||||
meta:set_int("LV_EU_demand", 0)
|
||||
end
|
||||
end
|
||||
|
||||
local common_fields = {
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5}
|
||||
},
|
||||
tiles = {
|
||||
"technic_lv_lamp_top.png",
|
||||
"technic_lv_lamp_bottom.png",
|
||||
"technic_lv_lamp_side.png",
|
||||
"technic_lv_lamp_side.png",
|
||||
"technic_lv_lamp_side.png",
|
||||
"technic_lv_lamp_side.png"
|
||||
},
|
||||
connect_sides = {"front", "back", "left", "right", "top"},
|
||||
can_dig = technic.machine_can_dig,
|
||||
technic_run = lamp_run,
|
||||
on_destruct = illuminate,
|
||||
on_rightclick = lamp_toggle
|
||||
}
|
||||
|
||||
local ndef
|
||||
|
||||
ndef = {
|
||||
description = desc,
|
||||
groups = {cracky = 2, technic_machine = 1, technic_lv = 1},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", desc)
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
end
|
||||
}
|
||||
|
||||
for k, v in pairs(common_fields) do
|
||||
ndef[k] = v
|
||||
end
|
||||
|
||||
minetest.register_node("technic:lv_lamp", ndef)
|
||||
|
||||
|
||||
ndef = {
|
||||
description = active_desc,
|
||||
paramtype = "light",
|
||||
light_source = 14,
|
||||
drop = "technic:lv_lamp",
|
||||
groups = {cracky = 2, technic_machine = 1, technic_lv = 1, not_in_creative_inventory = 1},
|
||||
technic_on_disable = function(pos)
|
||||
illuminate(pos, false)
|
||||
technic.swap_node(pos, "technic:lv_lamp")
|
||||
end,
|
||||
}
|
||||
|
||||
for k, v in pairs(common_fields) do
|
||||
ndef[k] = v
|
||||
end
|
||||
|
||||
minetest.register_node("technic:lv_lamp_active", ndef)
|
||||
|
||||
|
||||
technic.register_machine("LV", "technic:lv_lamp", technic.receiver)
|
||||
technic.register_machine("LV", "technic:lv_lamp_active", technic.receiver)
|
||||
|
||||
minetest.register_craft({
|
||||
output = "technic:lv_lamp",
|
||||
recipe = {
|
||||
{"default:glass", "default:glass", "default:glass"},
|
||||
{"technic:lv_led", "technic:lv_led", "technic:lv_led"},
|
||||
{"mesecons_materials:glue", "technic:lv_cable", "mesecons_materials:glue"},
|
||||
}
|
||||
})
|
95
technic/machines/LV/led.lua
Normal file
@ -0,0 +1,95 @@
|
||||
-- LED
|
||||
-- Intended primarily as a core component for LED lamps.
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local desc = S("@1 LED", S("LV"))
|
||||
local active_desc = S("@1 Active", desc)
|
||||
local unpowered_desc = S("@1 Unpowered", desc)
|
||||
local demand = 5
|
||||
|
||||
|
||||
local function led_run(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int("LV_EU_input")
|
||||
|
||||
if eu_input < demand and node.name == "technic:lv_led_active" then
|
||||
technic.swap_node(pos, "technic:lv_led")
|
||||
meta:set_string("infotext", unpowered_desc)
|
||||
elseif eu_input >= demand and node.name == "technic:lv_led" then
|
||||
technic.swap_node(pos, "technic:lv_led_active")
|
||||
meta:set_string("infotext", active_desc)
|
||||
end
|
||||
end
|
||||
|
||||
local common_fields = {
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {0.5, 0.5, 0.5, -0.5, 0.3, -0.5}
|
||||
},
|
||||
tiles = {
|
||||
"technic_lv_led_top.png",
|
||||
"technic_lv_led.png",
|
||||
"technic_lv_led_side.png",
|
||||
"technic_lv_led_side2.png",
|
||||
"technic_lv_led_side2.png",
|
||||
"technic_lv_led_side2.png",
|
||||
},
|
||||
|
||||
connect_sides = {"front", "back", "left", "right", "top", "bottom"},
|
||||
can_dig = technic.machine_can_dig,
|
||||
technic_run = led_run,
|
||||
}
|
||||
|
||||
local ndef
|
||||
|
||||
ndef = {
|
||||
description = desc,
|
||||
inventory_image = "technic_lv_led_inv.png",
|
||||
sunlight_propagates = true,
|
||||
groups = {cracky = 2, technic_machine = 1, technic_lv = 1},
|
||||
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", desc)
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
end,
|
||||
}
|
||||
|
||||
for k, v in pairs(common_fields) do
|
||||
ndef[k] = v
|
||||
end
|
||||
|
||||
minetest.register_node("technic:lv_led", ndef)
|
||||
|
||||
|
||||
ndef = {
|
||||
description = active_desc,
|
||||
paramtype = "light",
|
||||
light_source = 9,
|
||||
drop = "technic:lv_led",
|
||||
groups = {cracky = 2, technic_machine = 1, technic_lv = 1, not_in_creative_inventory = 1},
|
||||
technic_on_disable = function(pos)
|
||||
technic.swap_node(pos, "technic:lv_led")
|
||||
end,
|
||||
}
|
||||
|
||||
for k, v in pairs(common_fields) do
|
||||
ndef[k] = v
|
||||
end
|
||||
|
||||
minetest.register_node("technic:lv_led_active", ndef)
|
||||
|
||||
|
||||
technic.register_machine("LV", "technic:lv_led", technic.receiver)
|
||||
technic.register_machine("LV", "technic:lv_led_active", technic.receiver)
|
||||
|
||||
minetest.register_craft({
|
||||
output = "technic:lv_led 2",
|
||||
recipe = {
|
||||
{"", "homedecor:plastic_sheeting", ""},
|
||||
{"homedecor:plastic_sheeting", "technic:doped_silicon_wafer", "homedecor:plastic_sheeting"},
|
||||
{"", "technic:fine_silver_wire", ""},
|
||||
}
|
||||
})
|
@ -7,142 +7,124 @@ minetest.register_alias("music_player", "technic:music_player")
|
||||
minetest.register_craft({
|
||||
output = 'technic:music_player',
|
||||
recipe = {
|
||||
{'group:wood', 'group:wood', 'group:wood'},
|
||||
{'default:diamond', 'default:diamond', 'default:diamond'},
|
||||
{'default:stone', 'default:copper_ingot', 'default:stone'},
|
||||
{'technic:chromium_ingot', 'default:diamond', 'technic:chromium_ingot'},
|
||||
{'default:diamond', 'technic:machine_casing', 'default:diamond'},
|
||||
{'default:mossycobble', 'technic:lv_cable', 'default:mossycobble'},
|
||||
}
|
||||
})
|
||||
|
||||
local music_handles = {}
|
||||
|
||||
local music_player_formspec =
|
||||
"invsize[8,9;]"..
|
||||
"label[0,0;"..S("%s Music Player"):format("LV").."]"..
|
||||
"button[4,1;1,1;track1;1]"..
|
||||
"button[5,1;1,1;track2;2]"..
|
||||
"button[6,1;1,1;track3;3]"..
|
||||
"button[4,2;1,1;track4;4]"..
|
||||
"button[5,2;1,1;track5;5]"..
|
||||
"button[6,2;1,1;track6;6]"..
|
||||
"button[4,3;1,1;track7;7]"..
|
||||
"button[5,3;1,1;track8;8]"..
|
||||
"button[6,3;1,1;track9;9]"..
|
||||
"button[4,4;1,2;play;Play]"..
|
||||
"button[6,4;1,2;stop;Stop]"..
|
||||
"label[4,0;"..S("Current track %s"):format("--").."]"
|
||||
|
||||
local function play_track(pos, track)
|
||||
return minetest.sound_play("technic_track"..tostring(track),
|
||||
{pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,})
|
||||
end
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int("LV_EU_input")
|
||||
local machine_name = S("%s Music Player"):format("LV")
|
||||
local demand = 150
|
||||
|
||||
local current_track = meta:get_int("current_track")
|
||||
local pos_hash = minetest.hash_node_position(pos)
|
||||
local music_handle = music_handles[pos_hash]
|
||||
|
||||
-- Setup meta data if it does not exist.
|
||||
if not eu_input then
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
meta:set_int("LV_EU_input", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if meta:get_int("active") == 0 then
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int("LV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < demand then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
if music_handle then
|
||||
minetest.sound_stop(music_handle)
|
||||
music_handle = nil
|
||||
end
|
||||
elseif eu_input >= demand then
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
if not music_handle then
|
||||
music_handle = play_track(pos, current_track)
|
||||
end
|
||||
end
|
||||
music_handles[pos_hash] = music_handle
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
end
|
||||
|
||||
local function stop_player(pos, node)
|
||||
local pos_hash = minetest.hash_node_position(pos)
|
||||
local music_handle = music_handles[pos_hash]
|
||||
if music_handle then
|
||||
minetest.sound_stop(music_handle)
|
||||
music_handles[pos_hash] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function set_display(meta)
|
||||
meta:set_string("formspec",
|
||||
"size[4,4.5]"..
|
||||
"item_image[0,0;1,1;technic:music_player]"..
|
||||
"label[1,0;"..S("%s Music Player"):format("LV").."]"..
|
||||
"button[0,1;1,1;track1;1]"..
|
||||
"button[1,1;1,1;track2;2]"..
|
||||
"button[2,1;1,1;track3;3]"..
|
||||
"button[0,2;1,1;track4;4]"..
|
||||
"button[1,2;1,1;track5;5]"..
|
||||
"button[2,2;1,1;track6;6]"..
|
||||
"button[0,3;1,1;track7;7]"..
|
||||
"button[1,3;1,1;track8;8]"..
|
||||
"button[2,3;1,1;track9;9]"..
|
||||
"button[3,1;1,1;stop;Stop]"..
|
||||
"label[0,4;"..minetest.formspec_escape(
|
||||
meta:get_int("active") == 0 and
|
||||
S("Stopped") or
|
||||
S("Current track %s"):format(meta:get_int("current_track"))).."]")
|
||||
end
|
||||
|
||||
minetest.register_node("technic:music_player", {
|
||||
description = S("%s Music Player"):format("LV"),
|
||||
tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png",
|
||||
"technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_lv=1},
|
||||
connect_sides = {"bottom"},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("%s Music Player"):format("LV"))
|
||||
meta:set_int("active", 0)
|
||||
meta:set_int("current_track", 1)
|
||||
meta:set_string("formspec", music_player_formspec)
|
||||
set_display(meta)
|
||||
end,
|
||||
on_receive_fields = function(pos, formanme, fields, sender)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local pos_hash = minetest.hash_node_position(pos)
|
||||
local music_handle = music_handles[pos_hash]
|
||||
local current_track = meta:get_int("current_track")
|
||||
if fields.track1 then current_track = 1 end
|
||||
if fields.track2 then current_track = 2 end
|
||||
if fields.track3 then current_track = 3 end
|
||||
if fields.track4 then current_track = 4 end
|
||||
if fields.track5 then current_track = 5 end
|
||||
if fields.track6 then current_track = 6 end
|
||||
if fields.track7 then current_track = 7 end
|
||||
if fields.track8 then current_track = 8 end
|
||||
if fields.track9 then current_track = 9 end
|
||||
meta:set_int("current_track", current_track)
|
||||
meta:set_string("formspec",
|
||||
"invsize[8,9;]"..
|
||||
"label[0,0;"..S("%s Music Player"):format("LV").."]"..
|
||||
"button[4,1;1,1;track1;1]"..
|
||||
"button[5,1;1,1;track2;2]"..
|
||||
"button[6,1;1,1;track3;3]"..
|
||||
"button[4,2;1,1;track4;4]"..
|
||||
"button[5,2;1,1;track5;5]"..
|
||||
"button[6,2;1,1;track6;6]"..
|
||||
"button[4,3;1,1;track7;7]"..
|
||||
"button[5,3;1,1;track8;8]"..
|
||||
"button[6,3;1,1;track9;9]"..
|
||||
"button[4,4;1,2;play;Play]"..
|
||||
"button[6,4;1,2;stop;Stop]"..
|
||||
"label[4,0;"..S("Current track %s")
|
||||
:format(current_track).."]")
|
||||
if fields.play then
|
||||
if music_handle then
|
||||
minetest.sound_stop(music_handle)
|
||||
end
|
||||
music_handle = play_track(pos, current_track)
|
||||
meta:set_int("active", 1)
|
||||
local new_track = nil
|
||||
if fields.stop then new_track = 0 end
|
||||
if fields.track1 then new_track = 1 end
|
||||
if fields.track2 then new_track = 2 end
|
||||
if fields.track3 then new_track = 3 end
|
||||
if fields.track4 then new_track = 4 end
|
||||
if fields.track5 then new_track = 5 end
|
||||
if fields.track6 then new_track = 6 end
|
||||
if fields.track7 then new_track = 7 end
|
||||
if fields.track8 then new_track = 8 end
|
||||
if fields.track9 then new_track = 9 end
|
||||
if new_track then
|
||||
stop_player(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("active", new_track == 0 and 0 or 1)
|
||||
meta:set_int("current_track", new_track)
|
||||
set_display(meta)
|
||||
end
|
||||
if fields.stop then
|
||||
meta:set_int("active", 0)
|
||||
if music_handle then
|
||||
minetest.sound_stop(music_handle)
|
||||
end
|
||||
end
|
||||
music_handles[pos_hash] = music_handle
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:music_player"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int("LV_EU_input")
|
||||
local machine_name = S("%s Music Player"):format("LV")
|
||||
local machine_node = "technic:music_player"
|
||||
local demand = 150
|
||||
|
||||
local current_track = meta:get_int("current_track")
|
||||
local pos_hash = minetest.hash_node_position(pos)
|
||||
local music_handle = music_handles[pos_hash]
|
||||
|
||||
-- Setup meta data if it does not exist.
|
||||
if not eu_input then
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
meta:set_int("LV_EU_input", 0)
|
||||
return
|
||||
end
|
||||
|
||||
-- Power off automatically if no longer connected to a switching station
|
||||
technic.switching_station_timeout_count(pos, "LV")
|
||||
|
||||
if meta:get_int("active") == 0 then
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int("LV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < demand then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
if music_handle then
|
||||
minetest.sound_stop(music_handle)
|
||||
music_handle = nil
|
||||
end
|
||||
elseif eu_input >= demand then
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
if not music_handle then
|
||||
music_handle = play_track(pos, current_track)
|
||||
end
|
||||
end
|
||||
music_handles[pos_hash] = music_handle
|
||||
meta:set_int("LV_EU_demand", demand)
|
||||
end
|
||||
on_destruct = stop_player,
|
||||
technic_run = run,
|
||||
technic_on_disable = stop_player,
|
||||
})
|
||||
|
||||
technic.register_machine("LV", "technic:music_player", technic.receiver)
|
||||
|
@ -10,7 +10,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:solar_panel', 'technic:solar_panel', 'technic:solar_panel'},
|
||||
{'technic:carbon_steel_ingot', 'technic:lv_transformer', 'technic:carbon_steel_ingot'},
|
||||
{'', 'technic:lv_cable0', ''},
|
||||
{'', 'technic:lv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -4,16 +4,58 @@
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:solar_panel',
|
||||
recipe = {
|
||||
{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'},
|
||||
{'basic_materials:silver_wire', 'technic:lv_cable', 'mesecons_materials:glue'},
|
||||
},
|
||||
replacements = { {"basic_materials:silver_wire", "basic_materials:empty_spool"}, },
|
||||
})
|
||||
|
||||
|
||||
local run = function(pos, node)
|
||||
-- The action here is to make the solar panel prodice power
|
||||
-- Power is dependent on the light level and the height above ground
|
||||
-- There are many ways to cheat by using other light sources like lamps.
|
||||
-- As there is no way to determine if light is sunlight that is just a shame.
|
||||
-- To take care of some of it solar panels do not work outside daylight hours or if
|
||||
-- built below 0m
|
||||
local pos1 = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local machine_name = S("Small Solar %s Generator"):format("LV")
|
||||
|
||||
local light = minetest.get_node_light(pos1, nil)
|
||||
local time_of_day = minetest.get_timeofday()
|
||||
local meta = minetest.get_meta(pos)
|
||||
if light == nil then light = 0 end
|
||||
-- turn on panel only during day time and if sufficient light
|
||||
-- I know this is counter intuitive when cheating by using other light sources underground.
|
||||
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then
|
||||
local charge_to_give = math.floor((light + pos1.y) * 3)
|
||||
charge_to_give = math.max(charge_to_give, 0)
|
||||
charge_to_give = math.min(charge_to_give, 200)
|
||||
meta:set_string("infotext", S("@1 Active (@2)", machine_name,
|
||||
technic.EU_string(charge_to_give)))
|
||||
meta:set_int("LV_EU_supply", charge_to_give)
|
||||
else
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:solar_panel", {
|
||||
tiles = {"technic_solar_panel_top.png", "technic_solar_panel_bottom.png", "technic_solar_panel_side.png",
|
||||
"technic_solar_panel_side.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png"},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_lv=1},
|
||||
connect_sides = {"bottom"},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
description = S("Small Solar %s Generator"):format("LV"),
|
||||
description = S("Small Solar %s Generator"):format("LV"),
|
||||
active = false,
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
is_ground_content = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
@ -23,51 +65,8 @@ minetest.register_node("technic:solar_panel", {
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
meta:set_string("infotext", S("Small Solar %s Generator"):format("LV"))
|
||||
end,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:solar_panel',
|
||||
recipe = {
|
||||
{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'},
|
||||
{'technic:wrought_iron_ingot', 'technic:lv_cable0', 'technic:wrought_iron_ingot'},
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:solar_panel"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
-- The action here is to make the solar panel prodice power
|
||||
-- Power is dependent on the light level and the height above ground
|
||||
-- 130m and above is optimal as it would be above cloud level.
|
||||
-- Height gives 1/4 of the effect, light 3/4. Max. effect is 26EU.
|
||||
-- There are many ways to cheat by using other light sources like lamps.
|
||||
-- As there is no way to determine if light is sunlight that is just a shame.
|
||||
-- To take care of some of it solar panels do not work outside daylight hours or if
|
||||
-- built below -10m
|
||||
local pos1 = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local machine_name = S("Small Solar %s Generator"):format("LV")
|
||||
|
||||
local light = minetest.get_node_light(pos1, nil)
|
||||
local time_of_day = minetest.get_timeofday()
|
||||
local meta = minetest.get_meta(pos)
|
||||
if light == nil then light = 0 end
|
||||
-- turn on panel only during day time and if sufficient light
|
||||
-- I know this is counter intuitive when cheating by using other light sources underground.
|
||||
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then
|
||||
local charge_to_give = math.floor((light + pos1.y) * 3)
|
||||
charge_to_give = math.max(charge_to_give, 0)
|
||||
charge_to_give = math.min(charge_to_give, 200)
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..charge_to_give.."EU)")
|
||||
meta:set_int("LV_EU_supply", charge_to_give)
|
||||
else
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
technic.register_machine("LV", "technic:solar_panel", technic.producer)
|
||||
|
||||
|
@ -1,34 +1,92 @@
|
||||
-- A water mill produces LV EUs by exploiting flowing water across it
|
||||
-- It is a LV EU supplyer and fairly low yield (max 120EUs)
|
||||
-- It is a little under half as good as the thermal generator.
|
||||
-- It is a LV EU supplier and fairly low yield (max 180EUs)
|
||||
-- It is a little over half as good as the thermal generator.
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local cable_entry = "^technic_cable_connection_overlay.png"
|
||||
|
||||
minetest.register_alias("water_mill", "technic:water_mill")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:water_mill',
|
||||
recipe = {
|
||||
{'default:stone', 'default:stone', 'default:stone'},
|
||||
{'group:wood', 'default:diamond', 'group:wood'},
|
||||
{'default:stone', 'default:copper_ingot', 'default:stone'},
|
||||
{'technic:marble', 'default:diamond', 'technic:marble'},
|
||||
{'group:wood', 'technic:machine_casing', 'group:wood'},
|
||||
{'technic:marble', 'technic:lv_cable', 'technic:marble'},
|
||||
}
|
||||
})
|
||||
|
||||
local function check_node_around_mill(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == "default:water_flowing"
|
||||
or node.name == "default:river_water_flowing" then
|
||||
return node.param2 -- returns approx. water flow, if any
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local water_flow = 0
|
||||
local production_level
|
||||
local eu_supply
|
||||
local max_output = 4 * 45 -- keeping it around 180, little more than previous 150 :)
|
||||
|
||||
local positions = {
|
||||
{x=pos.x+1, y=pos.y, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y, z=pos.z},
|
||||
{x=pos.x, y=pos.y, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y, z=pos.z-1},
|
||||
}
|
||||
|
||||
for _, p in pairs(positions) do
|
||||
local check = check_node_around_mill(p)
|
||||
if check then
|
||||
water_flow = water_flow + check
|
||||
end
|
||||
end
|
||||
|
||||
eu_supply = math.min(4 * water_flow, max_output)
|
||||
production_level = math.floor(100 * eu_supply / max_output)
|
||||
|
||||
meta:set_int("LV_EU_supply", eu_supply)
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Hydro %s Generator"):format("LV").." ("..production_level.."%)")
|
||||
|
||||
if production_level > 0 and
|
||||
minetest.get_node(pos).name == "technic:water_mill" then
|
||||
technic.swap_node (pos, "technic:water_mill_active")
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
return
|
||||
end
|
||||
if production_level == 0 then
|
||||
technic.swap_node(pos, "technic:water_mill")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:water_mill", {
|
||||
description = S("Hydro %s Generator"):format("LV"),
|
||||
tiles = {"technic_water_mill_top.png", "technic_machine_bottom.png",
|
||||
"technic_water_mill_side.png", "technic_water_mill_side.png",
|
||||
"technic_water_mill_side.png", "technic_water_mill_side.png"},
|
||||
tiles = {
|
||||
"technic_water_mill_top.png",
|
||||
"technic_machine_bottom.png"..cable_entry,
|
||||
"technic_water_mill_side.png",
|
||||
"technic_water_mill_side.png",
|
||||
"technic_water_mill_side.png",
|
||||
"technic_water_mill_side.png"
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_lv=1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("Hydro %s Generator"):format("LV"))
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
end,
|
||||
end,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:water_mill_active", {
|
||||
@ -37,68 +95,15 @@ minetest.register_node("technic:water_mill_active", {
|
||||
"technic_water_mill_side.png", "technic_water_mill_side.png",
|
||||
"technic_water_mill_side.png", "technic_water_mill_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_lv=1, not_in_creative_inventory=1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop = "technic:water_mill",
|
||||
technic_run = run,
|
||||
technic_disabled_machine_name = "technic:water_mill",
|
||||
})
|
||||
|
||||
local function check_node_around_mill(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == "default:water_flowing" or
|
||||
node.name == "default:water_source" then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:water_mill", "technic:water_mill_active"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local water_nodes = 0
|
||||
local lava_nodes = 0
|
||||
local production_level = 0
|
||||
local eu_supply = 0
|
||||
|
||||
local positions = {
|
||||
{x=pos.x+1, y=pos.y, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y, z=pos.z},
|
||||
{x=pos.x, y=pos.y, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y, z=pos.z-1},
|
||||
}
|
||||
|
||||
for _, p in pairs(positions) do
|
||||
local check = check_node_around_mill(p)
|
||||
if check then
|
||||
water_nodes = water_nodes + 1
|
||||
end
|
||||
end
|
||||
|
||||
production_level = 25 * water_nodes
|
||||
eu_supply = 30 * water_nodes
|
||||
|
||||
if production_level > 0 then
|
||||
meta:set_int("LV_EU_supply", eu_supply)
|
||||
end
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Hydro %s Generator"):format("LV").." ("..production_level.."%)")
|
||||
|
||||
if production_level > 0 and
|
||||
minetest.get_node(pos).name == "technic:water_mill" then
|
||||
technic.swap_node (pos, "technic:water_mill_active")
|
||||
meta:set_int("LV_EU_supply", 0)
|
||||
return
|
||||
end
|
||||
if production_level == 0 then
|
||||
technic.swap_node(pos, "technic:water_mill")
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
technic.register_machine("LV", "technic:water_mill", technic.producer)
|
||||
technic.register_machine("LV", "technic:water_mill_active", technic.producer)
|
||||
|
||||
|
@ -5,7 +5,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:lv_alloy_furnace', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -5,7 +5,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:lv_battery_box0', 'technic:lv_battery_box0', 'technic:lv_battery_box0'},
|
||||
{'technic:lv_battery_box0', 'technic:mv_transformer', 'technic:lv_battery_box0'},
|
||||
{'', 'technic:mv_cable0', ''},
|
||||
{'', 'technic:mv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
|
||||
minetest.register_alias("mv_cable", "technic:mv_cable0")
|
||||
minetest.register_alias("mv_cable", "technic:mv_cable")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:mv_cable0 3',
|
||||
output = 'technic:mv_cable 3',
|
||||
recipe ={
|
||||
{'technic:rubber', 'technic:rubber', 'technic:rubber'},
|
||||
{'technic:lv_cable0', 'technic:lv_cable0', 'technic:lv_cable0'},
|
||||
{'technic:rubber', 'technic:rubber', 'technic:rubber'},
|
||||
{'technic:rubber', 'technic:rubber', 'technic:rubber'},
|
||||
{'technic:lv_cable', 'technic:lv_cable', 'technic:lv_cable'},
|
||||
{'technic:rubber', 'technic:rubber', 'technic:rubber'},
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
technic.register_cable("MV", 2.5/16)
|
||||
|
||||
|
16
technic/machines/MV/centrifuge.lua
Normal file
@ -0,0 +1,16 @@
|
||||
minetest.register_craft({
|
||||
output = "technic:mv_centrifuge",
|
||||
recipe = {
|
||||
{"basic_materials:motor", "technic:copper_plate", "technic:diamond_drill_head"},
|
||||
{"technic:copper_plate", "technic:machine_casing", "technic:copper_plate" },
|
||||
{"pipeworks:one_way_tube", "technic:mv_cable", "pipeworks:mese_filter" },
|
||||
}
|
||||
})
|
||||
|
||||
technic.register_centrifuge({
|
||||
tier = "MV",
|
||||
demand = { 8000, 7000, 6000 },
|
||||
speed = 2,
|
||||
upgrade = 1,
|
||||
tube = 1,
|
||||
})
|
@ -5,7 +5,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:lv_compressor', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -9,8 +9,8 @@ minetest.register_craft({
|
||||
output = 'technic:mv_electric_furnace',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:lv_electric_furnace', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -5,7 +5,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:lv_extractor', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
|
12
technic/machines/MV/freezer.lua
Normal file
@ -0,0 +1,12 @@
|
||||
-- MV freezer
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:mv_freezer',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:pipe_1_empty', 'technic:mv_transformer', 'pipeworks:pipe_1_empty'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
technic.register_freezer({tier = "MV", demand = {800, 600, 400}, speed = 0.5, upgrade = 1, tube = 1})
|
@ -4,7 +4,7 @@ minetest.register_craft({
|
||||
output = 'technic:mv_generator',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:lv_generator', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
@ -4,8 +4,8 @@ minetest.register_craft({
|
||||
output = 'technic:mv_grinder',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:lv_grinder', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
|
||||
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
|
105
technic/machines/MV/hydro_turbine.lua
Normal file
@ -0,0 +1,105 @@
|
||||
-- A Hydro Turbine produces MV EUs by exploiting flowing water across it
|
||||
-- It is a MV EU supplier and fairly high yield (max 1800EUs)
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local cable_entry = "^technic_cable_connection_overlay.png"
|
||||
|
||||
minetest.register_alias("hydro_turbine", "technic:hydro_turbine")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:hydro_turbine',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:water_mill', 'technic:stainless_steel_ingot'},
|
||||
{'technic:water_mill', 'technic:mv_transformer', 'technic:water_mill'},
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
|
||||
}
|
||||
})
|
||||
|
||||
local function get_water_flow(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if minetest.get_item_group(node.name, "water") == 3 and string.find(node.name, "flowing") then
|
||||
return node.param2 -- returns approx. water flow, if any
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
---
|
||||
-- 10 times better than LV hydro because of 2 extra water mills and 4 stainless steel, a transformer and whatnot ;P.
|
||||
-- Man hydro turbines are tough and long lasting. So, give it some value :)
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local water_flow = 0
|
||||
local production_level
|
||||
local eu_supply
|
||||
local max_output = 40 * 45 -- Generates 1800EU/s
|
||||
|
||||
local positions = {
|
||||
{x=pos.x+1, y=pos.y, z=pos.z},
|
||||
{x=pos.x-1, y=pos.y, z=pos.z},
|
||||
{x=pos.x, y=pos.y, z=pos.z+1},
|
||||
{x=pos.x, y=pos.y, z=pos.z-1},
|
||||
}
|
||||
|
||||
for _, p in pairs(positions) do
|
||||
water_flow = water_flow + get_water_flow(p)
|
||||
end
|
||||
|
||||
eu_supply = math.min(40 * water_flow, max_output)
|
||||
production_level = math.floor(100 * eu_supply / max_output)
|
||||
|
||||
meta:set_int("MV_EU_supply", eu_supply)
|
||||
|
||||
meta:set_string("infotext",
|
||||
S("Hydro %s Generator"):format("MV").." ("..production_level.."%)")
|
||||
if production_level > 0 and
|
||||
minetest.get_node(pos).name == "technic:hydro_turbine" then
|
||||
technic.swap_node(pos, "technic:hydro_turbine_active")
|
||||
meta:set_int("MV_EU_supply", 0)
|
||||
return
|
||||
end
|
||||
if production_level == 0 then
|
||||
technic.swap_node(pos, "technic:hydro_turbine")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:hydro_turbine", {
|
||||
description = S("Hydro %s Generator"):format("MV"),
|
||||
tiles = {
|
||||
"technic_hydro_turbine_top.png",
|
||||
"technic_machine_bottom.png"..cable_entry,
|
||||
"technic_hydro_turbine_side.png",
|
||||
"technic_hydro_turbine_side.png",
|
||||
"technic_hydro_turbine_side.png",
|
||||
"technic_hydro_turbine_side.png"
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_mv=1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("Hydro %s Generator"):format("MV"))
|
||||
meta:set_int("MV_EU_supply", 0)
|
||||
end,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:hydro_turbine_active", {
|
||||
description = S("Hydro %s Generator"):format("MV"),
|
||||
tiles = {"technic_hydro_turbine_top_active.png", "technic_machine_bottom.png",
|
||||
"technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png",
|
||||
"technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_mv=1, not_in_creative_inventory=1},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop = "technic:hydro_turbine",
|
||||
technic_run = run,
|
||||
technic_disabled_machine_name = "technic:hydro_turbine",
|
||||
})
|
||||
|
||||
technic.register_machine("MV", "technic:hydro_turbine", technic.producer)
|
||||
technic.register_machine("MV", "technic:hydro_turbine_active", technic.producer)
|
@ -13,6 +13,7 @@ if technic.config:get_bool("enable_wind_mill") then
|
||||
end
|
||||
dofile(path.."/generator.lua")
|
||||
dofile(path.."/solar_array.lua")
|
||||
dofile(path.."/hydro_turbine.lua")
|
||||
|
||||
-- Machines
|
||||
dofile(path.."/alloy_furnace.lua")
|
||||
@ -20,9 +21,12 @@ dofile(path.."/electric_furnace.lua")
|
||||
dofile(path.."/grinder.lua")
|
||||
dofile(path.."/extractor.lua")
|
||||
dofile(path.."/compressor.lua")
|
||||
dofile(path.."/centrifuge.lua")
|
||||
|
||||
dofile(path.."/tool_workshop.lua")
|
||||
|
||||
dofile(path.."/freezer.lua")
|
||||
|
||||
-- The power radiator supplies appliances with inductive coupled power:
|
||||
-- Lighting and associated textures is taken directly from VanessaE's homedecor and made electric.
|
||||
-- This is currently useless, slow, and mostly copied
|
||||
|
@ -14,20 +14,7 @@ end
|
||||
|
||||
function technic_homedecor_node_is_owned(pos, placer)
|
||||
local ownername = false
|
||||
if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod
|
||||
if HasOwner(pos, placer) then
|
||||
if not IsPlayerNodeOwner(pos, placer:get_player_name()) then
|
||||
if type(getLastOwner) == "function" then -- ...is an old version
|
||||
ownername = getLastOwner(pos)
|
||||
elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version
|
||||
ownername = GetNodeOwnerName(pos)
|
||||
else
|
||||
ownername = S("someone")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
elseif type(isprotect) == "function" then -- glomie's protection mod
|
||||
if type(isprotect) == "function" then -- glomie's protection mod
|
||||
if not isprotect(5, pos, placer) then
|
||||
ownername = S("someone")
|
||||
end
|
||||
@ -45,11 +32,10 @@ function technic_homedecor_node_is_owned(pos, placer)
|
||||
end
|
||||
end
|
||||
|
||||
local dirs1 = {20, 23, 22, 21}
|
||||
local dirs2 = {9, 18, 7, 12}
|
||||
|
||||
local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_thing)
|
||||
if not technic_homedecor_node_is_owned(pointed_thing.under, placer)
|
||||
if not technic_homedecor_node_is_owned(pointed_thing.under, placer)
|
||||
and not technic_homedecor_node_is_owned(pointed_thing.above, placer) then
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].on_rightclick then
|
||||
@ -58,7 +44,6 @@ local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_t
|
||||
local under = pointed_thing.under
|
||||
local pitch = placer:get_look_pitch()
|
||||
local pname = minetest.get_node(under).name
|
||||
local node = minetest.get_node(above)
|
||||
local fdir = minetest.dir_to_facedir(placer:get_look_dir())
|
||||
local wield_name = itemstack:get_name()
|
||||
|
||||
@ -76,7 +61,7 @@ local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_t
|
||||
|
||||
if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end
|
||||
|
||||
if iswall then
|
||||
if iswall then
|
||||
minetest.add_node(pos1, {name = wield_name, param2 = dirs2[fdir+1] }) -- place wall variant
|
||||
elseif isceiling then
|
||||
minetest.add_node(pos1, {name = wield_name, param2 = 20 }) -- place upside down variant
|
||||
@ -159,7 +144,7 @@ minetest.register_node('technic:homedecor_glowlight_half_yellow_active', {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX,
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
|
||||
groups = { snappy = 3, not_in_creative_inventory=1},
|
||||
@ -240,7 +225,7 @@ minetest.register_node('technic:homedecor_glowlight_quarter_yellow_active', {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX-1,
|
||||
light_source = minetest.LIGHT_MAX-1,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
|
||||
groups = { snappy = 3, not_in_creative_inventory=1},
|
||||
@ -322,7 +307,7 @@ minetest.register_node('technic:homedecor_glowlight_half_white_active', {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX,
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
|
||||
groups = { snappy = 3, not_in_creative_inventory=1},
|
||||
@ -403,7 +388,7 @@ minetest.register_node('technic:homedecor_glowlight_quarter_white_active', {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX-1,
|
||||
light_source = minetest.LIGHT_MAX-1,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
|
||||
groups = { snappy = 3, not_in_creative_inventory=1},
|
||||
@ -484,7 +469,7 @@ minetest.register_node('technic:homedecor_glowlight_small_cube_yellow_active', {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX-1,
|
||||
light_source = minetest.LIGHT_MAX-1,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
|
||||
groups = { snappy = 3, not_in_creative_inventory=1},
|
||||
@ -565,7 +550,7 @@ minetest.register_node('technic:homedecor_glowlight_small_cube_white_active', {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX-1,
|
||||
light_source = minetest.LIGHT_MAX-1,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
|
||||
groups = { snappy = 3, not_in_creative_inventory=1},
|
||||
|
@ -12,6 +12,16 @@
|
||||
|
||||
local power_radius = 12
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:power_radiator 1',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:mv_transformer', 'technic:stainless_steel_ingot'},
|
||||
{'technic:copper_coil', 'technic:machine_casing', 'technic:copper_coil'},
|
||||
{'technic:rubber', 'technic:mv_cable', 'technic:rubber'},
|
||||
}
|
||||
})
|
||||
|
||||
------------------------------------------------------------------
|
||||
-- API for inductive powered nodes:
|
||||
-- Use the functions below to set the corresponding callbacks
|
||||
@ -26,7 +36,8 @@ technic.register_inductive_machine = function(name)
|
||||
end
|
||||
|
||||
-- Appliances:
|
||||
-- has_supply: pos of supply node if the appliance has a power radiator near with sufficient power for the demand else ""
|
||||
-- has_supply: pos of supply node if the appliance has a power radiator near
|
||||
-- with sufficient power for the demand else ""
|
||||
-- EU_demand: The power demand of the device.
|
||||
-- EU_charge: Actual use. set to EU_demand if active==1
|
||||
-- active: set to 1 if the device is on
|
||||
@ -135,21 +146,13 @@ minetest.register_node("technic:power_radiator", {
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:power_radiator 1',
|
||||
recipe = {
|
||||
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
|
||||
{'technic:copper_coil', 'technic:mv_transformer', 'technic:copper_coil'},
|
||||
{'technic:rubber', 'technic:mv_cable0', 'technic:rubber'},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
label = "Machines: run power radiator",
|
||||
nodenames = {"technic:power_radiator"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int("MV_EU_input")
|
||||
local eu_demand = meta:get_int("MV_EU_demand")
|
||||
|
||||
@ -175,8 +178,6 @@ minetest.register_abm({
|
||||
-- The supply radius
|
||||
local rad = power_radius
|
||||
|
||||
local meta1 = nil
|
||||
local pos1 = {}
|
||||
local used_charge = 0
|
||||
|
||||
-- Index all nodes within supply range
|
||||
|
@ -4,7 +4,7 @@ minetest.register_craft({
|
||||
recipe = {
|
||||
{'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'},
|
||||
{'technic:carbon_steel_ingot', 'technic:mv_transformer', 'technic:carbon_steel_ingot'},
|
||||
{'', 'technic:mv_cable0', ''},
|
||||
{'', 'technic:mv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -5,26 +5,96 @@ minetest.register_alias("tool_workshop", "technic:tool_workshop")
|
||||
|
||||
local S = technic.getter
|
||||
|
||||
local tube_entry = "^pipeworks_tube_connection_wooden.png"
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'technic:tool_workshop',
|
||||
recipe = {
|
||||
{'group:wood', 'group:wood', 'group:wood'},
|
||||
{'group:wood', 'default:diamond', 'group:wood'},
|
||||
{'default:stone', 'default:copper_ingot', 'default:stone'},
|
||||
{'group:wood', 'default:diamond', 'group:wood'},
|
||||
{'mesecons_pistons:piston_sticky_off', 'technic:machine_casing', 'technic:carbon_cloth'},
|
||||
{'default:obsidian', 'technic:mv_cable', 'default:obsidian'},
|
||||
}
|
||||
})
|
||||
|
||||
local workshop_demand = {5000, 3500, 2000}
|
||||
|
||||
local workshop_formspec =
|
||||
"invsize[8,9;]"..
|
||||
"size[8,9;]"..
|
||||
"list[current_name;src;3,1;1,1;]"..
|
||||
"label[0,0;"..S("%s Tool Workshop"):format("MV").."]"..
|
||||
"list[current_player;main;0,5;8,4;]"
|
||||
"list[current_name;upgrade1;1,3;1,1;]"..
|
||||
"list[current_name;upgrade2;2,3;1,1;]"..
|
||||
"label[1,4;"..S("Upgrade Slots").."]"..
|
||||
"list[current_player;main;0,5;8,4;]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;src]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;upgrade1]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;upgrade2]"..
|
||||
"listring[current_player;main]"
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local eu_input = meta:get_int("MV_EU_input")
|
||||
local machine_name = S("%s Tool Workshop"):format("MV")
|
||||
|
||||
-- Setup meta data if it does not exist.
|
||||
if not eu_input then
|
||||
meta:set_int("MV_EU_demand", workshop_demand[1])
|
||||
meta:set_int("MV_EU_input", 0)
|
||||
return
|
||||
end
|
||||
|
||||
local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
|
||||
|
||||
local repairable = false
|
||||
local srcstack = inv:get_stack("src", 1)
|
||||
if not srcstack:is_empty() then
|
||||
local itemdef = minetest.registered_items[srcstack:get_name()]
|
||||
if itemdef and
|
||||
(not itemdef.wear_represents or
|
||||
itemdef.wear_represents == "mechanical_wear") and
|
||||
srcstack:get_wear() ~= 0 then
|
||||
repairable = true
|
||||
end
|
||||
end
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade, function (pos, x_velocity, z_velocity)
|
||||
if not repairable then
|
||||
technic.send_items(pos, x_velocity, z_velocity, "src")
|
||||
end
|
||||
end)
|
||||
if not repairable then
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int("MV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < workshop_demand[EU_upgrade+1] then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
elseif eu_input >= workshop_demand[EU_upgrade+1] then
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
srcstack:add_wear(-1000)
|
||||
inv:set_stack("src", 1, srcstack)
|
||||
end
|
||||
meta:set_int("MV_EU_demand", workshop_demand[EU_upgrade+1])
|
||||
end
|
||||
|
||||
minetest.register_node("technic:tool_workshop", {
|
||||
description = S("%s Tool Workshop"):format("MV"),
|
||||
tiles = {"technic_workshop_top.png", "technic_machine_bottom.png", "technic_workshop_side.png",
|
||||
"technic_workshop_side.png", "technic_workshop_side.png", "technic_workshop_side.png"},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
paramtype2 = "facedir",
|
||||
tiles = {
|
||||
"technic_workshop_top.png"..tube_entry,
|
||||
"technic_machine_bottom.png"..tube_entry,
|
||||
"technic_workshop_side.png"..tube_entry,
|
||||
"technic_workshop_side.png"..tube_entry,
|
||||
"technic_workshop_side.png"..tube_entry,
|
||||
"technic_workshop_side.png"
|
||||
},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||
technic_machine=1, technic_mv=1, tubedevice=1, tubedevice_receiver=1},
|
||||
connect_sides = {"bottom", "back", "left", "right"},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -32,61 +102,25 @@ minetest.register_node("technic:tool_workshop", {
|
||||
meta:set_string("formspec", workshop_formspec)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("src", 1)
|
||||
end,
|
||||
inv:set_size("upgrade1", 1)
|
||||
inv:set_size("upgrade2", 1)
|
||||
end,
|
||||
can_dig = technic.machine_can_dig,
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
tube = {
|
||||
can_insert = function (pos, node, stack, direction)
|
||||
return minetest.get_meta(pos):get_inventory():room_for_item("src", stack)
|
||||
end,
|
||||
insert_object = function (pos, node, stack, direction)
|
||||
return minetest.get_meta(pos):get_inventory():add_item("src", stack)
|
||||
end,
|
||||
connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
|
||||
},
|
||||
technic_run = run,
|
||||
after_place_node = pipeworks.after_place,
|
||||
after_dig_node = technic.machine_after_dig_node
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:tool_workshop"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local eu_input = meta:get_int("MV_EU_input")
|
||||
local machine_name = S("%s Tool Workshop"):format("MV")
|
||||
local machine_node = "technic:tool_workshop"
|
||||
local demand = 5000
|
||||
|
||||
-- Setup meta data if it does not exist.
|
||||
if not eu_input then
|
||||
meta:set_int("MV_EU_demand", demand)
|
||||
meta:set_int("MV_EU_input", 0)
|
||||
return
|
||||
end
|
||||
|
||||
-- Power off automatically if no longer connected to a switching station
|
||||
technic.switching_station_timeout_count(pos, "MV")
|
||||
|
||||
local repairable = false
|
||||
local srcstack = inv:get_stack("src", 1)
|
||||
if not srcstack:is_empty() then
|
||||
local itemdef = minetest.registered_items[srcstack:get_name()]
|
||||
if itemdef and
|
||||
(not itemdef.wear_represents or
|
||||
itemdef.wear_represents == "mechanical_wear") and
|
||||
srcstack:get_wear() ~= 0 then
|
||||
repairable = true
|
||||
end
|
||||
end
|
||||
if not repairable then
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int("MV_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < demand then
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
|
||||
elseif eu_input >= demand then
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name))
|
||||
srcstack:add_wear(-1000)
|
||||
inv:set_stack("src", 1, srcstack)
|
||||
end
|
||||
meta:set_int("MV_EU_demand", demand)
|
||||
end
|
||||
})
|
||||
|
||||
technic.register_machine("MV", "technic:tool_workshop", technic.receiver)
|
||||
|
||||
|
@ -13,9 +13,9 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
output = 'technic:wind_mill',
|
||||
recipe = {
|
||||
{'', 'technic:carbon_steel_ingot', ''},
|
||||
{'technic:carbon_steel_ingot', 'technic:motor', 'technic:carbon_steel_ingot'},
|
||||
{'', 'technic:carbon_steel_block', ''},
|
||||
{'', 'basic_materials:motor', ''},
|
||||
{'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'},
|
||||
{'', 'technic:mv_cable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
@ -29,11 +29,49 @@ minetest.register_node("technic:wind_mill_frame", {
|
||||
paramtype = "light",
|
||||
})
|
||||
|
||||
local function check_wind_mill(pos)
|
||||
if pos.y < 30 then
|
||||
return false
|
||||
end
|
||||
pos = {x=pos.x, y=pos.y, z=pos.z}
|
||||
for i = 1, 20 do
|
||||
pos.y = pos.y - 1
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
if not node then
|
||||
-- we reached CONTENT_IGNORE, we can assume, that nothing changed
|
||||
-- as the user will have to load the block to change it
|
||||
return
|
||||
end
|
||||
if node.name ~= "technic:wind_mill_frame" then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local machine_name = S("Wind %s Generator"):format("MV")
|
||||
|
||||
local check = check_wind_mill(pos)
|
||||
if check == false then
|
||||
meta:set_int("MV_EU_supply", 0)
|
||||
meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name))
|
||||
elseif check == true then
|
||||
local power = math.min(pos.y * 100, 5000)
|
||||
meta:set_int("MV_EU_supply", power)
|
||||
meta:set_string("infotext", S("@1 (@2)", machine_name,
|
||||
technic.EU_string(power)))
|
||||
end
|
||||
-- check == nil: assume nothing has changed
|
||||
end
|
||||
|
||||
minetest.register_node("technic:wind_mill", {
|
||||
description = S("Wind %s Generator"):format("MV"),
|
||||
tiles = {"technic_carbon_steel_block.png"},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=1},
|
||||
groups = {cracky=1, technic_machine=1, technic_mv=1},
|
||||
connect_sides = {"top", "bottom", "back", "left", "right"},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
@ -50,41 +88,8 @@ minetest.register_node("technic:wind_mill", {
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotext", S("Wind %s Generator"):format("MV"))
|
||||
meta:set_int("MV_EU_supply", 0)
|
||||
end,
|
||||
})
|
||||
|
||||
local function check_wind_mill(pos)
|
||||
if pos.y < 30 then
|
||||
return false
|
||||
end
|
||||
for i = 1, 20 do
|
||||
local node = minetest.get_node({x=pos.x, y=pos.y-i, z=pos.z})
|
||||
if node.name ~= "technic:wind_mill_frame" then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:wind_mill"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local machine_name = S("Wind %s Generator"):format("MV")
|
||||
local power = math.min(pos.y * 100, 5000)
|
||||
|
||||
if not check_wind_mill(pos) then
|
||||
meta:set_int("MV_EU_supply", 0)
|
||||
meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name))
|
||||
return
|
||||
else
|
||||
meta:set_int("MV_EU_supply", power)
|
||||
end
|
||||
|
||||
meta:set_string("infotext", machine_name.." ("..power.."EU)")
|
||||
end
|
||||
end,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
technic.register_machine("MV", "technic:wind_mill", technic.producer)
|
||||
|
@ -8,6 +8,7 @@ dofile(path.."/MV/init.lua")
|
||||
dofile(path.."/HV/init.lua")
|
||||
|
||||
dofile(path.."/switching_station.lua")
|
||||
dofile(path.."/power_monitor.lua")
|
||||
dofile(path.."/supply_converter.lua")
|
||||
|
||||
dofile(path.."/other/init.lua")
|
||||
|
117
technic/machines/other/anchor.lua
Normal file
@ -0,0 +1,117 @@
|
||||
local S = technic.getter
|
||||
|
||||
local desc = S("Administrative World Anchor")
|
||||
|
||||
local function compute_forceload_positions(pos, meta)
|
||||
local radius = meta:get_int("radius")
|
||||
local minpos = vector.subtract(pos, vector.new(radius, radius, radius))
|
||||
local maxpos = vector.add(pos, vector.new(radius, radius, radius))
|
||||
local minbpos = {}
|
||||
local maxbpos = {}
|
||||
for _, coord in ipairs({"x","y","z"}) do
|
||||
minbpos[coord] = math.floor(minpos[coord] / 16) * 16
|
||||
maxbpos[coord] = math.floor(maxpos[coord] / 16) * 16
|
||||
end
|
||||
local flposes = {}
|
||||
for x = minbpos.x, maxbpos.x, 16 do
|
||||
for y = minbpos.y, maxbpos.y, 16 do
|
||||
for z = minbpos.z, maxbpos.z, 16 do
|
||||
table.insert(flposes, vector.new(x, y, z))
|
||||
end
|
||||
end
|
||||
end
|
||||
return flposes
|
||||
end
|
||||
|
||||
local function currently_forceloaded_positions(meta)
|
||||
local ser = meta:get_string("forceloaded")
|
||||
return ser == "" and {} or minetest.deserialize(ser)
|
||||
end
|
||||
|
||||
local function forceload_off(meta)
|
||||
local flposes = currently_forceloaded_positions(meta)
|
||||
meta:set_string("forceloaded", "")
|
||||
for _, p in ipairs(flposes) do
|
||||
minetest.forceload_free_block(p)
|
||||
end
|
||||
end
|
||||
|
||||
local function forceload_on(pos, meta)
|
||||
local want_flposes = compute_forceload_positions(pos, meta)
|
||||
local have_flposes = {}
|
||||
for _, p in ipairs(want_flposes) do
|
||||
if minetest.forceload_block(p) then
|
||||
table.insert(have_flposes, p)
|
||||
end
|
||||
end
|
||||
meta:set_string("forceloaded", #have_flposes == 0 and "" or minetest.serialize(have_flposes))
|
||||
end
|
||||
|
||||
local function set_display(pos, meta)
|
||||
local ESC = minetest.formspec_escape
|
||||
meta:set_string("infotext", S(meta:get_int("enabled") ~= 0 and "%s Enabled" or "%s Disabled"):format(desc))
|
||||
meta:set_string("formspec",
|
||||
"size[5,3.5]"..
|
||||
"item_image[0,0;1,1;technic:admin_anchor]"..
|
||||
"label[1,0;"..ESC(desc).."]"..
|
||||
"label[0,1;"..ESC(S("Owner:").." "..meta:get_string("owner")).."]"..
|
||||
(meta:get_int("locked") == 0 and
|
||||
"button[3,1;2,1;lock;"..ESC(S("Unlocked")).."]" or
|
||||
"button[3,1;2,1;unlock;"..ESC(S("Locked")).."]")..
|
||||
"field[0.25,2.3;1,1;radius;"..ESC(S("Radius:"))..";"..meta:get_int("radius").."]"..
|
||||
(meta:get_int("enabled") == 0 and
|
||||
"button[3,2;2,1;enable;"..ESC(S("Disabled")).."]" or
|
||||
"button[3,2;2,1;disable;"..ESC(S("Enabled")).."]")..
|
||||
"label[0,3;"..ESC(S("Keeping %d/%d map blocks loaded"):format(
|
||||
#currently_forceloaded_positions(meta), #compute_forceload_positions(pos, meta)
|
||||
)).."]")
|
||||
end
|
||||
|
||||
minetest.register_node("technic:admin_anchor", {
|
||||
description = desc,
|
||||
drawtype = "normal",
|
||||
tiles = {"technic_admin_anchor.png"},
|
||||
is_ground_content = true,
|
||||
groups = {cracky=3, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
after_place_node = function (pos, placer)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if placer and placer:is_player() then
|
||||
meta:set_string("owner", placer:get_player_name())
|
||||
end
|
||||
set_display(pos, meta)
|
||||
end,
|
||||
can_dig = function (pos, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
return meta:get_int("locked") == 0 or
|
||||
(player and player:is_player() and player:get_player_name() == meta:get_string("owner"))
|
||||
end,
|
||||
on_destruct = function (pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
forceload_off(meta)
|
||||
end,
|
||||
on_receive_fields = function (pos, formname, fields, sender)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if (meta:get_int("locked") ~= 0 or fields.lock) and
|
||||
not (sender and sender:is_player() and
|
||||
sender:get_player_name() == meta:get_string("owner")) then
|
||||
return
|
||||
end
|
||||
if fields.unlock then meta:set_int("locked", 0) end
|
||||
if fields.lock then meta:set_int("locked", 1) end
|
||||
if fields.disable or fields.enable or fields.radius then
|
||||
forceload_off(meta)
|
||||
if fields.disable then meta:set_int("enabled", 0) end
|
||||
if fields.enable then meta:set_int("enabled", 1) end
|
||||
if fields.radius
|
||||
and string.find(fields.radius, "^[0-9]+$")
|
||||
and tonumber(fields.radius) < 256 then
|
||||
meta:set_int("radius", fields.radius)
|
||||
end
|
||||
if meta:get_int("enabled") ~= 0 then
|
||||
forceload_on(pos, meta)
|
||||
end
|
||||
end
|
||||
set_display(pos, meta)
|
||||
end,
|
||||
})
|