forked from VoxeLibre/VoxeLibre
Compare commits
219 Commits
hardcore_m
...
master
Author | SHA1 | Date |
---|---|---|
|
d83c6fe906 | |
|
e7c6043f06 | |
|
65b1fd163b | |
|
eff0a546e5 | |
|
61ee14b1a6 | |
|
968f6ae963 | |
|
2e2bbf0b17 | |
|
8060b02cbd | |
|
693d40b6c4 | |
|
ecfbb1ae07 | |
|
14e630a1e2 | |
|
62afbb4509 | |
|
f02764bc08 | |
|
aa1a928898 | |
|
45952a6fd6 | |
|
33bbeb1a4d | |
|
d3253ecf4f | |
|
0abda8ff20 | |
|
9bb3d8311b | |
|
686bb38546 | |
|
c4f6944a03 | |
|
c1647a5cce | |
|
624c853cb3 | |
|
e8641c3c20 | |
|
f39cec2442 | |
|
e99a46b52d | |
|
cd1c8bd92e | |
|
3830171347 | |
|
48b16a23b6 | |
|
0a9be4b79c | |
|
540319d948 | |
|
fbb2923a0b | |
|
b2e0b9b08b | |
|
4d61e32021 | |
|
7c602ce82c | |
|
ae92c51155 | |
|
db7f4699eb | |
|
b23fc6d23d | |
|
68e6965dd0 | |
|
7d642c9929 | |
|
406b27852b | |
|
d00f183456 | |
|
b121d0f804 | |
|
8f8385e4a1 | |
|
17fc7a3256 | |
|
c08153fa7f | |
|
ba708010a2 | |
|
6601ecf788 | |
|
660c85dddc | |
|
2d0b4dd8f7 | |
|
10d9eb2980 | |
|
3d9df5c797 | |
|
8cc90b6714 | |
|
db4ff13aeb | |
|
f919f73c24 | |
|
319beb91ce | |
|
bea9bbe212 | |
|
8fd40eaf46 | |
|
fcaa2c4ce1 | |
|
55478f6953 | |
|
57882ae56a | |
|
fee4ccf096 | |
|
f653f47f26 | |
|
7b7e213925 | |
|
cf829b6481 | |
|
f62546a54f | |
|
7b6d946d7b | |
|
1da272a941 | |
|
e3f14a3a99 | |
|
a9a61a034c | |
|
6f98ba5118 | |
|
f6f812257e | |
|
f05e976d18 | |
|
5533ec7bac | |
|
b66e2a117f | |
|
09ef5fd96b | |
|
1e61fc3069 | |
|
ef30646788 | |
|
70e4aaa3a7 | |
|
8bfa55fa7a | |
|
2ba6a60e55 | |
|
aeddb7675f | |
|
2ccfd89379 | |
|
3a24903a01 | |
|
abdd5e11c0 | |
|
e17fab385b | |
|
17cae6896e | |
|
1c84bc6572 | |
|
4d29fab932 | |
|
a2087b19a5 | |
|
84119d8f34 | |
|
5da6c25ccf | |
|
b79f74c390 | |
|
06f47a0756 | |
|
ff79af26e4 | |
|
de56c72e15 | |
|
e3c8d995b5 | |
|
b8b45210e9 | |
|
a1f10205f6 | |
|
6f7505b6c6 | |
|
e323ab6e88 | |
|
c88f0047c1 | |
|
0400d9a2a5 | |
|
3590ff6dfb | |
|
d1ceacf7ba | |
|
a70a6ef13d | |
|
b4e84dadb0 | |
|
194ff53400 | |
|
e7e0b082c4 | |
|
18b888da8b | |
|
15a15158b8 | |
|
9445e10834 | |
|
35a75491f4 | |
|
81dbdaab94 | |
|
2fd7f8c69f | |
|
6a34a30941 | |
|
d4c2802afb | |
|
b2dbf48e92 | |
|
bf50a17f2e | |
|
b817c079ba | |
|
cfa276f722 | |
|
86b1d8bc3e | |
|
9c2f43a242 | |
|
044a91e831 | |
|
106979e64a | |
|
4482068211 | |
|
1dc7cab6be | |
|
634379dfe9 | |
|
c2ac33ac61 | |
|
b5c0830060 | |
|
c43c723e08 | |
|
bd3a4ff0df | |
|
0267ad2f31 | |
|
a2f9ea81cc | |
|
7c7f4b930c | |
|
60529d3d5d | |
|
6ea4b43249 | |
|
1fb300ef18 | |
|
b789845f62 | |
|
f368fb3e43 | |
|
d63ecac7cb | |
|
7fbc84971e | |
|
953044cc4b | |
|
6744967d02 | |
|
fdb2333493 | |
|
1defd03408 | |
|
d163faeb42 | |
|
197d3ae00b | |
|
6b8226dae3 | |
|
f6b77aa458 | |
|
1558c852d8 | |
|
6c0525f00e | |
|
3c13ce1d6b | |
|
c1d5d4280e | |
|
70fb4f8a0d | |
|
620a0af483 | |
|
428b1b2c12 | |
|
4ddab8bdf1 | |
|
bfe4b2fd31 | |
|
cc8675602a | |
|
aff1d5f667 | |
|
169019096e | |
|
049db13b28 | |
|
dfbee5cb93 | |
|
378af531a9 | |
|
088cda4f1c | |
|
71671f8b5f | |
|
c4d60e50cc | |
|
9421c7ca6b | |
|
d9982e20d2 | |
|
30bb1ab075 | |
|
b834e790a7 | |
|
39d4434df1 | |
|
4b9482cb09 | |
|
4757e62968 | |
|
b95ebb3fca | |
|
07f332f0cd | |
|
f4e8088e60 | |
|
198375a18e | |
|
c26cddeafc | |
|
714d159072 | |
|
bdc82b76b5 | |
|
6f67f0e095 | |
|
d5687716a0 | |
|
5f0d91cf26 | |
|
e2de5908c7 | |
|
439c879508 | |
|
67977b0d26 | |
|
ed8c3e7d26 | |
|
7add59992f | |
|
d72a674097 | |
|
ef4e4b1b7b | |
|
0e000e6491 | |
|
ec7a97ba3e | |
|
290680fb3d | |
|
48eb934d64 | |
|
88cf3a5900 | |
|
1401652015 | |
|
cac6e15736 | |
|
156d096a78 | |
|
db3483a6cb | |
|
ace6f8db43 | |
|
9aeafe6053 | |
|
de00b7228e | |
|
46ca650ea4 | |
|
c4e4a8e4d2 | |
|
08610296fc | |
|
50effaa807 | |
|
618313f0af | |
|
a3bc3fd9b9 | |
|
c370f1884b | |
|
b771f314fe | |
|
4b0b3217e2 | |
|
5b1c7f2d3a | |
|
425cf53194 | |
|
d04f162d8f | |
|
319602508d | |
|
8c703f1352 | |
|
95b1429922 |
1
API.md
1
API.md
|
@ -41,6 +41,7 @@ A lot of things are possible by using one of the APIs in the mods. Note that not
|
||||||
* Beds: `ITEMS/mcl_beds`
|
* Beds: `ITEMS/mcl_beds`
|
||||||
* Buckets: `ITEMS/mcl_buckets`
|
* Buckets: `ITEMS/mcl_buckets`
|
||||||
* Dispenser support: `ITEMS/REDSTONE/mcl_dispensers`
|
* Dispenser support: `ITEMS/REDSTONE/mcl_dispensers`
|
||||||
|
* Campfires: `ITEMS/mcl_campfires`
|
||||||
|
|
||||||
### Mobs
|
### Mobs
|
||||||
* Mobs: `ENTITIES/mcl_mobs`
|
* Mobs: `ENTITIES/mcl_mobs`
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
So you want to contribute to MineClone2?
|
So you want to contribute to MineClone2?
|
||||||
Wow, thank you! :-)
|
Wow, thank you! :-)
|
||||||
|
|
||||||
MineClone2 is maintained by Nicu and Cora. If you have any
|
MineClone2 is maintained by AncientMariner and Nicu. If you have any
|
||||||
problems or questions, contact us (See Links section below).
|
problems or questions, contact us on Discord/Matrix (See Links section below).
|
||||||
|
|
||||||
You can help with MineClone2's development in many different ways,
|
You can help with MineClone2's development in many different ways,
|
||||||
whether you're a programmer or not.
|
whether you're a programmer or not.
|
||||||
|
@ -240,7 +240,7 @@ work causes problems, we ask you fix the issues as soon as possible.
|
||||||
|
|
||||||
### Changing Gameplay
|
### Changing Gameplay
|
||||||
Pull Requests that change gameplay have to be properly researched and
|
Pull Requests that change gameplay have to be properly researched and
|
||||||
need to state their sources. These PRs also need Fleckenstein's approval
|
need to state their sources. These PRs also need the maintainer's approval
|
||||||
before they are merged.
|
before they are merged.
|
||||||
You can use these sources:
|
You can use these sources:
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ merged.
|
||||||
- Resolving conflicts and problems within the community
|
- Resolving conflicts and problems within the community
|
||||||
|
|
||||||
#### Current maintainers
|
#### Current maintainers
|
||||||
* Cora - responsible for gameplay review, publishing releases,
|
* AncientMariner - responsible for gameplay review, publishing releases,
|
||||||
technical guidelines
|
technical guidelines
|
||||||
* Nicu - responsible for community related issues
|
* Nicu - responsible for community related issues
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,10 @@
|
||||||
* Gregor Parzefall
|
* Gregor Parzefall
|
||||||
* Wbjitscool
|
* Wbjitscool
|
||||||
* b3nderman
|
* b3nderman
|
||||||
|
* CyberMango
|
||||||
|
* gldrk
|
||||||
|
* SmokeyDope
|
||||||
|
* atomdmac
|
||||||
|
|
||||||
## MineClone5
|
## MineClone5
|
||||||
* kay27
|
* kay27
|
||||||
|
@ -186,6 +190,7 @@
|
||||||
* snowyu
|
* snowyu
|
||||||
* 3raven
|
* 3raven
|
||||||
* SakuraRiu
|
* SakuraRiu
|
||||||
|
* anarquimico
|
||||||
|
|
||||||
## Funders
|
## Funders
|
||||||
* 40W
|
* 40W
|
||||||
|
|
53
RELEASE.md
53
RELEASE.md
|
@ -1,3 +1,5 @@
|
||||||
|
### Standard Release
|
||||||
|
|
||||||
#File to document release steps with a view to evolving into a script
|
#File to document release steps with a view to evolving into a script
|
||||||
|
|
||||||
#Update CREDITS.md
|
#Update CREDITS.md
|
||||||
|
@ -20,3 +22,54 @@ git push origin 0.82.0
|
||||||
#Update version in game.conf to -SNAPSHOT
|
#Update version in game.conf to -SNAPSHOT
|
||||||
|
|
||||||
git commit -m "Post-release set version 0.82.0-SNAPSHOT"
|
git commit -m "Post-release set version 0.82.0-SNAPSHOT"
|
||||||
|
|
||||||
|
### Hotfix Release
|
||||||
|
|
||||||
|
##### Prepare release branch
|
||||||
|
|
||||||
|
When hotfixing, you should never release new features. Any new code increases risk of new bugs which has additional testing/release concerns.
|
||||||
|
To mitigate this, you just release the last release, and the relevant bug fix. For this, we do the following:
|
||||||
|
|
||||||
|
* Create release branch from the last release tag, push it:
|
||||||
|
|
||||||
|
git checkout -b release/0.82.1 0.82.0
|
||||||
|
|
||||||
|
git push origin release/0.82.1
|
||||||
|
|
||||||
|
##### Prepare feature branch and fix
|
||||||
|
|
||||||
|
* Create feature branch from that release branch (can review it to check only fix is there, nothing else, and use to also merge into master separately)
|
||||||
|
|
||||||
|
git checkout -b hotfix_bug_1_branch
|
||||||
|
|
||||||
|
* Fix crash/serious bug and commit
|
||||||
|
* Push branch and create pr to the release and also the master branch (Do not rebase, to reduce merge conflict risk. Do not delete after first merge or it needs to be repushed)
|
||||||
|
|
||||||
|
##### Update version and tag the release
|
||||||
|
|
||||||
|
* After all fixes are in release branch, pull it locally (best to avoid a merge conflict as feature branch will need to be merged into master also, which already changed version):
|
||||||
|
|
||||||
|
* Update version in game.conf to hotfix version and commit it. Example: version=0.82.1
|
||||||
|
|
||||||
|
* Tag it, push tag and branch:
|
||||||
|
|
||||||
|
git tag 0.82.1
|
||||||
|
|
||||||
|
git push origin 0.82.1
|
||||||
|
|
||||||
|
git push origin release/0.82.1
|
||||||
|
|
||||||
|
Note: If you have to do more than 1 hotfix release, can do it on the same release branch.
|
||||||
|
|
||||||
|
### Release via ContentDB
|
||||||
|
|
||||||
|
* Go to MineClone2 page (https://content.minetest.net/packages/Wuzzy/mineclone2/)
|
||||||
|
* Click +Release
|
||||||
|
* Enter the release tag number in the title and Git reference box. For example (without quotes): "0.82.1"
|
||||||
|
* In the minimum minetest version, put the oldest supported version (as of 14/02/2023 it is 5.5), leave the Maximum minetest version blank
|
||||||
|
* Click save. Release is now live.
|
||||||
|
|
||||||
|
##### Inform people
|
||||||
|
|
||||||
|
* Add a comment to the forum post with the release number and what is involved, and maintainer will update main post.
|
||||||
|
* Add a comment in Discord announcement
|
BIN
menu/footer.png
BIN
menu/footer.png
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.3 KiB |
|
@ -556,6 +556,11 @@ function mcl_util.deal_damage(target, damage, mcl_reason)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local is_immortal = target:get_armor_groups().immortal or 0
|
||||||
|
if is_immortal>0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local hp = target:get_hp()
|
local hp = target:get_hp()
|
||||||
|
|
||||||
if hp > 0 then
|
if hp > 0 then
|
||||||
|
@ -1011,3 +1016,20 @@ function mcl_util.check_position_protection(position, player)
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local palette_indexes = {grass_palette_index = 0, foliage_palette_index = 0, water_palette_index = 0}
|
||||||
|
function mcl_util.get_palette_indexes_from_pos(pos)
|
||||||
|
local biome_data = minetest.get_biome_data(pos)
|
||||||
|
local biome = biome_data.biome
|
||||||
|
local biome_name = minetest.get_biome_name(biome)
|
||||||
|
local reg_biome = minetest.registered_biomes[biome_name]
|
||||||
|
if reg_biome and reg_biome._mcl_grass_palette_index and reg_biome._mcl_foliage_palette_index and reg_biome._mcl_water_palette_index then
|
||||||
|
local gpi = reg_biome._mcl_grass_palette_index
|
||||||
|
local fpi = reg_biome._mcl_foliage_palette_index
|
||||||
|
local wpi = reg_biome._mcl_water_palette_index
|
||||||
|
local palette_indexes = {grass_palette_index = gpi, foliage_palette_index = fpi, water_palette_index = wpi}
|
||||||
|
return palette_indexes
|
||||||
|
else
|
||||||
|
return palette_indexes
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
-- Template rail function
|
-- Template rail function
|
||||||
local function register_rail(itemstring, tiles, def_extras, creative)
|
local function register_rail(itemstring, tiles, def_extras, creative)
|
||||||
local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1}
|
local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=0,destroy_by_lava_flow=0, transport=1}
|
||||||
if creative == false then
|
if creative == false then
|
||||||
groups.not_in_creative_inventory = 1
|
groups.not_in_creative_inventory = 1
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,6 +4,7 @@ local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
|
||||||
-- API for Mobs Redo: MineClone 2 Edition (MRM)
|
-- API for Mobs Redo: MineClone 2 Edition (MRM)
|
||||||
|
|
||||||
local PATHFINDING = "gowp"
|
local PATHFINDING = "gowp"
|
||||||
|
local CRASH_WARN_FREQUENCY = 60
|
||||||
|
|
||||||
-- Localize
|
-- Localize
|
||||||
local S = minetest.get_translator("mcl_mobs")
|
local S = minetest.get_translator("mcl_mobs")
|
||||||
|
@ -135,8 +136,8 @@ function mob_class:mob_activate(staticdata, def, dtime)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if not self.base_texture then
|
--If textures in definition change, reload textures
|
||||||
|
if not self.base_texture or (def.textures and table.indexof(def.textures, self.base_texture) == -1) then
|
||||||
-- compatiblity with old simple mobs textures
|
-- compatiblity with old simple mobs textures
|
||||||
if type(def.textures[1]) == "string" then
|
if type(def.textures[1]) == "string" then
|
||||||
def.textures = {def.textures}
|
def.textures = {def.textures}
|
||||||
|
@ -317,7 +318,7 @@ local function update_timers (self, dtime)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- attack timer
|
-- attack timer. Not anymore, it seems. Used for also occassionally processing mob step too!
|
||||||
self.timer = self.timer + dtime
|
self.timer = self.timer + dtime
|
||||||
|
|
||||||
if self.state ~= "attack" and self.state ~= PATHFINDING then
|
if self.state ~= "attack" and self.state ~= PATHFINDING then
|
||||||
|
@ -357,14 +358,15 @@ function mob_class:outside_limits()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- main mob function
|
local function on_step_work (self, dtime)
|
||||||
function mob_class:on_step(dtime)
|
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos()
|
||||||
if not pos then return end
|
if not pos then return end
|
||||||
|
|
||||||
if self:check_despawn(pos, dtime) then return true end
|
if self:check_despawn(pos, dtime) then return true end
|
||||||
if self:outside_limits() then return end
|
if self:outside_limits() then return end
|
||||||
|
|
||||||
|
-- Start: Death/damage processing
|
||||||
|
-- All damage needs to be undertaken at the start. We need to exit processing if the mob dies.
|
||||||
if self:check_death_and_slow_mob() then
|
if self:check_death_and_slow_mob() then
|
||||||
--minetest.log("action", "Mob is dying: ".. tostring(self.name))
|
--minetest.log("action", "Mob is dying: ".. tostring(self.name))
|
||||||
-- Do we abandon out of here now?
|
-- Do we abandon out of here now?
|
||||||
|
@ -375,64 +377,105 @@ function mob_class:on_step(dtime)
|
||||||
|
|
||||||
if not self.fire_resistant then
|
if not self.fire_resistant then
|
||||||
mcl_burning.tick(self.object, dtime, self)
|
mcl_burning.tick(self.object, dtime, self)
|
||||||
-- mcl_burning.tick may remove object immediately
|
if not self.object:get_pos() then return end -- mcl_burning.tick may remove object immediately
|
||||||
if not self.object:get_pos() then return end
|
|
||||||
|
if self:check_for_death("fire", {type = "fire"}) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self:env_damage (dtime, pos) then return end
|
||||||
|
|
||||||
if self.state == "die" then return end
|
if self.state == "die" then return end
|
||||||
|
-- End: Death/damage processing
|
||||||
|
|
||||||
self:check_water_flow()
|
self:check_water_flow()
|
||||||
self:env_danger_movement_checks (dtime)
|
self:env_danger_movement_checks (dtime)
|
||||||
|
|
||||||
if mobs_debug then self:update_tag() end
|
|
||||||
|
|
||||||
self:follow_flop() -- Mob following code.
|
self:follow_flop() -- Mob following code.
|
||||||
|
|
||||||
self:set_animation_speed() -- set animation speed relitive to velocity
|
self:set_animation_speed() -- set animation speed relative to velocity
|
||||||
|
|
||||||
self:check_smooth_rotation(dtime)
|
self:check_smooth_rotation(dtime)
|
||||||
self:check_head_swivel(dtime)
|
self:check_head_swivel(dtime)
|
||||||
|
|
||||||
if self.jump_sound_cooloff > 0 then
|
if self.jump_sound_cooloff > 0 then self.jump_sound_cooloff = self.jump_sound_cooloff - dtime end
|
||||||
self.jump_sound_cooloff = self.jump_sound_cooloff - dtime
|
|
||||||
end
|
|
||||||
self:do_jump()
|
self:do_jump()
|
||||||
|
|
||||||
self:set_armor_texture()
|
|
||||||
self:check_runaway_from()
|
self:check_runaway_from()
|
||||||
|
|
||||||
self:monster_attack()
|
self:monster_attack()
|
||||||
self:npc_attack()
|
self:npc_attack()
|
||||||
self:check_breeding()
|
|
||||||
self:check_aggro(dtime)
|
self:check_aggro(dtime)
|
||||||
|
|
||||||
-- run custom function (defined in mob lua file)
|
if self.do_custom and self.do_custom(self, dtime) == false then return end
|
||||||
if self.do_custom then
|
|
||||||
if self.do_custom(self, dtime) == false then
|
|
||||||
return
|
-- In certain circumstances, we abandon processing of certain functionality
|
||||||
|
local skip_processing = false
|
||||||
|
if update_timers(self, dtime) then
|
||||||
|
skip_processing = true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if not skip_processing then
|
||||||
|
self:check_breeding()
|
||||||
|
|
||||||
|
self:check_item_pickup()
|
||||||
|
self:set_armor_texture()
|
||||||
|
|
||||||
|
self:check_particlespawners(dtime)
|
||||||
|
|
||||||
|
if self.opinion_sound_cooloff > 0 then
|
||||||
|
self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime
|
||||||
end
|
end
|
||||||
|
-- mob plays random sound at times. Should be 120. Zombie and mob farms are ridiculous
|
||||||
|
if math.random(1, 70) == 1 then
|
||||||
|
self:mob_sound("random", true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if self:do_states(dtime) then return end
|
||||||
end
|
end
|
||||||
|
|
||||||
if update_timers(self, dtime) then return end
|
|
||||||
|
|
||||||
self:check_particlespawners(dtime)
|
|
||||||
self:check_item_pickup()
|
|
||||||
|
|
||||||
if self.opinion_sound_cooloff > 0 then
|
if mobs_debug then self:update_tag() end
|
||||||
self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime
|
|
||||||
end
|
|
||||||
-- mob plays random sound at times. Should be 120. Zombie and mob farms are ridiculous
|
|
||||||
if math.random(1, 70) == 1 then
|
|
||||||
self:mob_sound("random", true)
|
|
||||||
end
|
|
||||||
|
|
||||||
if self:env_damage (dtime, pos) then return end
|
|
||||||
if self:do_states(dtime) then return end
|
|
||||||
|
|
||||||
if not self.object:get_luaentity() then
|
if not self.object:get_luaentity() then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local last_crash_warn_time = 0
|
||||||
|
|
||||||
|
local on_step_error_handler = function ()
|
||||||
|
local info = debug.getinfo(1, "SnlufL")
|
||||||
|
|
||||||
|
local current_time = os.time()
|
||||||
|
local time_since_warning = current_time - last_crash_warn_time
|
||||||
|
|
||||||
|
--minetest.log("previous_crash_time: " .. current_time)
|
||||||
|
--minetest.log("last_crash_time: " .. last_crash_warn_time)
|
||||||
|
--minetest.log("time_since_warning: " .. time_since_warning)
|
||||||
|
|
||||||
|
if time_since_warning > CRASH_WARN_FREQUENCY then
|
||||||
|
last_crash_warn_time = current_time
|
||||||
|
minetest.log("A game crashing bug was prevented. Please provide debug.log information to MineClone2 dev team for investigation. (Search for: --- Bug report start)")
|
||||||
|
end
|
||||||
|
minetest.log("action", "--- Bug report start (please provide a few lines before this also for context) ---")
|
||||||
|
minetest.log("action", "Stack trace: ".. tostring(debug.traceback()))
|
||||||
|
minetest.log("action", "Bug info: ".. dump(info))
|
||||||
|
minetest.log("action", "--- Bug report end ---")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- main mob function
|
||||||
|
function mob_class:on_step(dtime)
|
||||||
|
local status, retVal = xpcall(on_step_work, on_step_error_handler, self, dtime)
|
||||||
|
if status then
|
||||||
|
return retVal
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local timer = 0
|
local timer = 0
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
timer = timer + dtime
|
timer = timer + dtime
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
|
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
|
||||||
local mob_class = mcl_mobs.mob_class
|
local mob_class = mcl_mobs.mob_class
|
||||||
|
|
||||||
local HORNY_TIME = 30*20
|
local HORNY_TIME = 30
|
||||||
local HORNY_AGAIN_TIME = 30*20 -- was 300 or 15*20
|
local HORNY_AGAIN_TIME = 30 -- was 300 or 15*20
|
||||||
local CHILD_GROW_TIME = 60*20
|
local CHILD_GROW_TIME = 60
|
||||||
|
|
||||||
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_villager",false)
|
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_villager",false)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
|
local math, tonumber, vector, minetest, mcl_mobs = math, tonumber, vector, minetest, mcl_mobs
|
||||||
local mob_class = mcl_mobs.mob_class
|
local mob_class = mcl_mobs.mob_class
|
||||||
local active_particlespawners = {}
|
local active_particlespawners = {}
|
||||||
local disable_blood = minetest.settings:get_bool("mobs_disable_blood")
|
local disable_blood = minetest.settings:get_bool("mobs_disable_blood")
|
||||||
|
@ -8,6 +8,15 @@ local player_transfer_distance = tonumber(minetest.settings:get("player_transfer
|
||||||
if player_transfer_distance == 0 then player_transfer_distance = math.huge end
|
if player_transfer_distance == 0 then player_transfer_distance = math.huge end
|
||||||
|
|
||||||
|
|
||||||
|
local function validate_vector (vect)
|
||||||
|
if vect then
|
||||||
|
if tonumber(vect.x) and tonumber(vect.y) and tonumber(vect.z) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
-- custom particle effects
|
-- custom particle effects
|
||||||
function mcl_mobs.effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down)
|
function mcl_mobs.effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down)
|
||||||
|
|
||||||
|
@ -385,6 +394,8 @@ function mob_class:check_head_swivel(dtime)
|
||||||
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function mob_class:set_animation_speed()
|
function mob_class:set_animation_speed()
|
||||||
local v = self.object:get_velocity()
|
local v = self.object:get_velocity()
|
||||||
if v then
|
if v then
|
||||||
|
@ -400,7 +411,7 @@ function mob_class:set_animation_speed()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--set_speed
|
--set_speed
|
||||||
if self.acc then
|
if validate_vector(self.acc) then
|
||||||
self.object:add_velocity(self.acc)
|
self.object:add_velocity(self.acc)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -503,6 +503,8 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
|
||||||
|
|
||||||
local name = placer:get_player_name()
|
local name = placer:get_player_name()
|
||||||
local privs = minetest.get_player_privs(name)
|
local privs = minetest.get_player_privs(name)
|
||||||
|
local dim = mcl_worlds.pos_to_dimension(placer:get_pos())
|
||||||
|
local mob_light_lvl = {mcl_mobs:mob_light_lvl(itemstack:get_name(),dim)}
|
||||||
if under.name == "mcl_mobspawners:spawner" then
|
if under.name == "mcl_mobspawners:spawner" then
|
||||||
if minetest.is_protected(pointed_thing.under, name) then
|
if minetest.is_protected(pointed_thing.under, name) then
|
||||||
minetest.record_protection_violation(pointed_thing.under, name)
|
minetest.record_protection_violation(pointed_thing.under, name)
|
||||||
|
@ -512,7 +514,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
|
||||||
minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner."))
|
minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner."))
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name())
|
mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name(), mob_light_lvl[1], mob_light_lvl[2])
|
||||||
if not minetest.is_creative_enabled(name) then
|
if not minetest.is_creative_enabled(name) then
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
end
|
end
|
||||||
|
|
|
@ -239,9 +239,15 @@ function mob_class:is_at_water_danger()
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local yaw = self.object:get_yaw()
|
local yaw = self.object:get_yaw()
|
||||||
|
local pos = self.object:get_pos()
|
||||||
|
|
||||||
|
if not yaw or not pos then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)
|
local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)
|
||||||
local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)
|
local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)
|
||||||
local pos = self.object:get_pos()
|
|
||||||
local ypos = pos.y + self.collisionbox[2] -- just above floor
|
local ypos = pos.y + self.collisionbox[2] -- just above floor
|
||||||
|
|
||||||
local free_fall, blocker = minetest.line_of_sight(
|
local free_fall, blocker = minetest.line_of_sight(
|
||||||
|
@ -454,7 +460,7 @@ end
|
||||||
|
|
||||||
|
|
||||||
-- find and replace what mob is looking for (grass, wheat etc.)
|
-- find and replace what mob is looking for (grass, wheat etc.)
|
||||||
function mob_class:replace(pos)
|
function mob_class:replace_node(pos)
|
||||||
|
|
||||||
if not self.replace_rate
|
if not self.replace_rate
|
||||||
or not self.replace_what
|
or not self.replace_what
|
||||||
|
|
|
@ -3,6 +3,9 @@ local mob_class = mcl_mobs.mob_class
|
||||||
|
|
||||||
local PATHFINDING_FAIL_THRESHOLD = 100 -- no. of ticks to fail before giving up. 20p/s. 5s helps them get through door
|
local PATHFINDING_FAIL_THRESHOLD = 100 -- no. of ticks to fail before giving up. 20p/s. 5s helps them get through door
|
||||||
local PATHFINDING_FAIL_WAIT = 30 -- how long to wait before trying to path again
|
local PATHFINDING_FAIL_WAIT = 30 -- how long to wait before trying to path again
|
||||||
|
local PATHING_START_DELAY = 4 -- When doing non-prioritised pathing, how long to wait until last mob pathed
|
||||||
|
|
||||||
|
local PATHFINDING_SEARCH_DISTANCE = 50 -- How big the square is that pathfinding will look
|
||||||
|
|
||||||
local PATHFINDING = "gowp"
|
local PATHFINDING = "gowp"
|
||||||
|
|
||||||
|
@ -107,14 +110,20 @@ local function generate_enriched_path(wp_in, door_open_pos, door_close_pos, cur_
|
||||||
return wp_out
|
return wp_out
|
||||||
end
|
end
|
||||||
|
|
||||||
function mob_class:ready_to_path()
|
local last_pathing_time = os.time()
|
||||||
|
|
||||||
|
function mob_class:ready_to_path(prioritised)
|
||||||
mcl_log("Check ready to path")
|
mcl_log("Check ready to path")
|
||||||
if self._pf_last_failed and (os.time() - self._pf_last_failed) < PATHFINDING_FAIL_WAIT then
|
if self._pf_last_failed and (os.time() - self._pf_last_failed) < PATHFINDING_FAIL_WAIT then
|
||||||
mcl_log("Not ready to path as last fail is less than threshold: " .. (os.time() - self._pf_last_failed))
|
mcl_log("Not ready to path as last fail is less than threshold: " .. (os.time() - self._pf_last_failed))
|
||||||
return false
|
return false
|
||||||
else
|
else
|
||||||
mcl_log("We are ready to pathfind, no previous fail or we are past threshold")
|
local time_since_path_start = os.time() - last_pathing_time
|
||||||
return true
|
mcl_log("time_since_path_start: " .. tostring(time_since_path_start))
|
||||||
|
if prioritised or (time_since_path_start) > PATHING_START_DELAY then
|
||||||
|
mcl_log("We are ready to pathfind, no previous fail or we are past threshold")
|
||||||
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -144,7 +153,7 @@ local function calculate_path_through_door (p, cur_door_pos, t)
|
||||||
if n.name == "air" then
|
if n.name == "air" then
|
||||||
mcl_log("We have air space next to door at: " .. minetest.pos_to_string(pos_closest_to_door))
|
mcl_log("We have air space next to door at: " .. minetest.pos_to_string(pos_closest_to_door))
|
||||||
|
|
||||||
prospective_wp = minetest.find_path(p,pos_closest_to_door,150,1,4)
|
prospective_wp = minetest.find_path(p, pos_closest_to_door, PATHFINDING_SEARCH_DISTANCE, 1, 4)
|
||||||
|
|
||||||
if prospective_wp then
|
if prospective_wp then
|
||||||
mcl_log("Found a path to next to door".. minetest.pos_to_string(pos_closest_to_door))
|
mcl_log("Found a path to next to door".. minetest.pos_to_string(pos_closest_to_door))
|
||||||
|
@ -154,7 +163,7 @@ local function calculate_path_through_door (p, cur_door_pos, t)
|
||||||
|
|
||||||
if t then
|
if t then
|
||||||
mcl_log("We have t, lets go from door to target")
|
mcl_log("We have t, lets go from door to target")
|
||||||
local wp_otherside_door_to_target = minetest.find_path(other_side_of_door,t,150,1,4)
|
local wp_otherside_door_to_target = minetest.find_path(other_side_of_door, t, PATHFINDING_SEARCH_DISTANCE, 1, 4)
|
||||||
|
|
||||||
if wp_otherside_door_to_target and #wp_otherside_door_to_target > 0 then
|
if wp_otherside_door_to_target and #wp_otherside_door_to_target > 0 then
|
||||||
append_paths (prospective_wp, wp_otherside_door_to_target)
|
append_paths (prospective_wp, wp_otherside_door_to_target)
|
||||||
|
@ -190,9 +199,13 @@ local function calculate_path_through_door (p, cur_door_pos, t)
|
||||||
return enriched_path
|
return enriched_path
|
||||||
end
|
end
|
||||||
|
|
||||||
function mob_class:gopath(target,callback_arrived)
|
|
||||||
|
|
||||||
|
function mob_class:gopath(target, callback_arrived, prioritised)
|
||||||
if self.state == PATHFINDING then mcl_log("Already pathfinding, don't set another until done.") return end
|
if self.state == PATHFINDING then mcl_log("Already pathfinding, don't set another until done.") return end
|
||||||
if not self:ready_to_path() then return end
|
if not self:ready_to_path(prioritised) then return end
|
||||||
|
|
||||||
|
last_pathing_time = os.time()
|
||||||
|
|
||||||
self.order = nil
|
self.order = nil
|
||||||
|
|
||||||
|
@ -200,7 +213,7 @@ function mob_class:gopath(target,callback_arrived)
|
||||||
local t = vector.offset(target,0,1,0)
|
local t = vector.offset(target,0,1,0)
|
||||||
|
|
||||||
--Check direct route
|
--Check direct route
|
||||||
local wp = minetest.find_path(p,t,150,1,4)
|
local wp = minetest.find_path(p, t, PATHFINDING_SEARCH_DISTANCE, 1, 4)
|
||||||
|
|
||||||
if not wp then
|
if not wp then
|
||||||
mcl_log("### No direct path. Path through door closest to target.")
|
mcl_log("### No direct path. Path through door closest to target.")
|
||||||
|
@ -410,7 +423,7 @@ function mob_class:check_gowp(dtime)
|
||||||
mcl_log("No current target")
|
mcl_log("No current target")
|
||||||
end
|
end
|
||||||
|
|
||||||
local final_wp = minetest.find_path(p,self._target,150,1,4)
|
local final_wp = minetest.find_path(p, self._target, PATHFINDING_SEARCH_DISTANCE, 1, 4)
|
||||||
if final_wp then
|
if final_wp then
|
||||||
mcl_log("We can get to target here.")
|
mcl_log("We can get to target here.")
|
||||||
-- self.waypoints = final_wp
|
-- self.waypoints = final_wp
|
||||||
|
|
|
@ -311,6 +311,8 @@ end
|
||||||
function mob_class:set_yaw(yaw, delay, dtime)
|
function mob_class:set_yaw(yaw, delay, dtime)
|
||||||
if self.noyaw then return end
|
if self.noyaw then return end
|
||||||
|
|
||||||
|
if not self.object:get_yaw() or not self.object:get_pos() then return end
|
||||||
|
|
||||||
if self.state ~= PATHFINDING then
|
if self.state ~= PATHFINDING then
|
||||||
self._turn_to = yaw
|
self._turn_to = yaw
|
||||||
end
|
end
|
||||||
|
@ -462,6 +464,14 @@ function mob_class:check_for_death(cause, cmi_cause)
|
||||||
self:mob_sound("death")
|
self:mob_sound("death")
|
||||||
|
|
||||||
local function death_handle(self)
|
local function death_handle(self)
|
||||||
|
if cmi_cause and cmi_cause["type"] then
|
||||||
|
--minetest.log("cmi_cause: " .. tostring(cmi_cause["type"]))
|
||||||
|
end
|
||||||
|
--minetest.log("cause: " .. tostring(cause))
|
||||||
|
|
||||||
|
-- TODO other env damage shouldn't drop xp
|
||||||
|
-- "rain", "water", "drowning", "suffocation"
|
||||||
|
|
||||||
-- dropped cooked item if mob died in fire or lava
|
-- dropped cooked item if mob died in fire or lava
|
||||||
if cause == "lava" or cause == "fire" then
|
if cause == "lava" or cause == "fire" then
|
||||||
self:item_drop(true, 0)
|
self:item_drop(true, 0)
|
||||||
|
@ -649,7 +659,6 @@ function mob_class:do_env_damage()
|
||||||
-- rain
|
-- rain
|
||||||
if self.rain_damage > 0 then
|
if self.rain_damage > 0 then
|
||||||
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
|
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
|
||||||
|
|
||||||
self.health = self.health - self.rain_damage
|
self.health = self.health - self.rain_damage
|
||||||
|
|
||||||
if self:check_for_death("rain", {type = "environment",
|
if self:check_for_death("rain", {type = "environment",
|
||||||
|
@ -662,13 +671,9 @@ function mob_class:do_env_damage()
|
||||||
pos.y = pos.y + 1 -- for particle effect position
|
pos.y = pos.y + 1 -- for particle effect position
|
||||||
|
|
||||||
-- water damage
|
-- water damage
|
||||||
if self.water_damage > 0
|
if self.water_damage > 0 and nodef.groups.water then
|
||||||
and nodef.groups.water then
|
|
||||||
|
|
||||||
if self.water_damage ~= 0 then
|
if self.water_damage ~= 0 then
|
||||||
|
|
||||||
self.health = self.health - self.water_damage
|
self.health = self.health - self.water_damage
|
||||||
|
|
||||||
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil)
|
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil)
|
||||||
|
|
||||||
if self:check_for_death("water", {type = "environment",
|
if self:check_for_death("water", {type = "environment",
|
||||||
|
@ -676,27 +681,10 @@ function mob_class:do_env_damage()
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- magma damage
|
elseif self.lava_damage > 0 and (nodef.groups.lava) then
|
||||||
elseif self.fire_damage > 0
|
-- lava damage
|
||||||
and (nodef2.groups.fire) then
|
|
||||||
|
|
||||||
if self.fire_damage ~= 0 then
|
|
||||||
|
|
||||||
self.health = self.health - self.fire_damage
|
|
||||||
|
|
||||||
if self:check_for_death("fire", {type = "environment",
|
|
||||||
pos = pos, node = self.standing_in}) then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- lava damage
|
|
||||||
elseif self.lava_damage > 0
|
|
||||||
and (nodef.groups.lava) then
|
|
||||||
|
|
||||||
if self.lava_damage ~= 0 then
|
if self.lava_damage ~= 0 then
|
||||||
|
|
||||||
self.health = self.health - self.lava_damage
|
self.health = self.health - self.lava_damage
|
||||||
|
|
||||||
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
|
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
|
||||||
mcl_burning.set_on_fire(self.object, 10)
|
mcl_burning.set_on_fire(self.object, 10)
|
||||||
|
|
||||||
|
@ -705,15 +693,20 @@ function mob_class:do_env_damage()
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
elseif self.fire_damage > 0 and (nodef2.groups.fire) then
|
||||||
-- fire damage
|
-- magma damage
|
||||||
elseif self.fire_damage > 0
|
|
||||||
and (nodef.groups.fire) then
|
|
||||||
|
|
||||||
if self.fire_damage ~= 0 then
|
if self.fire_damage ~= 0 then
|
||||||
|
|
||||||
self.health = self.health - self.fire_damage
|
self.health = self.health - self.fire_damage
|
||||||
|
|
||||||
|
if self:check_for_death("fire", {type = "environment",
|
||||||
|
pos = pos, node = self.standing_in}) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif self.fire_damage > 0 and (nodef.groups.fire) then
|
||||||
|
-- fire damage
|
||||||
|
if self.fire_damage ~= 0 then
|
||||||
|
self.health = self.health - self.fire_damage
|
||||||
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
|
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
|
||||||
mcl_burning.set_on_fire(self.object, 5)
|
mcl_burning.set_on_fire(self.object, 5)
|
||||||
|
|
||||||
|
@ -722,12 +715,9 @@ function mob_class:do_env_damage()
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- damage_per_second node check
|
|
||||||
elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then
|
elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then
|
||||||
|
-- damage_per_second node check
|
||||||
self.health = self.health - nodef.damage_per_second
|
self.health = self.health - nodef.damage_per_second
|
||||||
|
|
||||||
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png")
|
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png")
|
||||||
|
|
||||||
if self:check_for_death("dps", {type = "environment",
|
if self:check_for_death("dps", {type = "environment",
|
||||||
|
@ -739,6 +729,7 @@ function mob_class:do_env_damage()
|
||||||
-- Drowning damage
|
-- Drowning damage
|
||||||
if self.breath_max ~= -1 then
|
if self.breath_max ~= -1 then
|
||||||
local drowning = false
|
local drowning = false
|
||||||
|
|
||||||
if self.breathes_in_water then
|
if self.breathes_in_water then
|
||||||
if minetest.get_item_group(self.standing_in, "water") == 0 then
|
if minetest.get_item_group(self.standing_in, "water") == 0 then
|
||||||
drowning = true
|
drowning = true
|
||||||
|
@ -746,10 +737,9 @@ function mob_class:do_env_damage()
|
||||||
elseif nodef.drowning > 0 then
|
elseif nodef.drowning > 0 then
|
||||||
drowning = true
|
drowning = true
|
||||||
end
|
end
|
||||||
|
|
||||||
if drowning then
|
if drowning then
|
||||||
|
|
||||||
self.breath = math.max(0, self.breath - 1)
|
self.breath = math.max(0, self.breath - 1)
|
||||||
|
|
||||||
mcl_mobs.effect(pos, 2, "bubble.png", nil, nil, 1, nil)
|
mcl_mobs.effect(pos, 2, "bubble.png", nil, nil, 1, nil)
|
||||||
if self.breath <= 0 then
|
if self.breath <= 0 then
|
||||||
local dmg
|
local dmg
|
||||||
|
@ -800,25 +790,25 @@ function mob_class:do_env_damage()
|
||||||
self.suffocation_timer = 0
|
self.suffocation_timer = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
return self:check_for_death("", {type = "unknown"})
|
return self:check_for_death("unknown", {type = "unknown"})
|
||||||
end
|
end
|
||||||
|
|
||||||
function mob_class:env_damage (dtime, pos)
|
function mob_class:env_damage (dtime, pos)
|
||||||
-- environmental damage timer (every 1 second)
|
-- environmental damage timer (every 1 second)
|
||||||
self.env_damage_timer = self.env_damage_timer + dtime
|
self.env_damage_timer = self.env_damage_timer + dtime
|
||||||
|
|
||||||
if (self.state == "attack" and self.env_damage_timer > 1)
|
|
||||||
or self.state ~= "attack" then
|
if self.env_damage_timer > 1 then
|
||||||
self:check_entity_cramming()
|
|
||||||
self.env_damage_timer = 0
|
self.env_damage_timer = 0
|
||||||
|
|
||||||
|
self:check_entity_cramming()
|
||||||
|
|
||||||
-- check for environmental damage (water, fire, lava etc.)
|
-- check for environmental damage (water, fire, lava etc.)
|
||||||
if self:do_env_damage() then
|
if self:do_env_damage() then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- node replace check (cow eats grass etc.)
|
self:replace_node(pos) -- (sheep eats grass etc.)
|
||||||
self:replace(pos)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -24,25 +24,60 @@ local vector_floor = vector.floor
|
||||||
|
|
||||||
local table_copy = table.copy
|
local table_copy = table.copy
|
||||||
local table_remove = table.remove
|
local table_remove = table.remove
|
||||||
|
|
||||||
local pairs = pairs
|
local pairs = pairs
|
||||||
|
|
||||||
|
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_spawning", false)
|
||||||
|
local function mcl_log (message)
|
||||||
|
if LOGGING_ON then
|
||||||
|
mcl_util.mcl_log (message, "[Mobs spawn]", true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local dbg_spawn_attempts = 0
|
local dbg_spawn_attempts = 0
|
||||||
local dbg_spawn_succ = 0
|
local dbg_spawn_succ = 0
|
||||||
local dbg_spawn_counts = {}
|
local dbg_spawn_counts = {}
|
||||||
-- range for mob count
|
|
||||||
local aoc_range = 136
|
|
||||||
local remove_far = true
|
local remove_far = true
|
||||||
|
|
||||||
|
local WAIT_FOR_SPAWN_ATTEMPT = 10
|
||||||
|
local FIND_SPAWN_POS_RETRIES = 16
|
||||||
|
local FIND_SPAWN_POS_RETRIES_SUCCESS_RESPIN = 8
|
||||||
|
|
||||||
|
local MOB_SPAWN_ZONE_INNER = 24
|
||||||
|
local MOB_SPAWN_ZONE_MIDDLE = 32
|
||||||
|
local MOB_SPAWN_ZONE_OUTER = 128
|
||||||
|
|
||||||
|
-- range for mob count
|
||||||
|
local MOB_CAP_INNER_RADIUS = 32
|
||||||
|
local aoc_range = 136
|
||||||
|
|
||||||
|
local MISSING_CAP_DEFAULT = 15
|
||||||
|
local MOBS_CAP_CLOSE = 5
|
||||||
|
|
||||||
|
local SPAWN_MAPGEN_LIMIT = mcl_vars.mapgen_limit - 150
|
||||||
|
|
||||||
local mob_cap = {
|
local mob_cap = {
|
||||||
monster = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
|
hostile = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
|
||||||
animal = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10,
|
passive = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 13,
|
||||||
ambient = tonumber(minetest.settings:get("mcl_mob_cap_ambient")) or 15,
|
ambient = tonumber(minetest.settings:get("mcl_mob_cap_ambient")) or 15,
|
||||||
water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 5, --currently unused
|
water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 8,
|
||||||
water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20, --currently unused
|
water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20, --currently unused
|
||||||
player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75,
|
player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75,
|
||||||
total = tonumber(minetest.settings:get("mcl_mob_cap_total")) or 500,
|
total = tonumber(minetest.settings:get("mcl_mob_cap_total")) or 500,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local peaceful_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_percentage_spawned")) or 35
|
||||||
|
local peaceful_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_group_percentage_spawned")) or 15
|
||||||
|
local hostile_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_hostile_group_percentage_spawned")) or 20
|
||||||
|
|
||||||
|
mcl_log("Mob cap hostile: " .. mob_cap.hostile)
|
||||||
|
mcl_log("Mob cap water: " .. mob_cap.water)
|
||||||
|
mcl_log("Mob cap passive: " .. mob_cap.passive)
|
||||||
|
|
||||||
|
mcl_log("Percentage of peacefuls spawned: " .. peaceful_percentage_spawned)
|
||||||
|
mcl_log("Percentage of peaceful spawns are group: " .. peaceful_group_percentage_spawned)
|
||||||
|
mcl_log("Percentage of hostile spawns are group: " .. hostile_group_percentage_spawned)
|
||||||
|
|
||||||
--do mobs spawn?
|
--do mobs spawn?
|
||||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
|
||||||
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
|
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
|
||||||
|
@ -250,22 +285,58 @@ local function count_mobs_total(mob_type)
|
||||||
return num
|
return num
|
||||||
end
|
end
|
||||||
|
|
||||||
local function count_mobs_all()
|
local function count_mobs_add_entry (mobs_list, mob_cat)
|
||||||
local mobs_found = {}
|
if mobs_list[mob_cat] then
|
||||||
|
mobs_list[mob_cat] = mobs_list[mob_cat] + 1
|
||||||
|
else
|
||||||
|
mobs_list[mob_cat] = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--categorise_by can be name or type or spawn_class
|
||||||
|
local function count_mobs_all(categorise_by, pos)
|
||||||
|
local mobs_found_wide = {}
|
||||||
|
local mobs_found_close = {}
|
||||||
|
|
||||||
local num = 0
|
local num = 0
|
||||||
for _,entity in pairs(minetest.luaentities) do
|
for _,entity in pairs(minetest.luaentities) do
|
||||||
if entity.is_mob then
|
if entity and entity.is_mob then
|
||||||
local mob_type = entity.type -- animal / monster / npc
|
|
||||||
local mob_name = entity.name
|
local add_entry = false
|
||||||
if mobs_found[mob_name] then
|
--local mob_type = entity.type -- animal / monster / npc
|
||||||
mobs_found[mob_name] = mobs_found[mob_name] + 1
|
local mob_cat = entity[categorise_by]
|
||||||
|
|
||||||
|
if pos then
|
||||||
|
local mob_pos = entity.object:get_pos()
|
||||||
|
if mob_pos then
|
||||||
|
local distance = vector.distance(pos, mob_pos)
|
||||||
|
--mcl_log("distance: ".. distance)
|
||||||
|
if distance <= MOB_SPAWN_ZONE_MIDDLE then
|
||||||
|
--mcl_log("distance is close")
|
||||||
|
count_mobs_add_entry (mobs_found_close, mob_cat)
|
||||||
|
count_mobs_add_entry (mobs_found_wide, mob_cat)
|
||||||
|
add_entry = true
|
||||||
|
elseif distance <= MOB_SPAWN_ZONE_OUTER then
|
||||||
|
--mcl_log("distance is wide")
|
||||||
|
count_mobs_add_entry (mobs_found_wide, mob_cat)
|
||||||
|
add_entry = true
|
||||||
|
else
|
||||||
|
--mcl_log("mob_pos: " .. minetest.pos_to_string(mob_pos))
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
mobs_found[mob_name] = 1
|
count_mobs_add_entry (mobs_found_wide, mob_cat)
|
||||||
|
add_entry = true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if add_entry then
|
||||||
|
num = num + 1
|
||||||
end
|
end
|
||||||
num = num + 1
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return mobs_found, num
|
--mcl_log("num: ".. num)
|
||||||
|
return mobs_found_close, mobs_found_wide, num
|
||||||
end
|
end
|
||||||
|
|
||||||
local function count_mobs_total_cap(mob_type)
|
local function count_mobs_total_cap(mob_type)
|
||||||
|
@ -280,6 +351,32 @@ local function count_mobs_total_cap(mob_type)
|
||||||
return num
|
return num
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function output_mob_stats(mob_counts, total_mobs, chat_display)
|
||||||
|
if (total_mobs) then
|
||||||
|
local total_output = "Total mobs found: " .. total_mobs
|
||||||
|
if chat_display then
|
||||||
|
minetest.log(total_output)
|
||||||
|
else
|
||||||
|
minetest.log("action", total_output)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
local detailed = ""
|
||||||
|
if mob_counts then
|
||||||
|
for k, v1 in pairs(mob_counts) do
|
||||||
|
detailed = detailed .. tostring(k) .. ": " .. tostring(v1) .. "; "
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if detailed and detailed ~= "" then
|
||||||
|
if chat_display then
|
||||||
|
minetest.log(detailed)
|
||||||
|
else
|
||||||
|
minetest.log("action", detailed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- global functions
|
-- global functions
|
||||||
|
|
||||||
function mcl_mobs:spawn_abm_check(pos, node, name)
|
function mcl_mobs:spawn_abm_check(pos, node, name)
|
||||||
|
@ -316,6 +413,8 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
|
||||||
|
|
||||||
--this is where all of the spawning information is kept
|
--this is where all of the spawning information is kept
|
||||||
local spawn_dictionary = {}
|
local spawn_dictionary = {}
|
||||||
|
--this is where all of the spawning information is kept for mobs that don't naturally spawn
|
||||||
|
local non_spawn_dictionary = {}
|
||||||
local summary_chance = 0
|
local summary_chance = 0
|
||||||
|
|
||||||
function mcl_mobs:spawn_setup(def)
|
function mcl_mobs:spawn_setup(def)
|
||||||
|
@ -381,6 +480,47 @@ function mcl_mobs:spawn_setup(def)
|
||||||
summary_chance = summary_chance + chance
|
summary_chance = summary_chance + chance
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function mcl_mobs:mob_light_lvl(mob_name, dimension)
|
||||||
|
local spawn_dictionary_consolidated = {}
|
||||||
|
--see if the mob exists in the nonspawn dictionary, if so then return light values
|
||||||
|
if non_spawn_dictionary[mob_name] ~= nil then
|
||||||
|
local mob_dimension = non_spawn_dictionary[mob_name][dimension]
|
||||||
|
if mob_name ~= nil then
|
||||||
|
return mob_dimension.min_light,mob_dimension.max_light
|
||||||
|
else
|
||||||
|
return non_spawn_dictionary[mob_name]["overworld"].min_light, non_spawn_dictionary[mob_name]["overworld"].max_light
|
||||||
|
end
|
||||||
|
|
||||||
|
--if the mob doesn't exist in non_spawn, check spawn_dictonary
|
||||||
|
else
|
||||||
|
for i,v in pairs(spawn_dictionary) do
|
||||||
|
if spawn_dictionary[spawn_dictionary[i].name] == nil then
|
||||||
|
spawn_dictionary_consolidated[spawn_dictionary[i].name] = {}
|
||||||
|
end
|
||||||
|
spawn_dictionary_consolidated[spawn_dictionary[i].name][dimension] = {
|
||||||
|
["min_light"] = spawn_dictionary[i].min_light,
|
||||||
|
["max_light"] = spawn_dictionary[i].max_light
|
||||||
|
}
|
||||||
|
end
|
||||||
|
mob_dimension = spawn_dictionary_consolidated[mob_name][dimension]
|
||||||
|
mob_dimension_default = spawn_dictionary_consolidated[mob_name]["overworld"]
|
||||||
|
if spawn_dictionary_consolidated[mob_name] == mob_name and mob_dimension ~= nil then
|
||||||
|
return mob_dimension.min_light, mob_dimension.max_light
|
||||||
|
else
|
||||||
|
return mob_dimension_default.min_light, mob_dimension_default.max_light
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mcl_mobs:non_spawn_specific(mob_name,dimension,min_light,max_light)
|
||||||
|
table.insert(non_spawn_dictionary, mob_name)
|
||||||
|
non_spawn_dictionary[mob_name] = {
|
||||||
|
[dimension] = {
|
||||||
|
min_light = min_light , max_light = max_light
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
|
||||||
|
|
||||||
-- Do mobs spawn at all?
|
-- Do mobs spawn at all?
|
||||||
|
@ -422,18 +562,23 @@ function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_
|
||||||
summary_chance = summary_chance + chance
|
summary_chance = summary_chance + chance
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local two_pi = 2 * math.pi
|
local two_pi = 2 * math.pi
|
||||||
local function get_next_mob_spawn_pos(pos)
|
local function get_next_mob_spawn_pos(pos)
|
||||||
local distance = math_random(25, 32)
|
-- TODO We should consider spawning something a little further away sporadically.
|
||||||
|
-- It would be good for sky farms and variance, rather than all being on the 24 - 32 block away radius
|
||||||
|
local distance = math_random(MOB_SPAWN_ZONE_INNER, MOB_SPAWN_ZONE_MIDDLE)
|
||||||
local angle = math_random() * two_pi
|
local angle = math_random() * two_pi
|
||||||
|
|
||||||
|
-- TODO Floor xoff and zoff and add 0.5 so it tries to spawn in the middle of the square. Less failed attempts.
|
||||||
local xoff = math_round(distance * math_cos(angle))
|
local xoff = math_round(distance * math_cos(angle))
|
||||||
local yoff = math_round(distance * math_sin(angle))
|
local zoff = math_round(distance * math_sin(angle))
|
||||||
return vector.offset(pos, xoff, 0, yoff)
|
return vector.offset(pos, xoff, 0, zoff)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function decypher_limits(posy)
|
local function decypher_limits(posy)
|
||||||
posy = math_floor(posy)
|
posy = math_floor(posy)
|
||||||
return posy - 32, posy + 32
|
return posy - MOB_SPAWN_ZONE_MIDDLE, posy + MOB_SPAWN_ZONE_MIDDLE
|
||||||
end
|
end
|
||||||
|
|
||||||
--a simple helper function for mob_spawn
|
--a simple helper function for mob_spawn
|
||||||
|
@ -484,7 +629,9 @@ local function has_room(self,pos)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
local function spawn_check(pos,spawn_def,ignore_caps)
|
|
||||||
|
|
||||||
|
local function spawn_check(pos, spawn_def)
|
||||||
if not spawn_def then return end
|
if not spawn_def then return end
|
||||||
dbg_spawn_attempts = dbg_spawn_attempts + 1
|
dbg_spawn_attempts = dbg_spawn_attempts + 1
|
||||||
local dimension = mcl_worlds.pos_to_dimension(pos)
|
local dimension = mcl_worlds.pos_to_dimension(pos)
|
||||||
|
@ -507,17 +654,8 @@ local function spawn_check(pos,spawn_def,ignore_caps)
|
||||||
local is_leaf = get_item_group(gotten_node, "leaves") ~= 0
|
local is_leaf = get_item_group(gotten_node, "leaves") ~= 0
|
||||||
local is_bedrock = gotten_node == "mcl_core:bedrock"
|
local is_bedrock = gotten_node == "mcl_core:bedrock"
|
||||||
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
|
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
|
||||||
local mob_count_wide = 0
|
|
||||||
|
|
||||||
local mob_count = 0
|
|
||||||
if not ignore_caps then
|
|
||||||
mob_count = count_mobs(pos,32,mob_type)
|
|
||||||
mob_count_wide = count_mobs(pos,aoc_range,mob_type)
|
|
||||||
end
|
|
||||||
|
|
||||||
if pos and spawn_def
|
if pos and spawn_def
|
||||||
and ( mob_count_wide < (mob_cap[mob_type] or 15) )
|
|
||||||
and ( mob_count < 5 )
|
|
||||||
and pos.y >= spawn_def.min_height
|
and pos.y >= spawn_def.min_height
|
||||||
and pos.y <= spawn_def.max_height
|
and pos.y <= spawn_def.max_height
|
||||||
and spawn_def.dimension == dimension
|
and spawn_def.dimension == dimension
|
||||||
|
@ -553,8 +691,7 @@ function mcl_mobs.spawn(pos,id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function spawn_group(p,mob,spawn_on,group_max,group_min)
|
local function spawn_group(p,mob,spawn_on,amount_to_spawn)
|
||||||
if not group_min then group_min = 1 end
|
|
||||||
local nn= minetest.find_nodes_in_area_under_air(vector.offset(p,-5,-3,-5),vector.offset(p,5,3,5),spawn_on)
|
local nn= minetest.find_nodes_in_area_under_air(vector.offset(p,-5,-3,-5),vector.offset(p,5,3,5),spawn_on)
|
||||||
local o
|
local o
|
||||||
table.shuffle(nn)
|
table.shuffle(nn)
|
||||||
|
@ -562,9 +699,10 @@ local function spawn_group(p,mob,spawn_on,group_max,group_min)
|
||||||
nn = {}
|
nn = {}
|
||||||
table.insert(nn,p)
|
table.insert(nn,p)
|
||||||
end
|
end
|
||||||
for i = 1, math.random(group_min,group_max) do
|
|
||||||
|
for i = 1, amount_to_spawn do
|
||||||
local sp = vector.offset(nn[math.random(#nn)],0,1,0)
|
local sp = vector.offset(nn[math.random(#nn)],0,1,0)
|
||||||
if spawn_check(nn[math.random(#nn)],mob,true) then
|
if spawn_check(nn[math.random(#nn)],mob) then
|
||||||
if mob.type_of_spawning == "water" then
|
if mob.type_of_spawning == "water" then
|
||||||
sp = get_water_spawn(sp)
|
sp = get_water_spawn(sp)
|
||||||
end
|
end
|
||||||
|
@ -655,25 +793,113 @@ if mobs_spawn then
|
||||||
-- Get pos to spawn, x and z are randomised, y is range
|
-- Get pos to spawn, x and z are randomised, y is range
|
||||||
|
|
||||||
|
|
||||||
local function spawn_a_mob(pos, dimension, y_min, y_max)
|
local function mob_cap_space (pos, mob_type, mob_counts_close, mob_counts_wide)
|
||||||
--create a disconnected clone of the spawn dictionary
|
|
||||||
--prevents memory leak
|
-- Some mob examples
|
||||||
|
--type = "monster", spawn_class = "hostile",
|
||||||
|
--type = "animal", spawn_class = "passive",
|
||||||
|
--local cod = { type = "animal", spawn_class = "water",
|
||||||
|
|
||||||
|
local type_cap = mob_cap[mob_type] or MISSING_CAP_DEFAULT
|
||||||
|
local close_zone_cap = MOBS_CAP_CLOSE
|
||||||
|
|
||||||
|
local mob_total_wide = mob_counts_wide[mob_type]
|
||||||
|
if not mob_total_wide then
|
||||||
|
--mcl_log("none of type found. set as 0")
|
||||||
|
mob_total_wide = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local cap_space_wide = type_cap - mob_total_wide
|
||||||
|
if cap_space_wide < 1 then
|
||||||
|
cap_space_wide = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local mob_total_close = mob_counts_close[mob_type]
|
||||||
|
if not mob_total_close then
|
||||||
|
--mcl_log("none of type found. set as 0")
|
||||||
|
mob_total_close = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local cap_space_close = close_zone_cap - mob_total_close
|
||||||
|
if cap_space_close < 1 then
|
||||||
|
cap_space_close = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
--mcl_log("spawn_class: " .. spawn_class)
|
||||||
|
|
||||||
|
if false and mob_type == "water" then
|
||||||
|
mcl_log("mob_type: " .. mob_type .. " and pos: " .. minetest.pos_to_string(pos))
|
||||||
|
mcl_log("wide: " .. mob_total_wide .. "/" .. type_cap)
|
||||||
|
mcl_log("cap_space_wide: " .. cap_space_wide)
|
||||||
|
mcl_log("close: " .. mob_total_close .. "/" .. close_zone_cap)
|
||||||
|
mcl_log("cap_space_close: " .. cap_space_close)
|
||||||
|
end
|
||||||
|
|
||||||
|
return cap_space_wide, cap_space_close
|
||||||
|
end
|
||||||
|
|
||||||
|
local function find_spawning_position(pos, max_times)
|
||||||
|
local spawning_position
|
||||||
|
|
||||||
|
local max_loops = 1
|
||||||
|
if max_times then max_loops = max_times end
|
||||||
|
|
||||||
|
local y_min, y_max = decypher_limits(pos.y)
|
||||||
|
|
||||||
|
mcl_log("mapgen_limit: " .. SPAWN_MAPGEN_LIMIT)
|
||||||
|
local i = 0
|
||||||
|
repeat
|
||||||
|
local goal_pos = get_next_mob_spawn_pos(pos)
|
||||||
|
|
||||||
|
if math.abs(goal_pos.x) <= SPAWN_MAPGEN_LIMIT and math.abs(pos.y) <= SPAWN_MAPGEN_LIMIT and math.abs(goal_pos.z) <= SPAWN_MAPGEN_LIMIT then
|
||||||
|
local spawning_position_list = find_nodes_in_area_under_air(
|
||||||
|
{x = goal_pos.x, y = y_min, z = goal_pos.z},
|
||||||
|
{x = goal_pos.x, y = y_max, z = goal_pos.z},
|
||||||
|
{"group:solid", "group:water", "group:lava"}
|
||||||
|
)
|
||||||
|
if #spawning_position_list > 0 then
|
||||||
|
mcl_log("Spawning positions available: " .. minetest.pos_to_string(goal_pos))
|
||||||
|
spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
|
||||||
|
else
|
||||||
|
mcl_log("Spawning position isn't good. Do not spawn: " .. minetest.pos_to_string(goal_pos))
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
mcl_log("Pos outside mapgen limits: " .. minetest.pos_to_string(goal_pos))
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
i = i + 1
|
||||||
|
if i >= max_loops then
|
||||||
|
mcl_log("Cancel finding spawn positions at: " .. max_loops)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
until spawning_position
|
||||||
|
return spawning_position
|
||||||
|
end
|
||||||
|
|
||||||
|
local function spawn_a_mob(pos)
|
||||||
|
--create a disconnected clone of the spawn dictionary, prevents memory leak
|
||||||
local mob_library_worker_table = table_copy(spawn_dictionary)
|
local mob_library_worker_table = table_copy(spawn_dictionary)
|
||||||
local goal_pos = get_next_mob_spawn_pos(pos)
|
|
||||||
|
local spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES)
|
||||||
|
if not spawning_position then
|
||||||
|
minetest.log("action", "[Mobs spawn] Cannot find a valid spawn position after retries: " .. FIND_SPAWN_POS_RETRIES)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("spawn_class", spawning_position)
|
||||||
|
--output_mob_stats(mob_counts_close, total_mobs)
|
||||||
|
--output_mob_stats(mob_counts_wide)
|
||||||
|
|
||||||
--grab mob that fits into the spawning location
|
--grab mob that fits into the spawning location
|
||||||
--randomly grab a mob, don't exclude any possibilities
|
--randomly grab a mob, don't exclude any possibilities
|
||||||
local spawning_position_list = find_nodes_in_area_under_air(
|
|
||||||
{x = goal_pos.x, y = y_min, z = goal_pos.z},
|
|
||||||
{x = goal_pos.x, y = y_max, z = goal_pos.z},
|
|
||||||
{"group:solid", "group:water", "group:lava"}
|
|
||||||
)
|
|
||||||
if #spawning_position_list <= 0 then return end
|
|
||||||
local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
|
|
||||||
|
|
||||||
perlin_noise = perlin_noise or minetest_get_perlin(noise_params)
|
perlin_noise = perlin_noise or minetest_get_perlin(noise_params)
|
||||||
local noise = perlin_noise:get_3d(spawning_position)
|
local noise = perlin_noise:get_3d(spawning_position)
|
||||||
local current_summary_chance = summary_chance
|
local current_summary_chance = summary_chance
|
||||||
|
|
||||||
table.shuffle(mob_library_worker_table)
|
table.shuffle(mob_library_worker_table)
|
||||||
|
|
||||||
while #mob_library_worker_table > 0 do
|
while #mob_library_worker_table > 0 do
|
||||||
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
|
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
|
||||||
local mob_index = 1
|
local mob_index = 1
|
||||||
|
@ -684,39 +910,95 @@ if mobs_spawn then
|
||||||
mob_chance = mob_library_worker_table[mob_index].chance
|
mob_chance = mob_library_worker_table[mob_index].chance
|
||||||
step_chance = step_chance + mob_chance
|
step_chance = step_chance + mob_chance
|
||||||
end
|
end
|
||||||
local mob_def = mob_library_worker_table[mob_index]
|
|
||||||
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
|
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
|
||||||
|
|
||||||
|
local mob_def = mob_library_worker_table[mob_index]
|
||||||
if mob_def and mob_def.name and minetest.registered_entities[mob_def.name] then
|
if mob_def and mob_def.name and minetest.registered_entities[mob_def.name] then
|
||||||
local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4
|
|
||||||
local spawn_in_group_min = minetest.registered_entities[mob_def.name].spawn_in_group_min or 1
|
local mob_def_ent = minetest.registered_entities[mob_def.name]
|
||||||
local mob_type = minetest.registered_entities[mob_def.name].type
|
--local mob_type = mob_def_ent.type
|
||||||
if spawn_check(spawning_position,mob_def) then
|
local mob_spawn_class = mob_def_ent.spawn_class
|
||||||
if mob_def.type_of_spawning == "water" then
|
|
||||||
spawning_position = get_water_spawn(spawning_position)
|
--mcl_log("mob_spawn_class: " .. mob_spawn_class)
|
||||||
if not spawning_position then
|
|
||||||
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
|
local cap_space_wide, cap_space_close = mob_cap_space (spawning_position, mob_spawn_class, mob_counts_close, mob_counts_wide)
|
||||||
|
|
||||||
|
|
||||||
|
if cap_space_close > 0 and cap_space_wide > 0 then
|
||||||
|
--mcl_log("Cap space available")
|
||||||
|
|
||||||
|
-- Spawn caps for animals and water creatures fill up rapidly. Need to throttle this somewhat
|
||||||
|
-- for performance and for early game challenge. We don't want to reduce hostiles though.
|
||||||
|
local spawn_hostile = (mob_spawn_class == "hostile")
|
||||||
|
local spawn_passive = (mob_spawn_class ~= "hostile") and math.random(100) < peaceful_percentage_spawned
|
||||||
|
-- or not hostile
|
||||||
|
--mcl_log("Spawn_passive: " .. tostring(spawn_passive))
|
||||||
|
--mcl_log("Spawn_hostile: " .. tostring(spawn_hostile))
|
||||||
|
|
||||||
|
if (spawn_hostile or spawn_passive) and spawn_check(spawning_position,mob_def) then
|
||||||
|
if mob_def.type_of_spawning == "water" then
|
||||||
|
spawning_position = get_water_spawn(spawning_position)
|
||||||
|
if not spawning_position then
|
||||||
|
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if mob_def_ent.can_spawn and not mob_def_ent.can_spawn(spawning_position) then
|
||||||
|
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
|
||||||
if minetest.registered_entities[mob_def.name].can_spawn and not minetest.registered_entities[mob_def.name].can_spawn(spawning_position) then
|
|
||||||
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
--everything is correct, spawn mob
|
|
||||||
local object
|
|
||||||
if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then
|
|
||||||
if logging then
|
|
||||||
minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
|
|
||||||
end
|
|
||||||
object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min)
|
|
||||||
|
|
||||||
else
|
--everything is correct, spawn mob
|
||||||
if logging then
|
local spawn_in_group = mob_def_ent.spawn_in_group or 4
|
||||||
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
|
|
||||||
|
local spawn_group_hostile = (mob_spawn_class == "hostile") and (math.random(100) < hostile_group_percentage_spawned)
|
||||||
|
local spawn_group_passive = (mob_spawn_class ~= "hostile") and (math.random(100) < peaceful_group_percentage_spawned)
|
||||||
|
|
||||||
|
mcl_log("spawn_group_hostile: " .. tostring(spawn_group_hostile))
|
||||||
|
mcl_log("spawn_group_passive: " .. tostring(spawn_group_passive))
|
||||||
|
|
||||||
|
local spawned
|
||||||
|
if spawn_in_group and (spawn_group_hostile or spawn_group_passive) then
|
||||||
|
local group_min = mob_def_ent.spawn_in_group_min or 1
|
||||||
|
if not group_min then group_min = 1 end
|
||||||
|
|
||||||
|
local amount_to_spawn = math.random(group_min,spawn_in_group)
|
||||||
|
|
||||||
|
if amount_to_spawn > cap_space_wide then
|
||||||
|
mcl_log("Spawning quantity: " .. amount_to_spawn)
|
||||||
|
mcl_log("Throttle amount to cap space: " .. cap_space_wide)
|
||||||
|
amount_to_spawn = cap_space_wide
|
||||||
|
end
|
||||||
|
|
||||||
|
if logging then
|
||||||
|
minetest.log("action", "[mcl_mobs] A group of " ..amount_to_spawn .. " " .. mob_def.name .. " mob spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
|
||||||
|
end
|
||||||
|
spawned = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name}, amount_to_spawn)
|
||||||
|
else
|
||||||
|
if logging then
|
||||||
|
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
|
||||||
|
end
|
||||||
|
spawned = mcl_mobs.spawn(spawning_position, mob_def.name)
|
||||||
end
|
end
|
||||||
object = mcl_mobs.spawn(spawning_position, mob_def.name)
|
|
||||||
|
if spawned then
|
||||||
|
--mcl_log("We have spawned")
|
||||||
|
mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("type", pos)
|
||||||
|
local new_spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES_SUCCESS_RESPIN)
|
||||||
|
if new_spawning_position then
|
||||||
|
mcl_log("Setting new spawning position")
|
||||||
|
spawning_position = new_spawning_position
|
||||||
|
else
|
||||||
|
mcl_log("Cannot set new spawning position")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
mcl_log("Spawn check failed")
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
mcl_log("Cap space full")
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
current_summary_chance = current_summary_chance - mob_chance
|
current_summary_chance = current_summary_chance - mob_chance
|
||||||
table_remove(mob_library_worker_table, mob_index)
|
table_remove(mob_library_worker_table, mob_index)
|
||||||
|
@ -728,22 +1010,24 @@ if mobs_spawn then
|
||||||
|
|
||||||
local timer = 0
|
local timer = 0
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
|
|
||||||
timer = timer + dtime
|
timer = timer + dtime
|
||||||
if timer < 10 then return end
|
if timer < WAIT_FOR_SPAWN_ATTEMPT then return end
|
||||||
timer = 0
|
timer = 0
|
||||||
|
|
||||||
local players = get_connected_players()
|
local players = get_connected_players()
|
||||||
local total_mobs = count_mobs_total_cap()
|
local total_mobs = count_mobs_total_cap()
|
||||||
if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then
|
if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then
|
||||||
minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.")
|
minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.")
|
||||||
return
|
return
|
||||||
end --mob cap per player
|
end --mob cap per player
|
||||||
|
|
||||||
for _, player in pairs(players) do
|
for _, player in pairs(players) do
|
||||||
local pos = player:get_pos()
|
local pos = player:get_pos()
|
||||||
local dimension = mcl_worlds.pos_to_dimension(pos)
|
local dimension = mcl_worlds.pos_to_dimension(pos)
|
||||||
-- ignore void and unloaded area
|
-- ignore void and unloaded area
|
||||||
if dimension ~= "void" and dimension ~= "default" then
|
if dimension ~= "void" and dimension ~= "default" then
|
||||||
local y_min, y_max = decypher_limits(pos.y)
|
spawn_a_mob(pos)
|
||||||
spawn_a_mob(pos, dimension, y_min, y_max)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -775,27 +1059,16 @@ function mob_class:check_despawn(pos, dtime)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
minetest.register_chatcommand("mobstats",{
|
minetest.register_chatcommand("mobstats",{
|
||||||
privs = { debug = true },
|
privs = { debug = true },
|
||||||
func = function(n,param)
|
func = function(n,param)
|
||||||
minetest.chat_send_player(n,dump(dbg_spawn_counts))
|
--minetest.chat_send_player(n,dump(dbg_spawn_counts))
|
||||||
local pos = minetest.get_player_by_name(n):get_pos()
|
local pos = minetest.get_player_by_name(n):get_pos()
|
||||||
minetest.chat_send_player(n,"mobs within 32 radius of player:"..count_mobs(pos,32))
|
minetest.chat_send_player(n,"mobs: within 32 radius of player/total loaded :"..count_mobs(pos,MOB_CAP_INNER_RADIUS) .. "/" .. count_mobs_total())
|
||||||
minetest.chat_send_player(n,"total mobs:"..count_mobs_total())
|
minetest.chat_send_player(n,"spawning attempts since server start:" .. dbg_spawn_succ .. "/" .. dbg_spawn_attempts)
|
||||||
minetest.chat_send_player(n,"spawning attempts since server start:"..dbg_spawn_attempts)
|
|
||||||
minetest.chat_send_player(n,"successful spawns since server start:"..dbg_spawn_succ)
|
|
||||||
|
|
||||||
|
|
||||||
local mob_counts, total_mobs = count_mobs_all()
|
|
||||||
if (total_mobs) then
|
|
||||||
minetest.log("action", "Total mobs found: " .. total_mobs)
|
|
||||||
end
|
|
||||||
if mob_counts then
|
|
||||||
for k, v1 in pairs(mob_counts) do
|
|
||||||
minetest.log("action", "k: " .. tostring(k))
|
|
||||||
minetest.log("action", "v1: " .. tostring(v1))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
local mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("name") -- Can use "type"
|
||||||
|
output_mob_stats(mob_counts_wide, total_mobs, true)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
|
@ -207,5 +207,6 @@ mcl_mobs.register_arrow("mobs_mc:blaze_fireball", {
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- spawn eggs
|
mcl_mobs:non_spawn_specific("mobs_mc:blaze", "overworld", 0, 11)
|
||||||
|
-- spawn eggs.
|
||||||
mcl_mobs.register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)
|
mcl_mobs.register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)
|
||||||
|
|
|
@ -40,14 +40,14 @@ local cod = {
|
||||||
xp_max = 3,
|
xp_max = 3,
|
||||||
armor = 100,
|
armor = 100,
|
||||||
rotate = 180,
|
rotate = 180,
|
||||||
spawn_in_group_min = 3,
|
spawn_in_group_min = 2, -- was 3
|
||||||
spawn_in_group = 8,
|
spawn_in_group = 4, -- was 8 nerfed until we can cap them properly locally. this is a group size, not a per spawn attempt
|
||||||
tilt_swim = true,
|
tilt_swim = true,
|
||||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "extra_mobs_cod.b3d",
|
mesh = "extra_mobs_cod.b3d",
|
||||||
textures = {
|
textures = {
|
||||||
{"extra_mobs_cod.png"}
|
{"mobs_mc_cod.png"}
|
||||||
},
|
},
|
||||||
sounds = {
|
sounds = {
|
||||||
},
|
},
|
||||||
|
|
|
@ -14,7 +14,7 @@ local cow_def = {
|
||||||
xp_max = 3,
|
xp_max = 3,
|
||||||
collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45},
|
collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45},
|
||||||
spawn_in_group = 4,
|
spawn_in_group = 4,
|
||||||
spawn_in_group_min = 3,
|
spawn_in_group_min = 2,
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "mobs_mc_cow.b3d",
|
mesh = "mobs_mc_cow.b3d",
|
||||||
textures = { {
|
textures = { {
|
||||||
|
@ -93,8 +93,8 @@ mcl_mobs.register_mob("mobs_mc:cow", cow_def)
|
||||||
-- Mooshroom
|
-- Mooshroom
|
||||||
local mooshroom_def = table.copy(cow_def)
|
local mooshroom_def = table.copy(cow_def)
|
||||||
mooshroom_def.description = S("Mooshroom")
|
mooshroom_def.description = S("Mooshroom")
|
||||||
mooshroom_def.spawn_in_group_min = 4
|
mooshroom_def.spawn_in_group_min = 2
|
||||||
mooshroom_def.spawn_in_group = 8
|
mooshroom_def.spawn_in_group = 4
|
||||||
mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } }
|
mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } }
|
||||||
mooshroom_def.on_rightclick = function(self, clicker)
|
mooshroom_def.on_rightclick = function(self, clicker)
|
||||||
if self:feed_tame(clicker, 1, true, false) then return end
|
if self:feed_tame(clicker, 1, true, false) then return end
|
||||||
|
|
|
@ -42,8 +42,8 @@ local dolphin = {
|
||||||
walk_chance = 100,
|
walk_chance = 100,
|
||||||
breath_max = 120,
|
breath_max = 120,
|
||||||
rotate = 180,
|
rotate = 180,
|
||||||
spawn_in_group_min = 3,
|
spawn_in_group_min = 2, -- was 3
|
||||||
spawn_in_group = 5,
|
spawn_in_group = 4, -- was 4. nerfed until water has own cap, and it represents max pack size rather than per spawn attempt
|
||||||
tilt_swim = true,
|
tilt_swim = true,
|
||||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
|
|
|
@ -174,3 +174,4 @@ mcl_mobs.register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "#252525", "#b31
|
||||||
|
|
||||||
|
|
||||||
mcl_wip.register_wip_item("mobs_mc:enderdragon")
|
mcl_wip.register_wip_item("mobs_mc:enderdragon")
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:enderdragon","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
|
|
|
@ -39,3 +39,4 @@ mcl_mobs.register_mob("mobs_mc:endermite", {
|
||||||
})
|
})
|
||||||
|
|
||||||
mcl_mobs.register_egg("mobs_mc:endermite", S("Endermite"), "#161616", "#6d6d6d", 0)
|
mcl_mobs.register_egg("mobs_mc:endermite", S("Endermite"), "#161616", "#6d6d6d", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:endermite","overworld",0,7)
|
||||||
|
|
|
@ -139,6 +139,6 @@ mcl_mobs.register_arrow("mobs_mc:fireball", {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:ghast","overworld","0","7")
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:ghast", S("Ghast"), "#f9f9f9", "#bcbcbc", 0)
|
mcl_mobs.register_egg("mobs_mc:ghast", S("Ghast"), "#f9f9f9", "#bcbcbc", 0)
|
||||||
|
|
|
@ -25,7 +25,7 @@ local base_psdef = {
|
||||||
local psdefs = {}
|
local psdefs = {}
|
||||||
for i=1,4 do
|
for i=1,4 do
|
||||||
local p = table.copy(base_psdef)
|
local p = table.copy(base_psdef)
|
||||||
p.texture = "extra_mobs_glow_squid_glint"..i..".png"
|
p.texture = "mobs_mc_glow_squid_glint"..i..".png"
|
||||||
table.insert(psdefs,p)
|
table.insert(psdefs,p)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ mcl_mobs.register_mob("mobs_mc:glow_squid", {
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "extra_mobs_glow_squid.b3d",
|
mesh = "extra_mobs_glow_squid.b3d",
|
||||||
textures = {
|
textures = {
|
||||||
{ "extra_mobs_glow_squid.png" }
|
{ "mobs_mc_glow_squid.png" }
|
||||||
},
|
},
|
||||||
sounds = {
|
sounds = {
|
||||||
damage = { name = "mobs_mc_squid_hurt", gain = 0.3 },
|
damage = { name = "mobs_mc_squid_hurt", gain = 0.3 },
|
||||||
|
|
|
@ -131,5 +131,7 @@ minetest.LIGHT_MAX+1,
|
||||||
mcl_vars.mg_nether_min,
|
mcl_vars.mg_nether_min,
|
||||||
mcl_vars.mg_nether_max)
|
mcl_vars.mg_nether_max)
|
||||||
|
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:hoglin","overworld",0,7)
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:hoglin", S("Hoglin"), "#85682e", "#2b2140", 0)
|
mcl_mobs.register_egg("mobs_mc:hoglin", S("Hoglin"), "#85682e", "#2b2140", 0)
|
||||||
|
|
|
@ -125,7 +125,7 @@ local horse = {
|
||||||
type = "animal",
|
type = "animal",
|
||||||
spawn_class = "passive",
|
spawn_class = "passive",
|
||||||
spawn_in_group_min = 2,
|
spawn_in_group_min = 2,
|
||||||
spawn_in_group = 6,
|
spawn_in_group = 4, -- was 6. nerfed until group size is a cap rather than per spawn cycle
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "mobs_mc_horse.b3d",
|
mesh = "mobs_mc_horse.b3d",
|
||||||
visual_size = {x=3.0, y=3.0},
|
visual_size = {x=3.0, y=3.0},
|
||||||
|
|
|
@ -206,3 +206,4 @@ function mobs_mc.check_iron_golem_summon(pos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:iron_golem","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
|
|
|
@ -56,8 +56,8 @@ mcl_mobs.register_mob("mobs_mc:llama", {
|
||||||
shoot_interval = 5.5,
|
shoot_interval = 5.5,
|
||||||
arrow = "mobs_mc:llamaspit",
|
arrow = "mobs_mc:llamaspit",
|
||||||
shoot_offset = 1, --3.5 *would* be a good value visually but it somehow messes with the projectiles trajectory
|
shoot_offset = 1, --3.5 *would* be a good value visually but it somehow messes with the projectiles trajectory
|
||||||
spawn_in_group_min = 4,
|
spawn_in_group_min = 2, -- was 4
|
||||||
spawn_in_group = 6,
|
spawn_in_group = 4, -- was 6 nerfed until we can cap them properly locally. this is a group size, not a per spawn attempt
|
||||||
|
|
||||||
head_swivel = "head.control",
|
head_swivel = "head.control",
|
||||||
bone_eye_height = 11,
|
bone_eye_height = 11,
|
||||||
|
|
|
@ -283,6 +283,7 @@ piglin_brute.group_attack = { "mobs_mc:piglin", "mobs_mc:piglin_brute" }
|
||||||
mcl_mobs.register_mob("mobs_mc:piglin_brute", piglin_brute)
|
mcl_mobs.register_mob("mobs_mc:piglin_brute", piglin_brute)
|
||||||
|
|
||||||
|
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:piglin","overworld",0,7)
|
||||||
-- Regular spawning in the Nether
|
-- Regular spawning in the Nether
|
||||||
mcl_mobs:spawn_specific(
|
mcl_mobs:spawn_specific(
|
||||||
"mobs_mc:piglin",
|
"mobs_mc:piglin",
|
||||||
|
@ -299,7 +300,7 @@ minetest.LIGHT_MAX+1,
|
||||||
3,
|
3,
|
||||||
mcl_vars.mg_lava_nether_max,
|
mcl_vars.mg_lava_nether_max,
|
||||||
mcl_vars.mg_nether_max)
|
mcl_vars.mg_nether_max)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:sword_piglin","overworld",0,7)
|
||||||
mcl_mobs:spawn_specific(
|
mcl_mobs:spawn_specific(
|
||||||
"mobs_mc:sword_piglin",
|
"mobs_mc:sword_piglin",
|
||||||
"nether",
|
"nether",
|
||||||
|
|
|
@ -122,3 +122,4 @@ pillager = {
|
||||||
|
|
||||||
mcl_mobs.register_mob("mobs_mc:pillager", pillager)
|
mcl_mobs.register_mob("mobs_mc:pillager", pillager)
|
||||||
mcl_mobs.register_egg("mobs_mc:pillager", S("Pillager"), "#532f36", "#959b9b", 0)
|
mcl_mobs.register_egg("mobs_mc:pillager", S("Pillager"), "#532f36", "#959b9b", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:pillager","overworld",0,7)
|
||||||
|
|
|
@ -25,7 +25,7 @@ local salmon = {
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "extra_mobs_salmon.b3d",
|
mesh = "extra_mobs_salmon.b3d",
|
||||||
textures = {
|
textures = {
|
||||||
{"extra_mobs_salmon.png"}
|
{"mobs_mc_salmon.png"}
|
||||||
},
|
},
|
||||||
sounds = {
|
sounds = {
|
||||||
},
|
},
|
||||||
|
|
|
@ -178,7 +178,7 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", {
|
||||||
|
|
||||||
|
|
||||||
mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
|
mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
--[[
|
--[[
|
||||||
mcl_mobs:spawn_specific(
|
mcl_mobs:spawn_specific(
|
||||||
"mobs_mc:shulker",
|
"mobs_mc:shulker",
|
||||||
|
|
|
@ -56,3 +56,4 @@ mcl_mobs.register_mob("mobs_mc:silverfish", {
|
||||||
})
|
})
|
||||||
|
|
||||||
mcl_mobs.register_egg("mobs_mc:silverfish", S("Silverfish"), "#6d6d6d", "#313131", 0)
|
mcl_mobs.register_egg("mobs_mc:silverfish", S("Silverfish"), "#6d6d6d", "#313131", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:silverfish","overworld",0,11)
|
||||||
|
|
|
@ -118,3 +118,4 @@ mcl_vars.mg_nether_max)
|
||||||
--]]
|
--]]
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "#141414", "#474d4d", 0)
|
mcl_mobs.register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "#141414", "#474d4d", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:witherskeleton","overworld",0,7)
|
||||||
|
|
|
@ -278,7 +278,6 @@ swamp_light_max,
|
||||||
4,
|
4,
|
||||||
swamp_min,
|
swamp_min,
|
||||||
swamp_max)
|
swamp_max)
|
||||||
|
|
||||||
-- Magma cube
|
-- Magma cube
|
||||||
local magma_cube_big = {
|
local magma_cube_big = {
|
||||||
description = S("Magma Cube"),
|
description = S("Magma Cube"),
|
||||||
|
@ -431,6 +430,11 @@ nether_max)
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "#350000", "#fcfc00")
|
mcl_mobs.register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "#350000", "#fcfc00")
|
||||||
|
|
||||||
|
-- non_spawn_specific is typically for mobs who don't spawn in the overworld, or mobs that don't spawn
|
||||||
|
-- naturally. However, slimes are a particular case where they spawn under different conditions in the same
|
||||||
|
-- dimension.
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:slime_big","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:magma_cube_big","overworld",0, minetest.LIGHT_MAX+1)
|
||||||
mcl_mobs.register_egg("mobs_mc:slime_big", S("Slime"), "#52a03e", "#7ebf6d")
|
mcl_mobs.register_egg("mobs_mc:slime_big", S("Slime"), "#52a03e", "#7ebf6d")
|
||||||
|
|
||||||
-- FIXME: add spawn eggs for small and tiny slimes and magma cubes
|
-- FIXME: add spawn eggs for small and tiny slimes and magma cubes
|
||||||
|
|
|
@ -197,3 +197,4 @@ end
|
||||||
|
|
||||||
-- Spawn egg
|
-- Spawn egg
|
||||||
mcl_mobs.register_egg("mobs_mc:snowman", S("Snow Golem"), "#f2f2f2", "#fd8f47", 0)
|
mcl_mobs.register_egg("mobs_mc:snowman", S("Snow Golem"), "#f2f2f2", "#fd8f47", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:snowman","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
|
|
|
@ -246,3 +246,4 @@ mcl_mobs:spawn_setup({
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:strider", S("Strider"), "#000000", "#FF0000", 0)
|
mcl_mobs.register_egg("mobs_mc:strider", S("Strider"), "#000000", "#FF0000", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:strider","nether",0,minetest.LIGHT_MAX+1)
|
||||||
|
|
|
@ -67,7 +67,7 @@ local tropical_fish = {
|
||||||
xp_min = 1,
|
xp_min = 1,
|
||||||
xp_max = 3,
|
xp_max = 3,
|
||||||
armor = 100,
|
armor = 100,
|
||||||
spawn_in_group = 9,
|
spawn_in_group = 4, -- was 9. nerfed until aquatics use own cap rather than animal, and it represents pack size, not per spawn attempt
|
||||||
tilt_swim = true,
|
tilt_swim = true,
|
||||||
collisionbox = {-0.2, 0.0, -0.2, 0.2, 0.1, 0.2},
|
collisionbox = {-0.2, 0.0, -0.2, 0.2, 0.1, 0.2},
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
|
|
|
@ -95,3 +95,4 @@ mcl_mobs.register_mob("mobs_mc:vex", {
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:vex", S("Vex"), "#7a90a4", "#e8edf1", 0)
|
mcl_mobs.register_egg("mobs_mc:vex", S("Vex"), "#7a90a4", "#e8edf1", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:vex","overworld",0,7)
|
||||||
|
|
|
@ -617,6 +617,13 @@ local function set_textures(self)
|
||||||
self.object:set_properties({textures=badge_textures})
|
self.object:set_properties({textures=badge_textures})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- TODO Pass in self and if nitwit, go to bed later.
|
||||||
|
local function is_night()
|
||||||
|
local tod = minetest.get_timeofday()
|
||||||
|
tod = ( tod * 24000 ) % 24000
|
||||||
|
return tod > 17500 or tod < 6500
|
||||||
|
end
|
||||||
|
|
||||||
function get_activity(tod)
|
function get_activity(tod)
|
||||||
-- night hours = tod > 18541 or tod < 5458
|
-- night hours = tod > 18541 or tod < 5458
|
||||||
if not tod then
|
if not tod then
|
||||||
|
@ -626,8 +633,8 @@ function get_activity(tod)
|
||||||
|
|
||||||
local lunch_start = 11000
|
local lunch_start = 11000
|
||||||
local lunch_end = 13500
|
local lunch_end = 13500
|
||||||
local work_start = 7000
|
local work_start = 7500
|
||||||
local work_end = 16500
|
local work_end = 16000
|
||||||
|
|
||||||
local activity = nil
|
local activity = nil
|
||||||
if weather_mod and mcl_weather.get_weather() == "thunder" then
|
if weather_mod and mcl_weather.get_weather() == "thunder" then
|
||||||
|
@ -635,7 +642,7 @@ function get_activity(tod)
|
||||||
activity = SLEEP
|
activity = SLEEP
|
||||||
elseif (tod > work_start and tod < lunch_start) or (tod > lunch_end and tod < work_end) then
|
elseif (tod > work_start and tod < lunch_start) or (tod > lunch_end and tod < work_end) then
|
||||||
activity = WORK
|
activity = WORK
|
||||||
elseif mcl_beds.is_night() then
|
elseif is_night() then
|
||||||
activity = SLEEP
|
activity = SLEEP
|
||||||
elseif tod > lunch_start and tod < lunch_end then
|
elseif tod > lunch_start and tod < lunch_end then
|
||||||
activity = GATHERING
|
activity = GATHERING
|
||||||
|
@ -829,7 +836,7 @@ local function go_home(entity, sleep)
|
||||||
else
|
else
|
||||||
--minetest.log("Need to walk to home")
|
--minetest.log("Need to walk to home")
|
||||||
end
|
end
|
||||||
end)
|
end, true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1166,6 +1173,7 @@ local function do_work (self)
|
||||||
self.order = nil
|
self.order = nil
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
self:gopath(jobsite, function(self, jobsite)
|
self:gopath(jobsite, function(self, jobsite)
|
||||||
if not self then
|
if not self then
|
||||||
--mcl_log("missing self. not good")
|
--mcl_log("missing self. not good")
|
||||||
|
@ -1309,7 +1317,7 @@ local function do_activity (self)
|
||||||
|
|
||||||
local jobsite_valid = false
|
local jobsite_valid = false
|
||||||
|
|
||||||
if not mcl_beds.is_night() then
|
if not is_night() then
|
||||||
if self.order == SLEEP then self.order = nil end
|
if self.order == SLEEP then self.order = nil end
|
||||||
|
|
||||||
if not validate_jobsite(self) then
|
if not validate_jobsite(self) then
|
||||||
|
@ -2191,4 +2199,5 @@ mobs_mc.water_level+1,
|
||||||
mcl_vars.mg_overworld_max)
|
mcl_vars.mg_overworld_max)
|
||||||
--]]
|
--]]
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:villager","overworld", 0, minetest.LIGHT_MAX+1)
|
||||||
mcl_mobs.register_egg("mobs_mc:villager", S("Villager"), "#563d33", "#bc8b72", 0)
|
mcl_mobs.register_egg("mobs_mc:villager", S("Villager"), "#563d33", "#bc8b72", 0)
|
||||||
|
|
|
@ -90,3 +90,4 @@ mcl_mobs.register_mob("mobs_mc:evoker", {
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:evoker", S("Evoker"), "#959b9b", "#1e1c1a", 0)
|
mcl_mobs.register_egg("mobs_mc:evoker", S("Evoker"), "#959b9b", "#1e1c1a", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:evoker","overworld",0,7)
|
||||||
|
|
|
@ -66,3 +66,4 @@ mcl_mobs.register_mob("mobs_mc:illusioner", {
|
||||||
})
|
})
|
||||||
|
|
||||||
mcl_mobs.register_egg("mobs_mc:illusioner", S("Illusioner"), "#3f5cbb", "#8a8686", 0)
|
mcl_mobs.register_egg("mobs_mc:illusioner", S("Illusioner"), "#3f5cbb", "#8a8686", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:illusioner","overworld",0,7)
|
||||||
|
|
|
@ -78,3 +78,4 @@ mcl_mobs.register_mob("mobs_mc:vindicator", {
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:vindicator", S("Vindicator"), "#959b9b", "#275e61", 0)
|
mcl_mobs.register_egg("mobs_mc:vindicator", S("Vindicator"), "#959b9b", "#275e61", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:vindicator","overworld",0,7)
|
||||||
|
|
|
@ -106,5 +106,5 @@ mcl_mobs.register_arrow("mobs_mc:potion_arrow", {
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:witch", S("Witch"), "#340000", "#51a03e", 0, true)
|
mcl_mobs.register_egg("mobs_mc:witch", S("Witch"), "#340000", "#51a03e", 0, true)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:witch","overworld",0,7)
|
||||||
mcl_wip.register_wip_item("mobs_mc:witch")
|
mcl_wip.register_wip_item("mobs_mc:witch")
|
||||||
|
|
|
@ -132,3 +132,4 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", {
|
||||||
mcl_mobs.register_egg("mobs_mc:wither", S("Wither"), "#4f4f4f", "#4f4f4f", 0, true)
|
mcl_mobs.register_egg("mobs_mc:wither", S("Wither"), "#4f4f4f", "#4f4f4f", 0, true)
|
||||||
|
|
||||||
mcl_wip.register_wip_item("mobs_mc:wither")
|
mcl_wip.register_wip_item("mobs_mc:wither")
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:wither","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
|
|
|
@ -153,3 +153,4 @@ mcl_vars.mg_nether_max)
|
||||||
|
|
||||||
-- spawn eggs
|
-- spawn eggs
|
||||||
mcl_mobs.register_egg("mobs_mc:pigman", S("Zombie Pigman"), "#ea9393", "#4c7129", 0)
|
mcl_mobs.register_egg("mobs_mc:pigman", S("Zombie Pigman"), "#ea9393", "#4c7129", 0)
|
||||||
|
mcl_mobs:non_spawn_specific("mobs_mc:pigman","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
|
|
|
@ -226,7 +226,7 @@ if mcl_weather.allow_abm then
|
||||||
}
|
}
|
||||||
for a=1, #around do
|
for a=1, #around do
|
||||||
local apos = vector.add(pos, around[a])
|
local apos = vector.add(pos, around[a])
|
||||||
if mcl_weather.is_outdoor(apos) then
|
if mcl_weather.is_outdoor(apos) and mcl_weather.has_rain(apos) then
|
||||||
minetest.remove_node(pos)
|
minetest.remove_node(pos)
|
||||||
minetest.sound_play("fire_extinguish_flame", {pos = pos, max_hear_distance = 8, gain = 0.1}, true)
|
minetest.sound_play("fire_extinguish_flame", {pos = pos, max_hear_distance = 8, gain = 0.1}, true)
|
||||||
return
|
return
|
||||||
|
@ -244,7 +244,7 @@ if mcl_weather.allow_abm then
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
-- Rain is equivalent to a water bottle
|
-- Rain is equivalent to a water bottle
|
||||||
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
|
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) and mcl_weather.has_rain(pos) then
|
||||||
if node.name == "mcl_cauldrons:cauldron" then
|
if node.name == "mcl_cauldrons:cauldron" then
|
||||||
minetest.set_node(pos, {name="mcl_cauldrons:cauldron_1"})
|
minetest.set_node(pos, {name="mcl_cauldrons:cauldron_1"})
|
||||||
elseif node.name == "mcl_cauldrons:cauldron_1" then
|
elseif node.name == "mcl_cauldrons:cauldron_1" then
|
||||||
|
@ -267,7 +267,7 @@ if mcl_weather.allow_abm then
|
||||||
interval = 22.0,
|
interval = 22.0,
|
||||||
chance = 3,
|
chance = 3,
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
|
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) and mcl_weather.has_rain(pos) then
|
||||||
if node.name == "mcl_farming:soil" then
|
if node.name == "mcl_farming:soil" then
|
||||||
minetest.set_node(pos, {name="mcl_farming:soil_wet"})
|
minetest.set_node(pos, {name="mcl_farming:soil_wet"})
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
local mods_loaded = false
|
local mods_loaded = false
|
||||||
local NIGHT_VISION_RATIO = 0.45
|
local NIGHT_VISION_RATIO = 0.45
|
||||||
|
|
||||||
local water_color = "#0b4880"
|
local water_color = "#3F76E4"
|
||||||
|
|
||||||
local mg_name = minetest.get_mapgen_setting("mg_name")
|
local mg_name = minetest.get_mapgen_setting("mg_name")
|
||||||
|
|
||||||
|
@ -125,7 +125,14 @@ mcl_weather.skycolor = {
|
||||||
local pos = player:get_pos()
|
local pos = player:get_pos()
|
||||||
local dim = mcl_worlds.pos_to_dimension(pos)
|
local dim = mcl_worlds.pos_to_dimension(pos)
|
||||||
local has_weather = (mcl_worlds.has_weather(pos) and (mcl_weather.state == "snow" or mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_snow(pos)) or ((mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_rain(pos))
|
local has_weather = (mcl_worlds.has_weather(pos) and (mcl_weather.state == "snow" or mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_snow(pos)) or ((mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_rain(pos))
|
||||||
if minetest.get_item_group(minetest.get_node(vector.new(pos.x,pos.y+1.5,pos.z)).name, "water") ~= 0 then
|
local checkname = minetest.get_node(vector.new(pos.x,pos.y+1.5,pos.z)).name
|
||||||
|
if minetest.get_item_group(checkname, "water") ~= 0 then
|
||||||
|
local biome_index = minetest.get_biome_data(player:get_pos()).biome
|
||||||
|
local biome_name = minetest.get_biome_name(biome_index)
|
||||||
|
local biome = minetest.registered_biomes[biome_name]
|
||||||
|
if biome then water_color = biome._mcl_waterfogcolor end
|
||||||
|
if not biome then water_color = "#3F76E4" end
|
||||||
|
if checkname == "mclx_core:river_water_source" or checkname == "mclx_core:river_water_flowing" then water_color = "#0084FF" end
|
||||||
player:set_sky({ type = "regular",
|
player:set_sky({ type = "regular",
|
||||||
sky_color = {
|
sky_color = {
|
||||||
day_sky = water_color,
|
day_sky = water_color,
|
||||||
|
|
|
@ -297,7 +297,7 @@ awards.register_achievement("mcl:whatAdeal", {
|
||||||
awards.register_achievement("mcl:tacticalFishing", {
|
awards.register_achievement("mcl:tacticalFishing", {
|
||||||
title = S("Tactical Fishing"),
|
title = S("Tactical Fishing"),
|
||||||
description = S("Catch a fish... without a fishing rod!"),
|
description = S("Catch a fish... without a fishing rod!"),
|
||||||
icon = "pufferfish_bucket.png",
|
icon = "mcl_buckets_pufferfish_bucket.png",
|
||||||
type = "Advancement",
|
type = "Advancement",
|
||||||
group = "Husbandry",
|
group = "Husbandry",
|
||||||
})
|
})
|
||||||
|
@ -305,7 +305,7 @@ awards.register_achievement("mcl:tacticalFishing", {
|
||||||
awards.register_achievement("mcl:cutestPredator", {
|
awards.register_achievement("mcl:cutestPredator", {
|
||||||
title = S("The Cutest Predator"),
|
title = S("The Cutest Predator"),
|
||||||
description = S("Catch an Axolotl with a bucket!"),
|
description = S("Catch an Axolotl with a bucket!"),
|
||||||
icon = "axolotl_bucket.png",
|
icon = "mcl_buckets_axolotl_bucket.png",
|
||||||
type = "Advancement",
|
type = "Advancement",
|
||||||
group = "Husbandry",
|
group = "Husbandry",
|
||||||
})
|
})
|
||||||
|
|
|
@ -225,8 +225,8 @@ local woods = {
|
||||||
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Button") },
|
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Button") },
|
||||||
|
|
||||||
{ "mangrove_wood", "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png", S("Mangrove Button") },
|
{ "mangrove_wood", "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png", S("Mangrove Button") },
|
||||||
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "crimson_hyphae_wood.png", S("Crimson Button") },
|
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "mcl_crimson_crimson_hyphae_wood.png", S("Crimson Button") },
|
||||||
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "warped_hyphae_wood.png", S("Warped Button") },
|
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "mcl_crimson_warped_hyphae_wood.png", S("Warped Button") },
|
||||||
}
|
}
|
||||||
|
|
||||||
for w=1, #woods do
|
for w=1, #woods do
|
||||||
|
|
|
@ -477,6 +477,19 @@ mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_black")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue")
|
||||||
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink")
|
||||||
|
-- Bamboo
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_endcap")
|
||||||
|
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_1")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_2")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_3")
|
||||||
|
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_door")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_trapdoor")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_signs:wall_sign_bamboo")
|
||||||
|
mesecon.register_mvps_unsticky("mcl_bamboo:scaffolding")
|
||||||
|
|
||||||
-- Beds
|
-- Beds
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_black_top")
|
mesecon.register_mvps_unsticky("mcl_beds:bed_black_top")
|
||||||
mesecon.register_mvps_unsticky("mcl_beds:bed_black_bottom")
|
mesecon.register_mvps_unsticky("mcl_beds:bed_black_bottom")
|
||||||
|
|
|
@ -223,8 +223,8 @@ local woods = {
|
||||||
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Pressure Plate") },
|
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Pressure Plate") },
|
||||||
|
|
||||||
{ "mangrove_wood", "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png", S("Mangrove Pressure Plate") },
|
{ "mangrove_wood", "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png", S("Mangrove Pressure Plate") },
|
||||||
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "crimson_hyphae_wood.png", S("Crimson Pressure Plate") },
|
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "mcl_crimson_crimson_hyphae_wood.png", S("Crimson Pressure Plate") },
|
||||||
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "warped_hyphae_wood.png", S("Warped Pressure Plate") },
|
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "mcl_crimson_warped_hyphae_wood.png", S("Warped Pressure Plate") },
|
||||||
}
|
}
|
||||||
|
|
||||||
for w=1, #woods do
|
for w=1, #woods do
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# textdomain: mcl_amethyst
|
||||||
|
Amethyst Cluster=Aglomerado de Ametista
|
||||||
|
Amethyst Cluster is the final growth of amethyst bud.=O aglomerado de ametista é o final do crescimento do broto de ametista.
|
||||||
|
Amethyst Shard=Fragmento de Ametista
|
||||||
|
An amethyst shard is a crystalline mineral.=Um fragmento de ametista é um mineral cristalino.
|
||||||
|
Block of Amethyst=Bloco de Ametista
|
||||||
|
Budding Amethyst=Ametista Brotando
|
||||||
|
Calcite=Calcita
|
||||||
|
Calcite can be found as part of amethyst geodes.=Calcita pode ser encontrada como parte dos geodos de ametista.
|
||||||
|
Large Amethyst Bud=Broto de Ametista Grande
|
||||||
|
Large Amethyst Bud is the third growth of amethyst bud.=Broto de Ametista Grande é a terceira etapa de crescimento do broto de ametista.
|
||||||
|
Medium Amethyst Bud=Broto de Ametista Médio
|
||||||
|
Medium Amethyst Bud is the second growth of amethyst bud.=Broto de Ametista Médio é a segunda etapa de crescimento do broto de ametista.
|
||||||
|
Small Amethyst Bud=Broto de Ametista Pequeno
|
||||||
|
Small Amethyst Bud is the first growth of amethyst bud.=Broto de Ametista Pequeno é a primeira etapa de crescimento do broto de ametista.
|
||||||
|
The Block of Amethyst is a decoration block crafted from amethyst shards.=O bloco de ametista é um bloco decorativo feito a partir de fragmentos de ametista.
|
||||||
|
The Budding Amethyst can grow amethyst=A ametista brotando pode crescer ametista.
|
||||||
|
Tinted Glass=Vidro Tingido
|
||||||
|
Tinted Glass is a type of glass which blocks lights while it is visually transparent.=Vidro tingido é um tipo de vidro que bloqueia luzes enquanto é visualmente transparente.
|
|
@ -0,0 +1,16 @@
|
||||||
|
# textdomain: mcl_anvils
|
||||||
|
Set Name=Colocar nome
|
||||||
|
Repair and Name=Reparar e Nomear
|
||||||
|
Inventory=Inventário
|
||||||
|
Anvil=Bigorna
|
||||||
|
The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=A bigorna permite você reparar ferramentas e armaduras e nomear itens. No entanto, possui uma durabilidade limitada. Não a deixe cair sob sua cabeça, pode ser doloroso!
|
||||||
|
To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Para usar a bigorna, aperte-a com o botão direito. Uma bigorna possui 2 espaços de entrada (a esquerda) e um espaço de saída.
|
||||||
|
To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Para renomear itens, coloque-o em um espaço de entrada enquanto mantém o outro vazio. Digite um nome e aperte enter ou "Colocar nome". Retire o item renomeado do espaço de saída.
|
||||||
|
There are two possibilities to repair tools (and armor):=Há duas possibilidades de reparar ferramentas (e armaduras):
|
||||||
|
• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.= Ferramenta + Ferramenta: Coloque duas ferramentas do mesmo tipo nos espaços de entrada. A durabilidade da ferramenta reparada é a soma da durabilidade de ambas ferramentas utilizadas acrescido de um bônus de 12%.
|
||||||
|
• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=Ferramenta + Material: Algumas ferramentas também podem ser reparadas combinando com o material da qual ela é feita. Por exemplo, picaretas de ferro podem ser reparadas com lingotes de ferro. Este repara a ferramenta por 25%.
|
||||||
|
Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Armadura conta como uma ferramenta. É possível reparar e nomear uma ferramenta em uma única etapa.
|
||||||
|
Slightly Damaged Anvil=Bigorna danificada
|
||||||
|
The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=A bigorna tem durabilidade limitada e 3 níveis de dano: não danificada, danificada, muito danificada. Toda vez que você reparar ou nomear algo, há uma chance de 12% da bigorna ser danificada. Bigornas também possuem uma chance de serem danificadas quando cai por mais de 1 bloco. Se uma bigorna muito danificada sofre dano, ela é destruída.
|
||||||
|
Very Damaged Anvil=Bigorna muito danificada
|
||||||
|
Repair and rename items=Reparar e renomear itens
|
|
@ -0,0 +1,48 @@
|
||||||
|
# textdomain: mcl_armor
|
||||||
|
This is a piece of equippable armor which reduces the amount of damage you receive.=
|
||||||
|
To equip it, put it on the corresponding armor slot in your inventory menu.=
|
||||||
|
Leather Cap=Chapéu de Couro
|
||||||
|
Iron Helmet=Capacete de Ferro
|
||||||
|
Golden Helmet=Capacete de Ouro
|
||||||
|
Diamond Helmet=Capacete de Diamante
|
||||||
|
Chain Helmet=Capacete de Cota de Malha
|
||||||
|
Netherite Helmet=Capacete de Netherite
|
||||||
|
Leather Tunic=Túnica de Couro
|
||||||
|
Iron Chestplate=Peitoral de Ferro
|
||||||
|
Golden Chestplate=Peitoral de Ouro
|
||||||
|
Diamond Chestplate=Peitoral de Diamante
|
||||||
|
Chain Chestplate=Peitoral de Cota de Malha
|
||||||
|
Netherite Chestplate=Peitoral de Netherite
|
||||||
|
Leather Pants=Calças de Couro
|
||||||
|
Iron Leggings=Perneiras de Ferro
|
||||||
|
Golden Leggings=Perneiras de Ouro
|
||||||
|
Diamond Leggings=Perneiras de Diamante
|
||||||
|
Chain Leggings=Perneiras de Cota de Malha
|
||||||
|
Netherite Leggings=Perneiras de Netherite
|
||||||
|
Leather Boots=Botas de Couro
|
||||||
|
Iron Boots=Botas de Ferro
|
||||||
|
Golden Boots=Botas de Ouro
|
||||||
|
Diamond Boots=Botas de Diamante
|
||||||
|
Chain Boots=Botas de Cota de Malha
|
||||||
|
Netherite Boots=Botas de Netherite
|
||||||
|
Elytra=Elytra
|
||||||
|
|
||||||
|
#Translations of enchantements
|
||||||
|
Increases underwater mining speed.=Aumenta a velocidade de mineração subaquática.
|
||||||
|
Blast Protection=Proteção Contra Explosão
|
||||||
|
Reduces explosion damage and knockback.=Reduz o dano e recúo de explosões.
|
||||||
|
Curse of Binding=Maldição do Vínculo
|
||||||
|
Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Item não pode ser removido do espaço de armadura, exceto devido à morte, quebra ou no Modo Criativo.
|
||||||
|
Feather Falling=Pena Caindo
|
||||||
|
Reduces fall damage.=Reduz o dano de quedas.
|
||||||
|
Fire Protection=Proteçao Contra Fogo
|
||||||
|
Reduces fire damage.=Reduz o dano causado por fogo.
|
||||||
|
Shooting consumes no regular arrows.=Disparar não consome flechas normais.
|
||||||
|
Shoot 3 arrows at the cost of one.=Dispare 3 flechas ao custo de uma.
|
||||||
|
Projectile Protection=Proteção Contra Projéteis
|
||||||
|
Reduces projectile damage.=Reduz o dano causado por projéteis.
|
||||||
|
Protection=Proteção
|
||||||
|
Reduces most types of damage by 4% for each level.=Reduz a maioria dos tipos de dano por 4% para cada nível.
|
||||||
|
Thorns=Espinhos
|
||||||
|
Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflete parte do dano tomado aos custos de reduzir a durabilidade com cada uso.
|
||||||
|
Aqua Affinity=Afinidade Aqua
|
|
@ -51,8 +51,8 @@ minetest.register_node("mcl_armor_stand:armor_stand", {
|
||||||
_doc_items_usagehelp = S("Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand."),
|
_doc_items_usagehelp = S("Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand."),
|
||||||
drawtype = "mesh",
|
drawtype = "mesh",
|
||||||
mesh = "3d_armor_stand.obj",
|
mesh = "3d_armor_stand.obj",
|
||||||
inventory_image = "3d_armor_stand_item.png",
|
inventory_image = "mcl_armor_stand_item.png",
|
||||||
wield_image = "3d_armor_stand_item.png",
|
wield_image = "mcl_armor_stand_item.png",
|
||||||
tiles = {"default_wood.png", "mcl_stairs_stone_slab_top.png"},
|
tiles = {"default_wood.png", "mcl_stairs_stone_slab_top.png"},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
# textdomain: mcl_armor_stand
|
||||||
|
Armor Stand=Suporte de Armadura
|
||||||
|
An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=O suporte de armadura é um objeto decorativo que pode exibir diferentes partes de armadura. Qualquer coisa que o jogador pode vestir como armadura também pode ser colocado no suporte de armadura.
|
||||||
|
Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Apenas coloque um item de armadura no suporte de armadura. Para retirar a peça de armadura superior do suporte de armadura, selecione suas mãos e aperte o botão de colocar no suporte de armadura.
|
||||||
|
Displays pieces of armor=Exibe peças de armadura
|
|
@ -29,7 +29,7 @@ local bamboo_def = {
|
||||||
tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo.png"},
|
tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo.png"},
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
groups = {handy = 1, axey = 1, choppy = 1, flammable = 3},
|
groups = {handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3},
|
||||||
sounds = node_sound,
|
sounds = node_sound,
|
||||||
|
|
||||||
drop = {
|
drop = {
|
||||||
|
@ -293,7 +293,6 @@ local bamboo_block_def = {
|
||||||
|
|
||||||
return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
|
return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
|
||||||
end,
|
end,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.register_node("mcl_bamboo:bamboo_block", bamboo_block_def)
|
minetest.register_node("mcl_bamboo:bamboo_block", bamboo_block_def)
|
||||||
|
|
|
@ -35,9 +35,9 @@ if minetest.get_modpath("mcl_flowerpots") then
|
||||||
if mcl_flowerpots ~= nil then
|
if mcl_flowerpots ~= nil then
|
||||||
-- Flower-potted Bamboo...
|
-- Flower-potted Bamboo...
|
||||||
local flwr_name = BAMBOO
|
local flwr_name = BAMBOO
|
||||||
local flwr_def = {name = "bamboo_plant",
|
local flwr_def = { name = "bamboo_plant",
|
||||||
desc = S("Bamboo"),
|
desc = S("Bamboo"),
|
||||||
image = "mcl_bamboo_bamboo_fpm.png", -- use with "register_potted_cube"
|
image = "mcl_bamboo_bamboo_fpm.png", -- use with "register_potted_cube"
|
||||||
-- "mcl_bamboo_flower_pot.png", -- use with "register_potted_flower"
|
-- "mcl_bamboo_flower_pot.png", -- use with "register_potted_flower"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,11 +53,11 @@ if minetest.get_modpath("mcl_doors") then
|
||||||
local bot_door_tiles = {}
|
local bot_door_tiles = {}
|
||||||
|
|
||||||
if BROKEN_DOORS then
|
if BROKEN_DOORS then
|
||||||
top_door_tiles = {"mcl_bamboo_door_top_alt.png", "mcl_bamboo_door_top.png"}
|
top_door_tiles = { "mcl_bamboo_door_top_alt.png", "mcl_bamboo_door_top.png" }
|
||||||
bot_door_tiles = {"mcl_bamboo_door_bottom_alt.png", "mcl_bamboo_door_bottom.png"}
|
bot_door_tiles = { "mcl_bamboo_door_bottom_alt.png", "mcl_bamboo_door_bottom.png" }
|
||||||
else
|
else
|
||||||
top_door_tiles = {"mcl_bamboo_door_top.png", "mcl_bamboo_door_top.png"}
|
top_door_tiles = { "mcl_bamboo_door_top.png", "mcl_bamboo_door_top.png" }
|
||||||
bot_door_tiles = {"mcl_bamboo_door_bottom.png", "mcl_bamboo_door_bottom.png"}
|
bot_door_tiles = { "mcl_bamboo_door_bottom.png", "mcl_bamboo_door_bottom.png" }
|
||||||
end
|
end
|
||||||
|
|
||||||
local name = "mcl_bamboo:bamboo_door"
|
local name = "mcl_bamboo:bamboo_door"
|
||||||
|
@ -65,7 +65,7 @@ if minetest.get_modpath("mcl_doors") then
|
||||||
description = S("Bamboo Door."),
|
description = S("Bamboo Door."),
|
||||||
inventory_image = "mcl_bamboo_door_wield.png",
|
inventory_image = "mcl_bamboo_door_wield.png",
|
||||||
wield_image = "mcl_bamboo_door_wield.png",
|
wield_image = "mcl_bamboo_door_wield.png",
|
||||||
groups = {handy = 1, axey = 1, material_wood = 1, flammable = -1},
|
groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 },
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
_mcl_blast_resistance = 3,
|
_mcl_blast_resistance = 3,
|
||||||
tiles_bottom = bot_door_tiles,
|
tiles_bottom = bot_door_tiles,
|
||||||
|
@ -86,7 +86,7 @@ if minetest.get_modpath("mcl_doors") then
|
||||||
_doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."),
|
_doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."),
|
||||||
wield_image = "mcl_bamboo_trapdoor_side.png",
|
wield_image = "mcl_bamboo_trapdoor_side.png",
|
||||||
inventory_image = "mcl_bamboo_trapdoor_side.png",
|
inventory_image = "mcl_bamboo_trapdoor_side.png",
|
||||||
groups = {handy = 1, axey = 1, mesecon_effector_on = 1, material_wood = 1, flammable = -1},
|
groups = { handy = 1, axey = 1, mesecon_effector_on = 1, material_wood = 1, flammable = -1 },
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
_mcl_blast_resistance = 3,
|
_mcl_blast_resistance = 3,
|
||||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||||
|
@ -137,7 +137,7 @@ if minetest.get_modpath("mcl_stairs") then
|
||||||
fire_flammability = 20
|
fire_flammability = 20
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.override_item(bamboo_plank_slab, {groups = node_groups})
|
minetest.override_item(bamboo_plank_slab, { groups = node_groups })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -168,13 +168,13 @@ if minetest.get_modpath("mesecons_pressureplates") then
|
||||||
mesecon.register_pressure_plate(
|
mesecon.register_pressure_plate(
|
||||||
"mcl_bamboo:pressure_plate_bamboo_wood",
|
"mcl_bamboo:pressure_plate_bamboo_wood",
|
||||||
S("Bamboo Pressure Plate"),
|
S("Bamboo Pressure Plate"),
|
||||||
{"mcl_bamboo_bamboo_plank.png"},
|
{ "mcl_bamboo_bamboo_plank.png" },
|
||||||
{"mcl_bamboo_bamboo_plank.png"},
|
{ "mcl_bamboo_bamboo_plank.png" },
|
||||||
"mcl_bamboo_bamboo_plank.png",
|
"mcl_bamboo_bamboo_plank.png",
|
||||||
nil,
|
nil,
|
||||||
{{BAMBOO_PLANK, BAMBOO_PLANK}},
|
{ { BAMBOO_PLANK, BAMBOO_PLANK } },
|
||||||
mcl_sounds.node_sound_wood_defaults(),
|
mcl_sounds.node_sound_wood_defaults(),
|
||||||
{axey = 1, material_wood = 1},
|
{ axey = 1, material_wood = 1 },
|
||||||
nil,
|
nil,
|
||||||
S("A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it."))
|
S("A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it."))
|
||||||
|
|
||||||
|
@ -204,8 +204,8 @@ if minetest.get_modpath("mcl_fences") then
|
||||||
mcl_bamboo.mcl_log("Fences Section Entrance. Modpath exists.")
|
mcl_bamboo.mcl_log("Fences Section Entrance. Modpath exists.")
|
||||||
|
|
||||||
local id = "bamboo_fence"
|
local id = "bamboo_fence"
|
||||||
local wood_groups = {handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20}
|
local wood_groups = { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }
|
||||||
local wood_connect = {"group:fence_wood"}
|
local wood_connect = { "group:fence_wood" }
|
||||||
|
|
||||||
local fence_id = mcl_fences.register_fence(id, S("Bamboo Fence"), "mcl_bamboo_fence_bamboo.png", wood_groups,
|
local fence_id = mcl_fences.register_fence(id, S("Bamboo Fence"), "mcl_bamboo_fence_bamboo.png", wood_groups,
|
||||||
2, 15, wood_connect, node_sound)
|
2, 15, wood_connect, node_sound)
|
||||||
|
@ -224,7 +224,7 @@ if minetest.get_modpath("mesecons_button") then
|
||||||
"mcl_bamboo_bamboo_plank.png",
|
"mcl_bamboo_bamboo_plank.png",
|
||||||
BAMBOO_PLANK,
|
BAMBOO_PLANK,
|
||||||
node_sound,
|
node_sound,
|
||||||
{material_wood = 1, handy = 1, pickaxey = 1, flammable = 3, fire_flammability = 20, fire_encouragement = 5, },
|
{ material_wood = 1, handy = 1, pickaxey = 1, flammable = 3, fire_flammability = 20, fire_encouragement = 5, },
|
||||||
1,
|
1,
|
||||||
false,
|
false,
|
||||||
S("A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second."),
|
S("A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second."),
|
||||||
|
@ -253,24 +253,24 @@ minetest.register_node(SCAFFOLDING_NAME, {
|
||||||
description = S("Scaffolding"),
|
description = S("Scaffolding"),
|
||||||
doc_items_longdesc = S("Scaffolding block used to climb up or out across areas."),
|
doc_items_longdesc = S("Scaffolding block used to climb up or out across areas."),
|
||||||
doc_items_hidden = false,
|
doc_items_hidden = false,
|
||||||
tiles = {"mcl_bamboo_scaffolding_top.png", "mcl_bamboo_scaffolding_top.png", "mcl_bamboo_scaffolding_bottom.png"},
|
tiles = { "mcl_bamboo_scaffolding_top.png", "mcl_bamboo_scaffolding_top.png", "mcl_bamboo_scaffolding_bottom.png" },
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
use_texture_alpha = "clip",
|
use_texture_alpha = "clip",
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
{-0.5, 0.375, -0.5, 0.5, 0.5, 0.5},
|
{ -0.5, 0.375, -0.5, 0.5, 0.5, 0.5 },
|
||||||
{-0.5, -0.5, -0.5, -0.375, 0.5, -0.375},
|
{ -0.5, -0.5, -0.5, -0.375, 0.5, -0.375 },
|
||||||
{0.375, -0.5, -0.5, 0.5, 0.5, -0.375},
|
{ 0.375, -0.5, -0.5, 0.5, 0.5, -0.375 },
|
||||||
{0.375, -0.5, 0.375, 0.5, 0.5, 0.5},
|
{ 0.375, -0.5, 0.375, 0.5, 0.5, 0.5 },
|
||||||
{-0.5, -0.5, 0.375, -0.375, 0.5, 0.5},
|
{ -0.5, -0.5, 0.375, -0.375, 0.5, 0.5 },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
buildable_to = false,
|
buildable_to = false,
|
||||||
|
@ -279,7 +279,7 @@ minetest.register_node(SCAFFOLDING_NAME, {
|
||||||
climbable = true,
|
climbable = true,
|
||||||
physical = true,
|
physical = true,
|
||||||
node_placement_prediction = "",
|
node_placement_prediction = "",
|
||||||
groups = {handy = 1, axey = 1, flammable = 3, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, falling_node = 1, stack_falling = 1},
|
groups = { handy = 1, axey = 1, flammable = 3, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, dig_by_piston = 1, falling_node = 1, stack_falling = 1 },
|
||||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||||
_mcl_blast_resistance = 0,
|
_mcl_blast_resistance = 0,
|
||||||
_mcl_hardness = 0,
|
_mcl_hardness = 0,
|
||||||
|
@ -319,7 +319,7 @@ minetest.register_node(SCAFFOLDING_NAME, {
|
||||||
local dir = vector.subtract(pointed.under, pointed.above)
|
local dir = vector.subtract(pointed.under, pointed.above)
|
||||||
local wdir = minetest.dir_to_wallmounted(dir)
|
local wdir = minetest.dir_to_wallmounted(dir)
|
||||||
if wdir == 1 then
|
if wdir == 1 then
|
||||||
minetest.set_node(pointed.above, {name = SCAFFOLDING_NAME, param2 = 0})
|
minetest.set_node(pointed.above, { name = SCAFFOLDING_NAME, param2 = 0 })
|
||||||
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
||||||
itemstack:take_item(1)
|
itemstack:take_item(1)
|
||||||
end
|
end
|
||||||
|
|
|
@ -67,6 +67,32 @@ end
|
||||||
|
|
||||||
local BAMBOO_ENDCAP_NAME = "mcl_bamboo:bamboo_endcap"
|
local BAMBOO_ENDCAP_NAME = "mcl_bamboo:bamboo_endcap"
|
||||||
|
|
||||||
|
-- For when I learn more about the pistons...
|
||||||
|
function mcl_bamboo.break_orphaned(pos)
|
||||||
|
mcl_bamboo.mcl_log("Break_Orphaned called.")
|
||||||
|
local node_below = minetest.get_node(vector.offset(pos, 0, -1, 0))
|
||||||
|
local node_name = node_below.name
|
||||||
|
|
||||||
|
-- short circuit checks.
|
||||||
|
if mcl_bamboo.is_dirt(node_name) or mcl_bamboo.is_bamboo(node_name) or mcl_bamboo.is_bamboo(minetest.get_node(pos).name) == false then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- dig the node.
|
||||||
|
minetest.remove_node(pos) -- if that fails, remove the node
|
||||||
|
local istack = ItemStack("mcl_bamboo:bamboo")
|
||||||
|
local sound_params = {
|
||||||
|
pos = pos,
|
||||||
|
gain = 1.0, -- default
|
||||||
|
max_hear_distance = 10, -- default, uses a Euclidean metric
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
minetest.sound_play(mcl_sounds.node_sound_wood_defaults().dug, sound_params, true)
|
||||||
|
minetest.add_item(pos, istack)
|
||||||
|
end
|
||||||
|
--]]
|
||||||
|
|
||||||
function mcl_bamboo.grow_bamboo(pos, bonemeal_applied)
|
function mcl_bamboo.grow_bamboo(pos, bonemeal_applied)
|
||||||
local node_above = minetest.get_node(vector.offset(pos, 0, 1, 0))
|
local node_above = minetest.get_node(vector.offset(pos, 0, 1, 0))
|
||||||
mcl_bamboo.mcl_log("Grow bamboo called; bonemeal: " .. tostring(bonemeal_applied))
|
mcl_bamboo.mcl_log("Grow bamboo called; bonemeal: " .. tostring(bonemeal_applied))
|
||||||
|
@ -161,7 +187,7 @@ function mcl_bamboo.grow_bamboo(pos, bonemeal_applied)
|
||||||
-- equals top of the stalk before the cap
|
-- equals top of the stalk before the cap
|
||||||
if node_name == "air" then
|
if node_name == "air" then
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; Placing endcap")
|
mcl_bamboo.mcl_log("Grow bamboo; Placing endcap")
|
||||||
minetest.set_node(vector.offset(chk_pos, 0, 1, 0), {name = BAMBOO_ENDCAP_NAME})
|
minetest.set_node(vector.offset(chk_pos, 0, 1, 0), { name = BAMBOO_ENDCAP_NAME })
|
||||||
return true -- returning true means use up the bonemeal.
|
return true -- returning true means use up the bonemeal.
|
||||||
else
|
else
|
||||||
return false
|
return false
|
||||||
|
@ -178,13 +204,13 @@ function mcl_bamboo.grow_bamboo(pos, bonemeal_applied)
|
||||||
if node_name == "air" then
|
if node_name == "air" then
|
||||||
-- here we can check to see if we can do up to 2 bamboo shoots onto the stalk
|
-- here we can check to see if we can do up to 2 bamboo shoots onto the stalk
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; Placing bamboo.")
|
mcl_bamboo.mcl_log("Grow bamboo; Placing bamboo.")
|
||||||
minetest.set_node(chk_pos, {name = node_below})
|
minetest.set_node(chk_pos, { name = node_below })
|
||||||
-- handle growing a second node.
|
-- handle growing a second node.
|
||||||
if grow_amount == 2 then
|
if grow_amount == 2 then
|
||||||
chk_pos = vector.offset(chk_pos, 0, 1, 0)
|
chk_pos = vector.offset(chk_pos, 0, 1, 0)
|
||||||
if minetest.get_node(chk_pos).name == "air" then
|
if minetest.get_node(chk_pos).name == "air" then
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; OOOH! It's twofer day!")
|
mcl_bamboo.mcl_log("Grow bamboo; OOOH! It's twofer day!")
|
||||||
minetest.set_node(chk_pos, {name = node_below})
|
minetest.set_node(chk_pos, { name = node_below })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true -- exit out with a success. We've added 1-2 nodes, per the wiki.
|
return true -- exit out with a success. We've added 1-2 nodes, per the wiki.
|
||||||
|
@ -210,7 +236,7 @@ function mcl_bamboo.grow_bamboo(pos, bonemeal_applied)
|
||||||
if node_name == "air" and above_node_name == "air" then
|
if node_name == "air" and above_node_name == "air" then
|
||||||
if height - 1 == dist then
|
if height - 1 == dist then
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; Placing endcap")
|
mcl_bamboo.mcl_log("Grow bamboo; Placing endcap")
|
||||||
minetest.set_node(chk_pos, {name = BAMBOO_ENDCAP_NAME})
|
minetest.set_node(chk_pos, { name = BAMBOO_ENDCAP_NAME })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
break
|
break
|
||||||
|
@ -222,13 +248,13 @@ function mcl_bamboo.grow_bamboo(pos, bonemeal_applied)
|
||||||
if node_name == "air" then
|
if node_name == "air" then
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; dist: " .. dist)
|
mcl_bamboo.mcl_log("Grow bamboo; dist: " .. dist)
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; Placing bamboo.")
|
mcl_bamboo.mcl_log("Grow bamboo; Placing bamboo.")
|
||||||
minetest.set_node(chk_pos, {name = node_below})
|
minetest.set_node(chk_pos, { name = node_below })
|
||||||
-- handle growing a second node. (1 in 32 chance.)
|
-- handle growing a second node. (1 in 32 chance.)
|
||||||
if grow_amount == 2 and dist <= height - 2 then
|
if grow_amount == 2 and dist <= height - 2 then
|
||||||
chk_pos = vector.offset(chk_pos, 0, 1, 0)
|
chk_pos = vector.offset(chk_pos, 0, 1, 0)
|
||||||
if minetest.get_node(chk_pos).name == "air" then
|
if minetest.get_node(chk_pos).name == "air" then
|
||||||
mcl_bamboo.mcl_log("Grow bamboo; OOOH! It's twofer day!")
|
mcl_bamboo.mcl_log("Grow bamboo; OOOH! It's twofer day!")
|
||||||
minetest.set_node(chk_pos, {name = node_below})
|
minetest.set_node(chk_pos, { name = node_below })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
break
|
break
|
||||||
|
@ -251,7 +277,7 @@ function mcl_bamboo.add_groups(name, ...)
|
||||||
return add_all(...)
|
return add_all(...)
|
||||||
end
|
end
|
||||||
addall(...)
|
addall(...)
|
||||||
return minetest.override_item(name, {groups = groups})
|
return minetest.override_item(name, { groups = groups })
|
||||||
end
|
end
|
||||||
|
|
||||||
function mcl_bamboo.mcl_log(m, l)
|
function mcl_bamboo.mcl_log(m, l)
|
||||||
|
|
|
@ -26,6 +26,7 @@ dofile(minetest.get_modpath(modname) .. "/recipes.lua")
|
||||||
|
|
||||||
--ABMs
|
--ABMs
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
|
label = "Bamboo Grow",
|
||||||
nodenames = mcl_bamboo.bamboo_index,
|
nodenames = mcl_bamboo.bamboo_index,
|
||||||
interval = 10,
|
interval = 10,
|
||||||
chance = 20,
|
chance = 20,
|
||||||
|
@ -34,6 +35,38 @@ minetest.register_abm({
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
--[[ TODO: Figure out how to make this work:
|
||||||
|
local function dropper_call(node, pushdir, stack, stackid)
|
||||||
|
mcl_bamboo.mcl_log("mvps_dropper call for bamboo:")
|
||||||
|
-- mcl_bamboo.break_orphaned()
|
||||||
|
|
||||||
|
mcl_bamboo.mcl_log(dump(node))
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if minetest.get_modpath("mesecons_mvps") then
|
||||||
|
if mesecon then
|
||||||
|
mcl_bamboo.mcl_log("registering mvps_dropper for bamboo:")
|
||||||
|
for x = 1, #mcl_bamboo.bamboo_index do
|
||||||
|
mesecon.register_mvps_dropper(mcl_bamboo.bamboo_index[x],dropper_call)
|
||||||
|
mcl_bamboo.mcl_log("registering: " .. mcl_bamboo.bamboo_index[x])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
end
|
||||||
|
--]]
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "Break Orphaned Bamboo",
|
||||||
|
nodenames = mcl_bamboo.bamboo_index,
|
||||||
|
interval = 1.5,
|
||||||
|
chance = 1,
|
||||||
|
action = function(pos, _)
|
||||||
|
mcl_bamboo.break_orphaned(pos)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
-- Base Aliases.
|
-- Base Aliases.
|
||||||
local SCAFFOLDING_NAME = "mcl_bamboo:scaffolding"
|
local SCAFFOLDING_NAME = "mcl_bamboo:scaffolding"
|
||||||
minetest.register_alias("bamboo_block", "mcl_bamboo:bamboo_block")
|
minetest.register_alias("bamboo_block", "mcl_bamboo:bamboo_block")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
name = mcl_bamboo
|
name = mcl_bamboo
|
||||||
depends = mcl_core, mcl_sounds, mcl_tools
|
depends = mcl_core, mcl_sounds, mcl_tools
|
||||||
optional_depends = mcl_flowerpots, mclx_stairs, mcl_doors, mcl_signs, mesecons_pressureplates, mcl_fences, mesecons_button
|
optional_depends = mcl_flowerpots, mclx_stairs, mcl_doors, mcl_signs, mesecons_pressureplates, mcl_fences, mesecons_button, mesecons_mvps
|
||||||
author = Michieal
|
author = Michieal
|
|
@ -45,8 +45,8 @@ minetest.register_craft({
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = BAMBOO .. "_mosaic",
|
output = BAMBOO .. "_mosaic",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"mcl_stair:slab_bamboo_plank"},
|
{"mcl_stairs:slab_bamboo_plank"},
|
||||||
{"mcl_stair:slab_bamboo_plank"},
|
{"mcl_stairs:slab_bamboo_plank"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
# textdomain: mcl_banners
|
||||||
|
White Banner=Estandarte Branco
|
||||||
|
White=Branco
|
||||||
|
Grey Banner=Estandarte Cinza
|
||||||
|
Grey=Cinza
|
||||||
|
Light Grey Banner=Estandarte Cinza Claro
|
||||||
|
Light Grey=Cinza Claro
|
||||||
|
Black Banner=Estandarte Preto
|
||||||
|
Black=Preto
|
||||||
|
Red Banner=Estandarte Vermelho
|
||||||
|
Red=Vermelho
|
||||||
|
Yellow Banner=Estandarte Amarelo
|
||||||
|
Yellow=Amarelo
|
||||||
|
Green Banner=Estandarte Verde
|
||||||
|
Green=Verde
|
||||||
|
Cyan Banner=Estandarte Ciano
|
||||||
|
Cyan=Ciano
|
||||||
|
Blue Banner=Estandarte Azul
|
||||||
|
Blue=Azul
|
||||||
|
Magenta Banner=Estandarte Magenta
|
||||||
|
Magenta=Magenta
|
||||||
|
Orange Banner=Estandarte Laranja
|
||||||
|
Orange=Laranja
|
||||||
|
Purple Banner=Estandarte Roxo
|
||||||
|
Violet=Violeta
|
||||||
|
Brown Banner=Estandarte Marrom
|
||||||
|
Brown=Marrom
|
||||||
|
Pink Banner=Estandarte Rosa
|
||||||
|
Pink=Rosa
|
||||||
|
Lime Banner=Estandarte Lima
|
||||||
|
Lime=Lima
|
||||||
|
Light Blue Banner=Estandarte Azul Claro
|
||||||
|
Light Blue=Azul Claro
|
||||||
|
Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Estandartes são altos e coloridos blocos decorativos. Podem ser colocados no chão ou em paredes. Estandartes podem ser brasonados com uma variedade de padrões usando muitos corantes na mesa de trabalho.
|
||||||
|
Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Use a mesa de trabalho para desenhar um padrão sob o estandarte. Estandartes brasonados podem ser brasonados novamente para combinar diversos padrões. Você pode desenhar até 12 camadas em um estandarte dessa maneira. Se o estandarte possuir gradiente, apenas 3 camadas são possíveis.
|
||||||
|
You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Você pode copiar o padrão de um estandarte colocando dois estandartes da mesma cor na mesa de trabalho - um necessita estar brasonado, o outro, limpo. Finalmente, você pode usar um estandarte em um calderão com água para lavar fora a camada mais recente.
|
||||||
|
@1 Bordure=
|
||||||
|
@1 Bricks=
|
||||||
|
@1 Roundel=
|
||||||
|
@1 Creeper Charge=
|
||||||
|
@1 Saltire=
|
||||||
|
@1 Bordure Indented=
|
||||||
|
@1 Per Bend Inverted=
|
||||||
|
@1 Per Bend Sinister Inverted=
|
||||||
|
@1 Per Bend=
|
||||||
|
@1 Per Bend Sinister=
|
||||||
|
@1 Flower Charge=
|
||||||
|
@1 Gradient=
|
||||||
|
@1 Base Gradient=
|
||||||
|
@1 Per Fess Inverted=
|
||||||
|
@1 Per Fess=
|
||||||
|
@1 Per Pale=
|
||||||
|
@1 Per Pale Inverted=
|
||||||
|
@1 Thing Charge=
|
||||||
|
@1 Lozenge=
|
||||||
|
@1 Skull Charge=
|
||||||
|
@1 Paly=
|
||||||
|
@1 Base Dexter Canton=
|
||||||
|
@1 Base Sinister Canton=
|
||||||
|
@1 Chief Dexter Canton=
|
||||||
|
@1 Chief Sinister Canton=
|
||||||
|
@1 Cross=
|
||||||
|
@1 Base=
|
||||||
|
@1 Pale=
|
||||||
|
@1 Bend Sinister=
|
||||||
|
@1 Bend=
|
||||||
|
@1 Pale Dexter=
|
||||||
|
@1 Fess=
|
||||||
|
@1 Pale Sinister=
|
||||||
|
@1 Chief=
|
||||||
|
@1 Chevron=
|
||||||
|
@1 Chevron Inverted=
|
||||||
|
@1 Base Indented=
|
||||||
|
@1 Chief Indented=
|
||||||
|
And one additional layer=E uma camada adicional
|
||||||
|
And @1 additional layers=E @1 camada adicional
|
||||||
|
Paintable decoration=Decoração pintável
|
|
@ -0,0 +1,5 @@
|
||||||
|
# textdomain: mcl_barrels
|
||||||
|
Barrel=Barril
|
||||||
|
Barrels are containers which provide 27 inventory slots.=Barris são recipientes que fornecem 27 espaços no inventário.
|
||||||
|
To access its inventory, rightclick it. When broken, the items will drop out.=Para acessar seu inventário, clique com o botão direito nele. Quando quebrado, os itens serão derrubados ao chão.
|
||||||
|
27 inventory slots=27 espaços de inventário
|
|
@ -0,0 +1,5 @@
|
||||||
|
# textdomain: mcl_beacons
|
||||||
|
Beacon=Sinalizador
|
||||||
|
Beacon:=Sinalizador:
|
||||||
|
Primary Power:=Poder Primário:
|
||||||
|
Inventory:=Inventário:
|
|
@ -274,7 +274,11 @@ function mcl_beds.sleep()
|
||||||
end
|
end
|
||||||
-- Always clear weather
|
-- Always clear weather
|
||||||
mcl_weather.change_weather("none")
|
mcl_weather.change_weather("none")
|
||||||
elseif mcl_beds.is_night() then
|
elseif mcl_beds.is_night() and weather_mod then
|
||||||
|
mcl_beds.skip_night()
|
||||||
|
mcl_beds.kick_players()
|
||||||
|
mcl_weather.change_weather("none")
|
||||||
|
elseif mcl_beds.is_night() and not weather_mod then
|
||||||
mcl_beds.skip_night()
|
mcl_beds.skip_night()
|
||||||
mcl_beds.kick_players()
|
mcl_beds.kick_players()
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# textdomain: mcl_beds
|
||||||
|
Beds allow you to sleep at night and make the time pass faster.=Camas permitem que você durma durante a noite e faz o tempo passar mais rápido.
|
||||||
|
To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Para utilizar uma cama, se aproxime dela e clique com o botão direito para dormir na cama. Dormir só funciona quando o sol se põe, a noite ou durante uma tempestade.
|
||||||
|
You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Você andou escutando de outros mundos onde uma cama colocaria o ponto de partida de sua próxima vida. Mas esse mundo não é um deles.
|
||||||
|
By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Ao utilizar uma cama, você marca o ponto de partida de sua próxima vida. Se você morrer, voce começará sua nova vida nesta cama, a não ser que ela está obstruída ou foi destruída.
|
||||||
|
In this world, going to bed won't skip the night, but it will skip thunderstorms.=Neste mundo, ir para a cama não pulará a noite, mas pulará tempestades.
|
||||||
|
Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Dormir permite que você pule a noite. A noite é pulada quando todos os jogadores deste mundo forem dormir. A noite é pulada depois de dormir por alguns segundos. Tempestades podem ser puladas da mesma maneira.
|
||||||
|
Bed=Cama
|
||||||
|
Red Bed=Cama Vermelha
|
||||||
|
Blue Bed=Cama Azul
|
||||||
|
Cyan Bed=Cama Ciana
|
||||||
|
Grey Bed=Cama Cinza
|
||||||
|
Light Grey Bed=Cama Cinza Clara
|
||||||
|
Black Bed=Cama Preta
|
||||||
|
Yellow Bed=Cama Amarela
|
||||||
|
Green Bed=Cama Verde
|
||||||
|
Magenta Bed=Cama Magenta
|
||||||
|
Orange Bed=Cama Laranja
|
||||||
|
Purple Bed=Cama Roxa
|
||||||
|
Brown Bed=Cama Marrom
|
||||||
|
Pink Bed=Cama Rosa
|
||||||
|
Lime Bed=Cama Lima
|
||||||
|
Light Blue Bed=Cama Azul Clara
|
||||||
|
White Bed=Cama Brabca
|
||||||
|
You can't sleep, the bed's too far away!=Você não pode dormir, a cama está muito longe!
|
||||||
|
This bed is already occupied!=Esta cama já está ocupada!
|
||||||
|
You have to stop moving before going to bed!=Você precisa parar de se mover antes de deitar na cama!
|
||||||
|
You can't sleep now, monsters are nearby!=Você não pode dormir agora, há monstros perto!
|
||||||
|
You can't sleep, the bed is obstructed!=Você não pode dormir, a cama está obstruída!
|
||||||
|
It's too dangerous to sleep here!=É muito perigoso dormir aqui!
|
||||||
|
New respawn position set! But you can only sleep at night or during a thunderstorm.=Nova posição de respawn marcada! Mas você só pode dormir a noite ou durante uma tempestade.
|
||||||
|
You can only sleep at night or during a thunderstorm.=Você só pode dormir a noite ou durante uma tempestade.
|
||||||
|
New respawn position set!=Nova posição de respawn marcada!
|
||||||
|
Leave bed=Sair da cama
|
||||||
|
Abort sleep=Abortar dormir
|
||||||
|
Players in bed: @1/@2=Jogadores na cama: @1/@2
|
||||||
|
Note: Night skip is disabled.=Nota: avançar a noite está desabilitado.
|
||||||
|
You're sleeping.=Voce está dormindo.
|
||||||
|
You will fall asleep when all players are in bed.=Você cairá no sono quando todos os jogadores estiverem na cama.
|
||||||
|
You will fall asleep when @1% of all players are in bed.=Você cairá no sono quando @1% de todos os jogadores estiverem na cama.
|
||||||
|
You're in bed.=Você está na cama.
|
||||||
|
Allows you to sleep=Permite que você durma
|
||||||
|
Respawn Anchor=Âncora de Respawn
|
|
@ -0,0 +1,2 @@
|
||||||
|
# textdomain: mcl_bells
|
||||||
|
Bell=Sino
|
|
@ -0,0 +1,28 @@
|
||||||
|
# textdomain: mcl_blackstone
|
||||||
|
Blackstone=Rocha-negra
|
||||||
|
Polished Blackstone=Rocha-negra Polida
|
||||||
|
Chiseled Polished Blackstone=Rocha-negra Polida Cinzelada
|
||||||
|
Polished Blackstone Bricks=Tijolo de Rocha-negra Polida
|
||||||
|
Basalt=Basalto
|
||||||
|
Polished Basalt=Basalto Polido
|
||||||
|
Blackstone Slab=Laje de Rocha-negra
|
||||||
|
Polished Blackstone Slab=Laje de Rocha-negra Polida
|
||||||
|
Chiseled Polished Blackstone Slab=Laje de Rocha-negra Polida Cinzelada
|
||||||
|
Polished Blackstone Brick Slab=Laje de Tijolo de Rocha-negra Polida
|
||||||
|
Blackstone Stair=Escada de Rocha-negra
|
||||||
|
Polished Blackstone Stair=Escada de Rocha-negra Polida
|
||||||
|
Chiseled Polished Blackstone Stair=Escada de Rocha-negra Polida Cinzelada
|
||||||
|
Polished Blackstone Brick Stair=Escada de Tijolo de Rocha-negra Polida
|
||||||
|
Quartz Bricks=Tijolos de Quartzo
|
||||||
|
Soul Torch=Tocha de Alma
|
||||||
|
Soul Lantern=Lanterna de Alma
|
||||||
|
Soul Soil=Solo de Alma
|
||||||
|
Eternal Soul Fire=Eterno Fogo de Alma
|
||||||
|
Gilded Blackstone=Rocha-negra Dourada
|
||||||
|
Nether Gold Ore=Minério de Ouro do Nether
|
||||||
|
Smooth Basalt=Basalto Liso
|
||||||
|
Blackstone Wall=Muro de Rocha-negra
|
||||||
|
Double Blackstone Slab=Dupla Laje de Rocha-negra
|
||||||
|
Polished Double Blackstone Slab=Dupla Laje de Rocha-negra Polida
|
||||||
|
Double Chiseled Polished Blackstone Slab=Dupla Laje de Rocha-negra Polida Cinzelada
|
||||||
|
Double Polished Blackstone Brick Slab=Dupla Laje de Tijolo de Rocha-negra Polida
|
|
@ -0,0 +1,8 @@
|
||||||
|
# textdomain: mcl_blast_furnace
|
||||||
|
Inventory=Inventário
|
||||||
|
Blast Furnace=Alto-Forno
|
||||||
|
Smelts ores faster than furnace=Funde minérios mais rápido do que a fornalha
|
||||||
|
Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utilize o livro de receitas para ver o que você pode fundir, o que você pode usar de combustível e o quanto irá queimar.
|
||||||
|
Use the furnace to open the furnace menu.\nPlace a furnace fuel in the lower slot and the source material in the upper slot.\nThe furnace will slowly use its fuel to smelt the item.\nThe result will be placed into the output slot at the right side.=Utilize o alto-forno para abrir o menu. \nColoque o combustível no espaço inferior e a matéria-prima no espaço superior. \nO resultado será colocado no espaço de saída, ao lado direito.
|
||||||
|
Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, into something else.=Alto-Forno derrete diversos itens, principalmente minérios e armaduras, utilizando um combustível, em algo diferente.
|
||||||
|
Active Blast Furnace=Alto-Forno Ativo
|
|
@ -0,0 +1,28 @@
|
||||||
|
# textdomain: mcl_books
|
||||||
|
Book=Livro
|
||||||
|
Books are used to make bookshelves and book and quills.=Livros são utilizados para fazer prateleiras de livros e livro e pena.
|
||||||
|
“@1”=
|
||||||
|
Copy of “@1”=Copia de "@1"
|
||||||
|
Copy of Copy of “@1”=Cópia da Cópia de "@1"
|
||||||
|
Tattered Book=Livro Esfarrapado
|
||||||
|
by @1=por @1
|
||||||
|
# as in “to sign a book”
|
||||||
|
Sign=Assinar
|
||||||
|
Done=Finalizar
|
||||||
|
This item can be used to write down some notes.=Este item pode ser utilizado para escrever algumas anotações.
|
||||||
|
Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Segure na mão e aperte o botão direito para ler e editar as anotações. Você pode editar o texto o quanto quiser. Você pode assinar o livro, o que o torna em um livro escrito em que você pode empilhar, mas não poderá ser editado mais.
|
||||||
|
A book can hold up to 4500 characters. The title length is limited to 64 characters.=Um livro pode conter até 4500 caracteres. O tamanho do título é limitado a 64 caracteres.
|
||||||
|
Enter book title:=Entre com o título do livro:
|
||||||
|
by @1=por @1
|
||||||
|
Note: The book will no longer be editable after signing=Nota: o livro não será mais editável após assinar
|
||||||
|
Sign and Close=Assinar e Fechar
|
||||||
|
Cancel=Cancelar
|
||||||
|
Nameless Book=Livro sem título
|
||||||
|
Written Book=Livro Escrito
|
||||||
|
Written books contain some text written by someone. They can be read and copied, but not edited.=Livros escritos contém textos escritos por alguém. Eles podem ser lidos e copiados, mas não editados.
|
||||||
|
Hold it in your hand, then rightclick to read the book.=Segure em sua mão e aperte o botão direito para ler o livro.
|
||||||
|
To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Para copiar o texto de um livro escrito, coloque-o na mesa de trabalho junto de um livro e pena (ou vários deste) e copie. O livro escrito não será consumido. Copias de copias não poderão ser copiadas.
|
||||||
|
Bookshelf=Estante de Livros
|
||||||
|
Bookshelves are used for decoration.=Estante de livros são utilizadas para decoração.
|
||||||
|
Book and Quill=Livro e Pena
|
||||||
|
Write down some notes=Escreve algumas anotações
|
|
@ -0,0 +1,18 @@
|
||||||
|
# textdomain: mcl_bows
|
||||||
|
Arrow=Flecha
|
||||||
|
Arrows are ammunition for bows and dispensers.=Flechas são munições para arcos e dispensores.
|
||||||
|
An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Uma flecha disparada de um arco tem um dano regular variando entre 1-9. Quando puxado o arco por completo há uma chance de 20% de acerto crítico, causando 10 de dano. Uma flecha disparada de um dispensor sempre provocará 3 de dano.
|
||||||
|
Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Flechas poderão ficar presas em blocos sólidos e podem ser recuperadas novamente. Elas também são capazes de empurrar botões de madeira.
|
||||||
|
To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Para usar flechas como munição para um arco, apenas as coloque em seu inventário, elas serão consumidas automaticamente. Para usar flechas como munição de dispensores, coloque as no inventário do dispensor. Para recuperar uma flecha presa em um bloco, simplemente se aproxime dela.
|
||||||
|
Bow=Arco
|
||||||
|
Bows are ranged weapons to shoot arrows at your foes.=Arcos são armas de longo alcance que disparam flechas em seus inimigos.
|
||||||
|
The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=A velocidade e o dano da flecha aumenta quanto mais você puxar o arco. O dano regular de uma flecha varia entre 1 e 9. Quando puxado no máximo, há também uma chance de 20% de causar acerto crítico, efetuando 10 de dano.
|
||||||
|
To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar o arco, você primeiro precisa possuir pelo menos uma flecha em qualquer lugar do seu inventário (a não ser no Modo Criativo). Segure o botão direito do mouse para puxar o arco, solte-o para disparar.
|
||||||
|
Bow=Arco
|
||||||
|
Ammunition=munição
|
||||||
|
Damage from bow: 1-10=Dano provocado pelo arco: 1-10
|
||||||
|
Damage from dispenser: 3=Dano provocado pelo dispensor: 3
|
||||||
|
Launches arrows=Dispara flechas
|
||||||
|
Crossbow=Besta
|
||||||
|
Crossbows are ranged weapons to shoot arrows at your foes.=Bestas são armas de longo alcance que disparam flechas em seus inimigos.
|
||||||
|
To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar a besta, vocẽ primeiro precisa possuir pelo menos uma flecha em qualquer lugar do seu inventário (a não ser no Modo Criativo). Segure o botão direito do mouse para puxar, solte-o para disparar.
|
|
@ -0,0 +1,10 @@
|
||||||
|
# textdomain: mcl_brewing
|
||||||
|
Brewing Stand=Suporte de Fermentação
|
||||||
|
Inventory=Inventário
|
||||||
|
To use a brewing stand, rightclick it.=Para usar um suporte de fermentação, clique-o com o botão direito.
|
||||||
|
To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Para fermentar, você precisa de Pó de Blaze como combutível, um material de fermentação e pelo menos 1 garrafa de vidro preenchida com líquido.
|
||||||
|
Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Coloque o Pó de Blaze no espaço da esquerda, o material de fermentaçaõ no espaço do meio e 1-3 garrafas nos espaços restantes.
|
||||||
|
When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Quando você encontrar uma boa combinação, a fermentação irá iniciar automaticamente e vapores começarão a aparecer, consumindo o combustível e o material de fermentação. A poção em breve estará pronta.
|
||||||
|
Different combinations of brewing materials and liquids will give different results. Try to experiment!=Diferentes combinações de materiais de fermentação e líquidos lhe darão diferentes resultados. Tente experimentar!
|
||||||
|
The stand allows you to brew potions!=O suporte permite que você produza poções.
|
||||||
|
Brew Potions=Produz Poções
|
|
@ -56,7 +56,7 @@ for techname, fishname in pairs(fish_names) do
|
||||||
_doc_items_longdesc = S("This bucket is filled with water and @1.", S(fishname)),
|
_doc_items_longdesc = S("This bucket is filled with water and @1.", S(fishname)),
|
||||||
_doc_items_usagehelp = S("Place it to empty the bucket and place a @1. Obtain by right clicking on a @2 with a bucket of water.", S(fishname), S(fishname)),
|
_doc_items_usagehelp = S("Place it to empty the bucket and place a @1. Obtain by right clicking on a @2 with a bucket of water.", S(fishname), S(fishname)),
|
||||||
_tt_help = S("Places a water source and a @1.", S(fishname)),
|
_tt_help = S("Places a water source and a @1.", S(fishname)),
|
||||||
inventory_image = techname .. "_bucket.png",
|
inventory_image = "mcl_buckets_" .. techname .. "_bucket.png",
|
||||||
stack_max = 1,
|
stack_max = 1,
|
||||||
groups = {bucket = 1, fish_bucket = 1},
|
groups = {bucket = 1, fish_bucket = 1},
|
||||||
liquids_pointable = false,
|
liquids_pointable = false,
|
||||||
|
|
|
@ -61,9 +61,8 @@ local function sound_take(itemname, pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function place_liquid(pos, itemstring)
|
local function place_liquid(pos, itemstring)
|
||||||
local fullness = registered_nodes[itemstring].liquid_range
|
|
||||||
sound_place(itemstring, pos)
|
sound_place(itemstring, pos)
|
||||||
add_node(pos, {name=itemstring, param2=fullness})
|
set_node(pos, {name=itemstring})
|
||||||
end
|
end
|
||||||
|
|
||||||
local function give_bucket(new_bucket, itemstack, user)
|
local function give_bucket(new_bucket, itemstack, user)
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# textdomain: mcl_buckets
|
||||||
|
Empty Bucket=Balde Vazio
|
||||||
|
A bucket can be used to collect and release liquids.=Um balde pode ser utilizado para coletar e soltar líquidos.
|
||||||
|
Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Soque uma fonte de líquido para coletá-la. Voce pode usar um balde cheio para colocar o líquido em algum outro lugar.
|
||||||
|
Lava Bucket=Balde com Lava
|
||||||
|
A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Um balde pode ser utilizado para coletar e soltar líquidos. Este está preenchido com lava quente, contido seguramente dentro. Utilize com cautela.
|
||||||
|
Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Tome uma distância segura e coloque o balde para esvaziá-lo e criar uma fonte de lava no local. Não se queime!
|
||||||
|
Water Bucket=Balde com Água
|
||||||
|
A bucket can be used to collect and release liquids. This one is filled with water.=Um balde pode ser utilizado para coletar e soltar líquidos. Este está preenchido com água.
|
||||||
|
Place it to empty the bucket and create a water source.=Coloque-o para esvaziar o balde e criar uma fonte de água.
|
||||||
|
River Water Bucket=Balde com Água de Rio
|
||||||
|
A bucket can be used to collect and release liquids. This one is filled with river water.=Um balde pode ser utilizado para coletar e soltar líquidos. Este está preenchido com água de rio.
|
||||||
|
Place it to empty the bucket and create a river water source.=Coloque-o para esvaziar o balde e criar uma fonte de água de rio.
|
||||||
|
Collects liquids=Coleta líquidos
|
||||||
|
Places a lava source=Coloca uma fonte de lava
|
||||||
|
Places a water source=Coloca uma fonte de água
|
||||||
|
Places a river water source=Coloca uma fonte de água de rio
|
||||||
|
Cod=Bacalhau
|
||||||
|
Salmon=Salmão
|
||||||
|
Tropical Fish=Peixe Tropical
|
||||||
|
Bucket of @1=Balde com @1
|
||||||
|
This bucket is filled with water and @1.=Este balde está preenchido com água e @1
|
||||||
|
Place it to empty the bucket and place a @1. Obtain by right clicking on a @2 fish with a bucket of water.=Coloque-o para esvaziar o balde e colocar um @1. Obtenha-o ao clicar com o botão direito em um peixe @2 com um balde com água.
|
||||||
|
Places a water source and a @1 fish.=Coloca a fonte de água e um peixe @1.
|
|
@ -0,0 +1,12 @@
|
||||||
|
# textdomain: mcl_cake
|
||||||
|
Cake=Bolo
|
||||||
|
Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Bolos podem ser colocados e comidos para restaurar pontos de fome. Um bolo tem 7 pedaços. Cada pedaço restaura 2 pontos de fome e 0.4 pontos de saturação. Bolos serão destruídos quando eles, ou o bloco abaixo deles, é quebrado.
|
||||||
|
Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Coloque o bolo em qualquer lugar, e então aperte o botão direito nele para comer um pedaço. Você não consegue comer bolo quando sua barra de fome estiver cheia.
|
||||||
|
Cake (6 Slices Left)=Bolo (6 Pedaços Restantes)
|
||||||
|
Cake (5 Slices Left)=Bolo (5 Pedaços Restantes)
|
||||||
|
Cake (4 Slices Left)=Bolo (4 Pedaços Restantes)
|
||||||
|
Cake (3 Slices Left)=Bolo (3 Pedaços Restantes)
|
||||||
|
Cake (2 Slices Left)=Bolo (2 Pedaços Restantes)
|
||||||
|
Cake (1 Slice Left)=Bolo (1 Pedaço Restante)
|
||||||
|
With 7 tasty slices!=Com 7 deliciosos pedaços!
|
||||||
|
Hunger points: +@1 per slice=Pontos de fome: +@1 por pedaço
|
|
@ -0,0 +1,26 @@
|
||||||
|
MineClone 2 Campfire API
|
||||||
|
========================
|
||||||
|
`mcl_campfires.register_campfire`
|
||||||
|
---------------------------------
|
||||||
|
Used to register campfires.
|
||||||
|
|
||||||
|
**Example Usage**
|
||||||
|
```
|
||||||
|
mcl_campfires.register_campfire("mcl_campfires:campfire", {
|
||||||
|
description = S("Campfire"),
|
||||||
|
inv_texture = "mcl_campfires_campfire_inv.png",
|
||||||
|
fire_texture = "mcl_campfires_campfire_fire.png",
|
||||||
|
lit_logs_texture = "mcl_campfires_campfire_log_lit.png",
|
||||||
|
drops = "mcl_core:charcoal_lump 2",
|
||||||
|
lightlevel = 14,
|
||||||
|
damage = 1,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
**Values**
|
||||||
|
* description - human readable node name.
|
||||||
|
* inv_texture - campfire inventory texture.
|
||||||
|
* fire_texture - texture of the campfire fire.
|
||||||
|
* lit_logs_texture - texture for the logs of the lit campfire. if not changed, specify mcl_campfires_log.png.
|
||||||
|
* drops - what items drop when the campfire is mined.
|
||||||
|
* lightlevel - the level of light the campfire emits.
|
||||||
|
* damage - amount of damage the campfire deals when the player stands on it.
|
|
@ -0,0 +1,117 @@
|
||||||
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
mcl_campfires = {}
|
||||||
|
|
||||||
|
function mcl_campfires.register_campfire(name, def)
|
||||||
|
-- Define Campfire
|
||||||
|
minetest.register_node(name, {
|
||||||
|
description = def.description,
|
||||||
|
_tt_help = S("Cooks food and keeps bees happy."),
|
||||||
|
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
||||||
|
inventory_image = def.inv_texture,
|
||||||
|
wield_image = def.inv_texture,
|
||||||
|
drawtype = "mesh",
|
||||||
|
mesh = "mcl_campfires_campfire.obj",
|
||||||
|
tiles = {{name="mcl_campfires_log.png"},},
|
||||||
|
use_texture_alpha = "clip",
|
||||||
|
groups = { handy=1, axey=1, material_wood=1, not_in_creative_inventory=1, campfire=1, },
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
||||||
|
if player:get_wielded_item():get_name() == "mcl_fire:flint_and_steel" then
|
||||||
|
node.name = name.."_lit"
|
||||||
|
minetest.set_node(pos, node)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
drop = def.drops,
|
||||||
|
_mcl_silk_touch_drop = {name},
|
||||||
|
mcl_sounds.node_sound_wood_defaults(),
|
||||||
|
selection_box = {
|
||||||
|
type = 'fixed',
|
||||||
|
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
||||||
|
},
|
||||||
|
collision_box = {
|
||||||
|
type = 'fixed',
|
||||||
|
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
||||||
|
},
|
||||||
|
_mcl_blast_resistance = 2,
|
||||||
|
_mcl_hardness = 2,
|
||||||
|
})
|
||||||
|
|
||||||
|
--Define Lit Campfire
|
||||||
|
minetest.register_node(name.."_lit", {
|
||||||
|
description = def.description,
|
||||||
|
_tt_help = S("Cooks food and keeps bees happy."),
|
||||||
|
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
||||||
|
inventory_image = def.inv_texture,
|
||||||
|
wield_image = def.inv_texture,
|
||||||
|
drawtype = "mesh",
|
||||||
|
mesh = "mcl_campfires_campfire_lit.obj",
|
||||||
|
tiles = {{
|
||||||
|
name=def.fire_texture,
|
||||||
|
animation={
|
||||||
|
type="vertical_frames",
|
||||||
|
aspect_w=16,
|
||||||
|
aspect_h=16,
|
||||||
|
length=2.0
|
||||||
|
}},
|
||||||
|
{name=def.lit_logs_texture,
|
||||||
|
animation={
|
||||||
|
type="vertical_frames",
|
||||||
|
aspect_w=16,
|
||||||
|
aspect_h=16,
|
||||||
|
length=2.0
|
||||||
|
}}
|
||||||
|
},
|
||||||
|
use_texture_alpha = "clip",
|
||||||
|
groups = { handy=1, axey=1, material_wood=1, campfire=1, lit_campfire=1 },
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
||||||
|
if player:get_wielded_item():get_name():find("shovel") then
|
||||||
|
node.name = name
|
||||||
|
minetest.set_node(pos, node)
|
||||||
|
minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
drop = def.drops,
|
||||||
|
_mcl_silk_touch_drop = {name.."_lit"},
|
||||||
|
light_source = def.lightlevel,
|
||||||
|
mcl_sounds.node_sound_wood_defaults(),
|
||||||
|
selection_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
||||||
|
},
|
||||||
|
collision_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
||||||
|
},
|
||||||
|
_mcl_blast_resistance = 2,
|
||||||
|
_mcl_hardness = 2,
|
||||||
|
damage_per_second = def.damage,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function burn_in_campfire(obj)
|
||||||
|
local p = obj:get_pos()
|
||||||
|
if p then
|
||||||
|
local n = minetest.find_node_near(p,0.4,{"group:lit_campfire"},true)
|
||||||
|
if n then
|
||||||
|
mcl_burning.set_on_fire(obj, 5)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local etime = 0
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
etime = dtime + etime
|
||||||
|
if etime < 0.5 then return end
|
||||||
|
etime = 0
|
||||||
|
for _,pl in pairs(minetest.get_connected_players()) do
|
||||||
|
burn_in_campfire(pl)
|
||||||
|
end
|
||||||
|
for _,ent in pairs(minetest.luaentities) do
|
||||||
|
if ent.is_mob then
|
||||||
|
burn_in_campfire(ent.object)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
|
@ -1,147 +1,9 @@
|
||||||
-- ||||||||||||||||||||||||||||||||
|
|
||||||
-- ||||||||||| CAMPFIRES ||||||||||
|
|
||||||
-- ||||||||||||||||||||||||||||||||
|
|
||||||
|
|
||||||
-- TO-DO:
|
-- TO-DO:
|
||||||
-- * Add Smoke Particles
|
-- * Add Smoke Particles
|
||||||
-- * Add Spark Particles
|
-- * Add Spark Particles
|
||||||
-- * Add Cooking Meat
|
-- * Add Cooking Meat
|
||||||
-- * Add Working Sounds
|
-- * Add Working Sounds
|
||||||
|
local modname = minetest.get_modpath(minetest.get_current_modname())
|
||||||
|
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
dofile(modname.."/api.lua") -- Load API File
|
||||||
|
dofile(modname.."/register.lua") -- Load Campfire Registration File
|
||||||
local campfires = {
|
|
||||||
{ name = "Campfire", lightlevel = 14, techname = "campfire", damage = 1, drops = "mcl_core:charcoal_lump 2" },
|
|
||||||
{ name = "Soul Campfire", lightlevel = 10, techname = "soul_campfire", damage = 2, drops = "mcl_blackstone:soul_soil" },
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, campfire in pairs(campfires) do
|
|
||||||
-- Define Campfire
|
|
||||||
minetest.register_node("mcl_campfires:" .. campfire.techname, {
|
|
||||||
description = S(campfire.name),
|
|
||||||
_tt_help = S("Cooks food and keeps bees happy."),
|
|
||||||
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
|
||||||
inventory_image = "mcl_campfires_" .. campfire.techname .. "_inv.png",
|
|
||||||
drawtype = "mesh",
|
|
||||||
mesh = "mcl_campfires_campfire.obj",
|
|
||||||
tiles = {{name="mcl_campfires_log.png"},},
|
|
||||||
use_texture_alpha = "clip",
|
|
||||||
groups = { handy=1, axey=1, material_wood=1, not_in_creative_inventory=1, campfire=1, },
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
|
||||||
if player:get_wielded_item():get_name() == "mcl_fire:flint_and_steel" then
|
|
||||||
node.name = "mcl_campfires:" .. campfire.techname .. "_lit"
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
drop = campfire.drops,
|
|
||||||
_mcl_silk_touch_drop = {"mcl_campfires:" .. campfire.techname},
|
|
||||||
mcl_sounds.node_sound_wood_defaults(),
|
|
||||||
selection_box = {
|
|
||||||
type = 'fixed',
|
|
||||||
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
|
||||||
},
|
|
||||||
collision_box = {
|
|
||||||
type = 'fixed',
|
|
||||||
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
|
||||||
},
|
|
||||||
_mcl_blast_resistance = 2,
|
|
||||||
_mcl_hardness = 2,
|
|
||||||
})
|
|
||||||
|
|
||||||
--Define Lit Campfire
|
|
||||||
minetest.register_node("mcl_campfires:" .. campfire.techname .. "_lit", {
|
|
||||||
description = S(campfire.name),
|
|
||||||
_tt_help = S("Cooks food and keeps bees happy."),
|
|
||||||
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
|
||||||
inventory_image = "mcl_campfires_" .. campfire.techname .. "_inv.png",
|
|
||||||
drawtype = "mesh",
|
|
||||||
mesh = "mcl_campfires_campfire_lit.obj",
|
|
||||||
tiles = {{
|
|
||||||
name="mcl_campfires_" .. campfire.techname .. "_fire.png",
|
|
||||||
animation={
|
|
||||||
type="vertical_frames",
|
|
||||||
aspect_w=16,
|
|
||||||
aspect_h=16,
|
|
||||||
length=2.0
|
|
||||||
}},
|
|
||||||
{name="mcl_campfires_" .. campfire.techname .. "_log_lit.png",
|
|
||||||
animation={
|
|
||||||
type="vertical_frames",
|
|
||||||
aspect_w=16,
|
|
||||||
aspect_h=16,
|
|
||||||
length=2.0
|
|
||||||
}}
|
|
||||||
},
|
|
||||||
use_texture_alpha = "clip",
|
|
||||||
groups = { handy=1, axey=1, material_wood=1, campfire=1, lit_campfire=1 },
|
|
||||||
paramtype = "light",
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
|
||||||
if player:get_wielded_item():get_name():find("shovel") then
|
|
||||||
node.name = "mcl_campfires:" .. campfire.techname
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
drop = campfire.drops,
|
|
||||||
_mcl_silk_touch_drop = {"mcl_campfires:" .. campfire.techname .. "_lit"},
|
|
||||||
light_source = campfire.lightlevel,
|
|
||||||
mcl_sounds.node_sound_wood_defaults(),
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
|
||||||
},
|
|
||||||
collision_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
|
||||||
},
|
|
||||||
_mcl_blast_resistance = 2,
|
|
||||||
_mcl_hardness = 2,
|
|
||||||
damage_per_second = campfire.damage,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_campfires:campfire_lit",
|
|
||||||
recipe = {
|
|
||||||
{ "", "mcl_core:stick", "" },
|
|
||||||
{ "mcl_core:stick", "group:coal", "mcl_core:stick" },
|
|
||||||
{ "group:tree", "group:tree", "group:tree" },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = "mcl_campfires:soul_campfire_lit",
|
|
||||||
recipe = {
|
|
||||||
{ "", "mcl_core:stick", "" },
|
|
||||||
{ "mcl_core:stick", "group:soul_block", "mcl_core:stick" },
|
|
||||||
{ "group:tree", "group:tree", "group:tree" },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
local function burn_in_campfire(obj)
|
|
||||||
local p = obj:get_pos()
|
|
||||||
if p then
|
|
||||||
local n = minetest.find_node_near(p,0.4,{"group:lit_campfire"},true)
|
|
||||||
if n then
|
|
||||||
mcl_burning.set_on_fire(obj, 5)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local etime = 0
|
|
||||||
minetest.register_globalstep(function(dtime)
|
|
||||||
etime = dtime + etime
|
|
||||||
if etime < 0.5 then return end
|
|
||||||
etime = 0
|
|
||||||
for _,pl in pairs(minetest.get_connected_players()) do
|
|
||||||
burn_in_campfire(pl)
|
|
||||||
end
|
|
||||||
for _,ent in pairs(minetest.luaentities) do
|
|
||||||
if ent.is_mob then
|
|
||||||
burn_in_campfire(ent.object)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
# textdomain: mcl_campfires
|
||||||
|
Campfire=Fogueira
|
||||||
|
Soul Campfire=Fogueira de Almas
|
||||||
|
Cooks food and keeps bees happy.=Cozinhe comida e mantenha as abelhas felizes.
|
||||||
|
Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap.=Fogueiras possuem multiplos usos, incluindo manter abelhas felizes, cozinhar carnes cruas e peixes e como uma armadilha.
|
|
@ -0,0 +1,42 @@
|
||||||
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
|
-- Register Plain Campfire
|
||||||
|
mcl_campfires.register_campfire("mcl_campfires:campfire", {
|
||||||
|
description = S("Campfire"),
|
||||||
|
inv_texture = "mcl_campfires_campfire_inv.png",
|
||||||
|
fire_texture = "mcl_campfires_campfire_fire.png",
|
||||||
|
lit_logs_texture = "mcl_campfires_campfire_log_lit.png",
|
||||||
|
drops = "mcl_core:charcoal_lump 2",
|
||||||
|
lightlevel = 14,
|
||||||
|
damage = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Register Soul Campfire
|
||||||
|
mcl_campfires.register_campfire("mcl_campfires:soul_campfire", {
|
||||||
|
description = S("Soul Campfire"),
|
||||||
|
inv_texture = "mcl_campfires_soul_campfire_inv.png",
|
||||||
|
fire_texture = "mcl_campfires_soul_campfire_fire.png",
|
||||||
|
lit_logs_texture = "mcl_campfires_soul_campfire_log_lit.png",
|
||||||
|
drops = "mcl_blackstone:soul_soil",
|
||||||
|
lightlevel = 10,
|
||||||
|
damage = 2,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Register Campfire Crafting
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mcl_campfires:campfire_lit",
|
||||||
|
recipe = {
|
||||||
|
{ "", "mcl_core:stick", "" },
|
||||||
|
{ "mcl_core:stick", "group:coal", "mcl_core:stick" },
|
||||||
|
{ "group:tree", "group:tree", "group:tree" },
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mcl_campfires:soul_campfire_lit",
|
||||||
|
recipe = {
|
||||||
|
{ "", "mcl_core:stick", "" },
|
||||||
|
{ "mcl_core:stick", "group:soul_block", "mcl_core:stick" },
|
||||||
|
{ "group:tree", "group:tree", "group:tree" },
|
||||||
|
}
|
||||||
|
})
|
|
@ -1,14 +1,14 @@
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
-- Cartography Table Code. Used to create and copy maps. Needs a GUI still.
|
-- Cartography Table Code. Used to create and copy maps. TODO: Needs a GUI still.
|
||||||
|
|
||||||
minetest.register_node("mcl_cartography_table:cartography_table", {
|
minetest.register_node("mcl_cartography_table:cartography_table", {
|
||||||
description = S("Cartography Table"),
|
description = S("Cartography Table"),
|
||||||
_tt_help = S("Used to create or copy maps"),
|
_tt_help = S("Used to create or copy maps"),
|
||||||
_doc_items_longdesc = S("Is used to create or copy maps for use.."),
|
_doc_items_longdesc = S("Is used to create or copy maps for use.."),
|
||||||
tiles = {
|
tiles = {
|
||||||
"cartography_table_top.png", "cartography_table_side3.png",
|
"mcl_cartography_table_top.png", "mcl_cartography_table_side3.png",
|
||||||
"cartography_table_side3.png", "cartography_table_side2.png",
|
"mcl_cartography_table_side3.png", "mcl_cartography_table_side2.png",
|
||||||
"cartography_table_side3.png", "cartography_table_side1.png"
|
"mcl_cartography_table_side3.png", "mcl_cartography_table_side1.png"
|
||||||
},
|
},
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = { axey = 2, handy = 1, deco_block = 1, material_wood = 1, flammable = 1 },
|
groups = { axey = 2, handy = 1, deco_block = 1, material_wood = 1, flammable = 1 },
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
# textdomain: mcl_cartography_table
|
||||||
|
Cartography Table=Mesa de Cartografia
|
||||||
|
Used to create or copy maps=Utilizada para criar ou copiar mapas
|
||||||
|
Is used to create or copy maps for use..=É usada para criar ou copiar mapas para uso..
|
|
@ -67,12 +67,12 @@ local function register_filled_cauldron(water_level, description, liquid)
|
||||||
local water_tex
|
local water_tex
|
||||||
if liquid == "river_water" then
|
if liquid == "river_water" then
|
||||||
id = id .. "r"
|
id = id .. "r"
|
||||||
water_tex = "default_river_water_source_animated.png^[verticalframe:16:0"
|
water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#0084FF"
|
||||||
elseif liquid == "lava" then
|
elseif liquid == "lava" then
|
||||||
id = id .. "_lava"
|
id = id .. "_lava"
|
||||||
water_tex = "default_lava_source_animated.png^[verticalframe:16:0"
|
water_tex = "default_lava_source_animated.png^[verticalframe:16:0"
|
||||||
else
|
else
|
||||||
water_tex = "default_water_source_animated.png^[verticalframe:16:0"
|
water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#3F76E4"
|
||||||
end
|
end
|
||||||
minetest.register_node(id, {
|
minetest.register_node(id, {
|
||||||
description = description,
|
description = description,
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
# textdomain: mcl_cauldrons
|
||||||
|
Cauldron=Caldeirão
|
||||||
|
Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Caldeirões são usados para armazenar água e acumular lentamente água da chuva.
|
||||||
|
Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Coloque um balde com água no Caldeirão para enchê-lo com água. Coloque um balde vazio em um Caldeirão cheio para recuperar a água. Coloque uma garrafa com água no Caldeirão para preenchê-lo a um terço com água. Coloque uma garrafa de vidro no Caldeirão com água para recuperar um terço da água. Use um estandarte brasonado no Caldeirão com água para lavar sua primeira camada.
|
||||||
|
Cauldron (1/3 Water)=Caldeirão (1/3 Água)
|
||||||
|
Cauldron (2/3 Water)=Caldeirão (2/3 Água)
|
||||||
|
Cauldron (3/3 Water)=Caldeirão (3/3 Água)
|
||||||
|
Cauldron (1/3 River Water)=Caldeirão (1/3 Água de Rio)
|
||||||
|
Cauldron (2/3 River Water)=Caldeirão (2/3 Água de Rio)
|
||||||
|
Cauldron (3/3 River Water)=Caldeirão (3/3 Água de Rio)
|
||||||
|
Stores water=Armazena água
|
|
@ -0,0 +1,36 @@
|
||||||
|
# textdomain: mcl_chests
|
||||||
|
Chest=Baú
|
||||||
|
Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Baús são recipientes que fornecem um inventário com 27 espaços. Baús podem ser convertidos em baús largos com o dobro da capacidade ao colocar dois baús um ao lado do outro.
|
||||||
|
To access its inventory, rightclick it. When broken, the items will drop out.=Para acessar seu inventário, clique-o com o botão direito. Quando quebrado, os itens serão derrubados no chão.
|
||||||
|
Trapped Chest=Baú com armadilha
|
||||||
|
A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Um baú com armadilha é um recipiente que fornece um inventário com 27 espaços. Quando aberto, envia um sinal de redstone para os blocos adjacentes enquanto estiver aberto. Baús com armadilhas podem se tornar báus largos com armadilha com o dobro da capacidade ao colocar dois baús com armadilha um ao lado do outro.
|
||||||
|
Ender Chest=Baú de Ender
|
||||||
|
Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Baús de ender lhe garantem acesso à um inventário pessoal interdimensional com 27 espaços. Esse inventário é o mesmo independente do baú do ender que você acessar. Se você colocar um item em um baú de ender, você o encontrará em todos os outros baús de ender. Cada jogador poderá ver seus próprios itens, mas não os de outros jogadores.
|
||||||
|
Rightclick the ender chest to access your personal interdimensional inventory.=Aperte com o botão direito no baú de ender para acessar seu inventário pessoal interdimensional.
|
||||||
|
White Shulker Box=Caixa de Shulker Branca
|
||||||
|
Light Grey Shulker Box=Caixa de Shulker Cinza-Clara
|
||||||
|
Orange Shulker Box=Caixa de Shulker Laranja
|
||||||
|
Cyan Shulker Box=Caixa de Shulker Ciano
|
||||||
|
Magenta Shulker Box=Caixa de Shulker Magenta
|
||||||
|
Purple Shulker Box=Caixa de Shulker Roxa
|
||||||
|
Light Blue Shulker Box=Caixa de Shulker Azul-Clara
|
||||||
|
Blue Shulker Box=Caixa de Shulker Azul
|
||||||
|
Yellow Shulker Box=Caixa de Shulker Amarela
|
||||||
|
Brown Shulker Box=Caixa de Shulker Marrom
|
||||||
|
Lime Shulker Box=Caixa de Shulker Lima
|
||||||
|
Green Shulker Box=Caixa de Shulker Verde
|
||||||
|
Pink Shulker Box=Caixa de Shulker Rosa
|
||||||
|
Red Shulker Box=Caixa de Shulker Vermelha
|
||||||
|
Grey Shulker Box=Caixa de Shulker Cinza
|
||||||
|
Black Shulker Box=Caixa de Shulker Preta
|
||||||
|
A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Uma caixa de shulker é um recipiente portátil que fornece um inventário com 27 espaços para qualquer item exceto outras caixas de shulker. Caixas de shulker retêm seus inventários quando quebradas, portanto caixas de shulker, assim como seu conteúdo, podem ser carregadas como um único item. Caixas de shulker vêm em diferentes cores.
|
||||||
|
To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Para acessar o inventário de uma caixa de shulker, coloque-a e aperte-a com o botão direito. Para levar uma caixa de shulker com seu conteúdo com você, apenas quebre-a e a colete, os itens não cairão no chão. Coloque a caixa de shulker novamente para conseguir retirar seu conteúdo.
|
||||||
|
Shulker Box=Caixa de Shulker
|
||||||
|
Large Chest=Baú Largo
|
||||||
|
Inventory=Inventário
|
||||||
|
27 inventory slots=27 espaços de inventário
|
||||||
|
Can be carried around with its contents=Pode ser carregada com seu conteúdo
|
||||||
|
Can be combined to a large chest=Pode ser combinado para um baú largo
|
||||||
|
27 interdimensional inventory slots=27 espaços de inventário interdimensional
|
||||||
|
Put items inside, retrieve them from any ender chest=Coloque itens dentro, retire-os a partir de qualquer báu de ender
|
||||||
|
Emits a redstone signal when opened=Emite um sinal de redstone quando aberto
|
|
@ -0,0 +1,5 @@
|
||||||
|
# textdomain: mcl_clock
|
||||||
|
Clocks are tools which shows the current time of day in the Overworld.=Relógios são ferramentas que mostram o tempo do dia na Superfície.
|
||||||
|
The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=O relógio contêm um disco rotatório com um simbolo do sol (disco amarelo) e um símbolo da lua com um pequeno "ponteiro" que mostra o momento atual do dia estimando a posição real do sol e da lua no céu. Meio-dia é representado pelo símbolo do sol e meia-noite é representado pelo símbolo da lua.
|
||||||
|
Clock=Relógio
|
||||||
|
Displays the time of day in the Overworld=Mostra o tempo do dia na Superfície
|
|
@ -0,0 +1,6 @@
|
||||||
|
# textdomain: mcl_cocoas
|
||||||
|
Premature Cocoa Pod=Vagem de Cacau Prematuro
|
||||||
|
Cocoa pods grow on the side of jungle trees in 3 stages.=Vagens de cacau crescem ao lado de árvores de selva em 3 estágios.
|
||||||
|
Medium Cocoa Pod=Vagem de Cacau Média
|
||||||
|
Mature Cocoa Pod=Vagem de Cacau Madura
|
||||||
|
A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Uma vagem de cacau madura cresceu em uma árvore de selva até seu tamanho máximo e está pronta para ser colhida em sementes de cacau. Não crescerá mais.
|
|
@ -0,0 +1,76 @@
|
||||||
|
# textdomain: mcl_colorblocks
|
||||||
|
White Terracotta=Terracota Branca
|
||||||
|
White Glazed Terracotta=Terracota Esmaltada Branca
|
||||||
|
White Concrete Powder=Pó de Concreto Branco
|
||||||
|
White Concrete=Concreto Branco
|
||||||
|
Grey Terracotta=Terracota Cinza
|
||||||
|
Grey Glazed Terracotta=Terracota Esmaltada Cinza
|
||||||
|
Grey Concrete Powder=Pó de Concreto Cinza
|
||||||
|
Grey Concrete=Concreto Cinza
|
||||||
|
Light Grey Terracotta=Terracota Cinza-Clara
|
||||||
|
Light Grey Glazed Terracotta=Terracota Esmaltada Cinza-Clara
|
||||||
|
Light Grey Concrete Powder=Pó de Concreto Cinza-Claro
|
||||||
|
Light Grey Concrete=Concreto Cinza-Claro
|
||||||
|
Black Terracotta=Terracota Preta
|
||||||
|
Black Glazed Terracotta=Terracota Esmaltada Preta
|
||||||
|
Black Concrete Powder=Pó de Concreto Preto
|
||||||
|
Black Concrete=Concreto Preto
|
||||||
|
Red Terracotta=Terracota Vermalha
|
||||||
|
Red Glazed Terracotta=Terracota Esmaltada Vermelha
|
||||||
|
Red Concrete Powder=Pó de Concreto Vermelho
|
||||||
|
Red Concrete=Concreto Vermelho
|
||||||
|
Yellow Terracotta=Terracota Amarela
|
||||||
|
Yellow Glazed Terracotta=Terracota Esmaltada Amarela
|
||||||
|
Yellow Concrete Powder=Pó de Concreto Amarelo
|
||||||
|
Yellow Concrete=Concreto Amarelo
|
||||||
|
Green Terracotta=Terracota Verde
|
||||||
|
Green Glazed Terracotta=Terracota Esmaltada Verde
|
||||||
|
Green Concrete Powder=Pó de Concreto Verde
|
||||||
|
Green Concrete=Concreto Verde
|
||||||
|
Cyan Terracotta=Terracota Ciano
|
||||||
|
Cyan Glazed Terracotta=Terracota Esmaltada Ciano
|
||||||
|
Cyan Concrete Powder=Pó de Concreto Ciano
|
||||||
|
Cyan Concrete=Concreto Ciano
|
||||||
|
Blue Terracotta=Terracota Azul
|
||||||
|
Blue Glazed Terracotta=Terracota Esmaltada Azul
|
||||||
|
Blue Concrete Powder=Pó de Concreto Azul
|
||||||
|
Blue Concrete=Concreto Azul
|
||||||
|
Magenta Terracotta=Terracota Magenta
|
||||||
|
Magenta Glazed Terracotta=Terracota Esmaltada Magenta
|
||||||
|
Magenta Concrete Powder=Pó de Concreto Magenta
|
||||||
|
Magenta Concrete=Concreto Magenta
|
||||||
|
Orange Terracotta=Terracota Laranja
|
||||||
|
Orange Glazed Terracotta=Terracota Esmaltada Laranja
|
||||||
|
Orange Concrete Powder=Pó de Concreto Laranja
|
||||||
|
Orange Concrete=Concreto Laranja
|
||||||
|
Purple Terracotta=Terracota Roxa
|
||||||
|
Purple Glazed Terracotta=Terracota Esmaltada Roxa
|
||||||
|
Purple Concrete Powder=Pó de Concreto Roxo
|
||||||
|
Purple Concrete=Concreto Roxo
|
||||||
|
Brown Terracotta=Terracota Marrom
|
||||||
|
Brown Glazed Terracotta=Terracota Esmaltada Marrom
|
||||||
|
Brown Concrete Powder=Pó de Concreto Marrom
|
||||||
|
Brown Concrete=Concreto Marrom
|
||||||
|
Pink Terracotta=Terracota Rosa
|
||||||
|
Pink Glazed Terracotta=Terracota Esmaltada Rosa
|
||||||
|
Pink Concrete Powder=Pó de Concreto Rosa
|
||||||
|
Pink Concrete=Concreto Rosa
|
||||||
|
Lime Terracotta=Terracota Lima
|
||||||
|
Lime Glazed Terracotta=Terracota Esmaltada Lima
|
||||||
|
Lime Concrete Powder=Pó de Concreto Lima
|
||||||
|
Lime Concrete=Concreto Lima
|
||||||
|
Light Blue Terracotta=Terracota Azul-Clara
|
||||||
|
Light Blue Glazed Terracotta=Terracota Esmaltada Azul-Clara
|
||||||
|
Light Blue Concrete Powder=Pó de Concreto Azul-Claro
|
||||||
|
Light Blue Concrete=Concreto Azul-Claro
|
||||||
|
Terracotta is a basic building material. It comes in many different colors.=Terracota é um material de construção básico.
|
||||||
|
Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Terracota esmaltada é um bloco decorativo com padrões complexos. Pode ser rotacionado ao ser colocado em diferentes direções.
|
||||||
|
Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Pó de concreto é utilizado para fabricar concreto, mas também pode ser usado como um bloco de decoração. Vem em diferentes cores. Pó de concreto se torna concreto da mesma cor quando entra em contato com água.
|
||||||
|
Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Concreto é um bloco decorativo que vem em diferentes cores. É notável por possuir uma coloração forte e limpa.
|
||||||
|
Terracotta=Terracota
|
||||||
|
Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terracota é um material de construção básico que vem em diferentes cores. Este bloco em particular é incolor.
|
||||||
|
Colored Terracotta=Terracota Colorida
|
||||||
|
Glazed Terracotta=Terracota Esmaltada
|
||||||
|
Concrete Powder=Pó de Concreto
|
||||||
|
Concrete=Concreto
|
||||||
|
Turns into concrete on water contact=Se torna concreto em contato com água
|
|
@ -0,0 +1,10 @@
|
||||||
|
# textdomain: mcl_compass
|
||||||
|
Compass=Bússola
|
||||||
|
Points to the world origin=Aponta para a origem do mundo
|
||||||
|
Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Bússolas são ferramentas que aponta para a origem do mundo (X@=0, Z@=0) ou para o lugar de spawn na Superfície.
|
||||||
|
A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Uma bússola sempre aponta para o lugar de spawn do mundo quando o jogador está na superfície. Em outras dimensões, ela gira aleatoriamente.
|
||||||
|
Lodestone Compass=Bússola Magnetizada
|
||||||
|
Points to a lodestone=Aponta para uma magnetita
|
||||||
|
Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Bússolas magnetizadas lembram bússolas comuns, mas apontam para uma magnetita específica.
|
||||||
|
A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.=Uma bússola magnetizada pode ser feita a partir de uma bússola comum ao utilizá-la em uma magnetita. Após se tornar uma bússola magnetizada, sempre apontará para a magnetita vinculada desde que estejam na mesma dimensão. Se não estão na mesma dimensão, uma bússola magnetizada girará aleatoriamente, similar a uma bússola comum quando está fora da superfície. Uma bússola magnetizada pode ser revinculada com outra magnetita.
|
||||||
|
Lodestone=Magnetita
|
|
@ -3,43 +3,15 @@
|
||||||
local function register_oxidation_abm(abm_name, node_name, oxidized_variant)
|
local function register_oxidation_abm(abm_name, node_name, oxidized_variant)
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = abm_name,
|
label = abm_name,
|
||||||
nodenames = {node_name},
|
nodenames = { node_name },
|
||||||
interval = 500,
|
interval = 500,
|
||||||
chance = 3,
|
chance = 3,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
minetest.swap_node(pos, {name = oxidized_variant, param2 = node.param2})
|
minetest.swap_node(pos, { name = oxidized_variant, param2 = node.param2 })
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
function waxing_copper_block(pos, node, player, itemstack, convert_to)
|
|
||||||
if itemstack:get_name() == "mcl_honey:honeycomb" then
|
|
||||||
node.name = convert_to
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
awards.unlock(player:get_player_name(), "mcl:wax_on")
|
|
||||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
|
||||||
itemstack:take_item()
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function scraping_copper_block(pos, node, player, itemstack, convert_to)
|
|
||||||
if itemstack:get_name():find("axe") then
|
|
||||||
node.name = convert_to
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
awards.unlock(player:get_player_name(), "mcl:wax_off")
|
|
||||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
|
||||||
local tool = itemstack:get_name()
|
|
||||||
local wear = mcl_autogroup.get_wear(tool, "axey")
|
|
||||||
itemstack:add_wear(wear)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
local stairs = {
|
local stairs = {
|
||||||
{"stair", "exposed", "_inner", "cut_inner"},
|
{"stair", "exposed", "_inner", "cut_inner"},
|
||||||
|
@ -62,148 +34,42 @@ local stairs = {
|
||||||
{"stair", "weathered", "", "exposed_cut"},
|
{"stair", "weathered", "", "exposed_cut"},
|
||||||
}]]
|
}]]
|
||||||
|
|
||||||
--[[
|
|
||||||
local function anti_oxidation_particles(pointed_thing)
|
|
||||||
local pos = pointed_thing.under
|
|
||||||
minetest.add_particlespawner({
|
|
||||||
amount = 8,
|
|
||||||
time = 1,
|
|
||||||
minpos = {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1},
|
|
||||||
maxpos = {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
|
|
||||||
minvel = {x = 0, y = 0, z = 0},
|
|
||||||
maxvel = {x = 0, y = 0, z = 0},
|
|
||||||
minacc = {x = 0, y = 0, z = 0},
|
|
||||||
maxacc = {x = 0, y = 0, z = 0},
|
|
||||||
minexptime = 0.5,
|
|
||||||
maxexptime = 1,
|
|
||||||
minsize = 1,
|
|
||||||
maxsize = 2.5,
|
|
||||||
collisiondetection = false,
|
|
||||||
vertical = false,
|
|
||||||
texture = "mcl_copper_anti_oxidation_particle.png",
|
|
||||||
glow = 5,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_wear(placer, itemstack)
|
|
||||||
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
|
||||||
local tool = itemstack:get_name()
|
|
||||||
local wear = mcl_autogroup.get_wear(tool, "axey")
|
|
||||||
itemstack:add_wear(wear)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function anti_oxidation(itemstack, placer, pointed_thing)
|
|
||||||
if pointed_thing.type ~= "node" then return end
|
|
||||||
|
|
||||||
local node = minetest.get_node(pointed_thing.under)
|
|
||||||
local noddef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name]
|
|
||||||
|
|
||||||
if not placer:get_player_control().sneak and noddef.on_rightclick then
|
|
||||||
return minetest.item_place(itemstack, placer, pointed_thing)
|
|
||||||
end
|
|
||||||
|
|
||||||
if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
|
|
||||||
minetest.record_protection_violation(pointed_thing.under, placer:get_player_name())
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
if noddef._mcl_stripped_variant == nil then
|
|
||||||
for _, c in pairs(stairs) do
|
|
||||||
if noddef.name == "mcl_stairs:"..c[1].."_copper_"..c[2].."_cut"..c[3] then
|
|
||||||
minetest.swap_node(pointed_thing.under, {name="mcl_stairs:"..c[1].."_copper_"..c[4], param2=node.param2})
|
|
||||||
anti_oxidation_particles(pointed_thing)
|
|
||||||
add_wear(placer, itemstack)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if noddef._mcl_anti_oxidation_variant ~= nil then
|
|
||||||
minetest.swap_node(pointed_thing.under, {name=noddef._mcl_anti_oxidation_variant, param2=node.param2})
|
|
||||||
anti_oxidation_particles(pointed_thing)
|
|
||||||
add_wear(placer, itemstack)
|
|
||||||
end
|
|
||||||
elseif noddef._mcl_stripped_variant ~= nil then
|
|
||||||
minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2})
|
|
||||||
add_wear(placer, itemstack)
|
|
||||||
else
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
return itemstack
|
|
||||||
end
|
|
||||||
|
|
||||||
local function register_axe_override(axe_name)
|
|
||||||
minetest.override_item("mcl_tools:axe_"..axe_name, {
|
|
||||||
on_place = anti_oxidation,
|
|
||||||
})
|
|
||||||
end]]
|
|
||||||
|
|
||||||
--[[ Commented out for now because there the discussion how to handle this is ongoing
|
|
||||||
local stonelike = {"mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite"}
|
|
||||||
if not deepslate_mod then
|
|
||||||
if minetest.settings:get_bool("mcl_generate_ores", true) then
|
|
||||||
minetest.register_ore({
|
|
||||||
ore_type = "scatter",
|
|
||||||
ore = "mcl_copper:stone_with_copper",
|
|
||||||
wherein = stonelike,
|
|
||||||
clust_scarcity = 830,
|
|
||||||
clust_num_ores = 5,
|
|
||||||
clust_size = 3,
|
|
||||||
y_min = mcl_vars.mg_overworld_min,
|
|
||||||
y_max = mcl_worlds.layer_to_y(39),
|
|
||||||
})
|
|
||||||
minetest.register_ore({
|
|
||||||
ore_type = "scatter",
|
|
||||||
ore = "mcl_copper:stone_with_copper",
|
|
||||||
wherein = stonelike,
|
|
||||||
clust_scarcity = 1660,
|
|
||||||
clust_num_ores = 4,
|
|
||||||
clust_size = 2,
|
|
||||||
y_min = mcl_worlds.layer_to_y(40),
|
|
||||||
y_max = mcl_worlds.layer_to_y(63),
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--]]
|
|
||||||
local block_oxidation = {
|
local block_oxidation = {
|
||||||
{"", "_exposed"},
|
{ "", "_exposed" },
|
||||||
{"_cut", "_exposed_cut"},
|
{ "_cut", "_exposed_cut" },
|
||||||
{"_exposed", "_weathered"},
|
{ "_exposed", "_weathered" },
|
||||||
{"_exposed_cut", "_weathered_cut"},
|
{ "_exposed_cut", "_weathered_cut" },
|
||||||
{"_weathered", "_oxidized"},
|
{ "_weathered", "_oxidized" },
|
||||||
{"_weathered_cut", "_oxidized_cut"}
|
{ "_weathered_cut", "_oxidized_cut" }
|
||||||
}
|
}
|
||||||
|
|
||||||
local stair_oxidation = {
|
local stair_oxidation = {
|
||||||
{"slab", "cut", "exposed_cut"},
|
{ "slab", "cut", "exposed_cut" },
|
||||||
{"slab", "exposed_cut", "weathered_cut"},
|
{ "slab", "exposed_cut", "weathered_cut" },
|
||||||
{"slab", "weathered_cut", "oxidized_cut"},
|
{ "slab", "weathered_cut", "oxidized_cut" },
|
||||||
{"slab", "cut_top", "exposed_cut_top"},
|
{ "slab", "cut_top", "exposed_cut_top" },
|
||||||
{"slab", "exposed_cut_top", "weathered_cut_top"},
|
{ "slab", "exposed_cut_top", "weathered_cut_top" },
|
||||||
{"slab", "weathered_cut_top", "oxidized_cut_double"},
|
{ "slab", "weathered_cut_top", "oxidized_cut_double" },
|
||||||
{"slab", "cut_double", "exposed_cut_double"},
|
{ "slab", "cut_double", "exposed_cut_double" },
|
||||||
{"slab", "exposed_cut_double", "weathered_cut_double"},
|
{ "slab", "exposed_cut_double", "weathered_cut_double" },
|
||||||
{"slab", "weathered_cut_double", "oxidized_cut_double"},
|
{ "slab", "weathered_cut_double", "oxidized_cut_double" },
|
||||||
{"stair", "cut", "exposed_cut"},
|
{ "stair", "cut", "exposed_cut" },
|
||||||
{"stair", "exposed_cut", "weathered_cut"},
|
{ "stair", "exposed_cut", "weathered_cut" },
|
||||||
{"stair", "weathered_cut", "oxidized_cut"},
|
{ "stair", "weathered_cut", "oxidized_cut" },
|
||||||
{"stair", "cut_inner", "exposed_cut_inner"},
|
{ "stair", "cut_inner", "exposed_cut_inner" },
|
||||||
{"stair", "exposed_cut_inner", "weathered_cut_inner"},
|
{ "stair", "exposed_cut_inner", "weathered_cut_inner" },
|
||||||
{"stair", "weathered_cut_inner", "oxidized_cut_inner"},
|
{ "stair", "weathered_cut_inner", "oxidized_cut_inner" },
|
||||||
{"stair", "cut_outer", "exposed_cut_outer"},
|
{ "stair", "cut_outer", "exposed_cut_outer" },
|
||||||
{"stair", "exposed_cut_outer", "weathered_cut_outer"},
|
{ "stair", "exposed_cut_outer", "weathered_cut_outer" },
|
||||||
{"stair", "weathered_cut_outer", "oxidized_cut_outer"}
|
{ "stair", "weathered_cut_outer", "oxidized_cut_outer" }
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, b in pairs(block_oxidation) do
|
for _, b in pairs(block_oxidation) do
|
||||||
register_oxidation_abm("Copper oxidation", "mcl_copper:block"..b[1], "mcl_copper:block"..b[2])
|
register_oxidation_abm("Copper oxidation", "mcl_copper:block" .. b[1], "mcl_copper:block" .. b[2])
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, s in pairs(stair_oxidation) do
|
for _, s in pairs(stair_oxidation) do
|
||||||
register_oxidation_abm("Copper oxidation", "mcl_stairs:"..s[1].."_copper_"..s[2], "mcl_stairs:"..s[1].."_copper_"..s[3])
|
register_oxidation_abm("Copper oxidation", "mcl_stairs:" .. s[1] .. "_copper_" .. s[2], "mcl_stairs:" .. s[1] .. "_copper_" .. s[3])
|
||||||
|
-- TODO: Make stairs and slabs be waxable / scrapable. Place the Node overrides here, just like they are on the copper nodes, and it will work properly. May need to update mcl_honey to call the waxing function for stairs and slabs.
|
||||||
end
|
end
|
||||||
|
|
||||||
--local axes = {"wood", "stone", "iron", "gold", "diamond"}
|
|
||||||
--[[
|
|
||||||
for _, axe in pairs(axes) do
|
|
||||||
register_axe_override(axe)
|
|
||||||
end
|
|
||||||
]]
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
local path = minetest.get_modpath("mcl_copper")
|
local path = minetest.get_modpath("mcl_copper")
|
||||||
|
|
||||||
|
mcl_copper = {} -- initialize global variable.
|
||||||
|
|
||||||
dofile(path .. "/functions.lua")
|
dofile(path .. "/functions.lua")
|
||||||
dofile(path .. "/nodes.lua")
|
dofile(path .. "/nodes.lua")
|
||||||
dofile(path .. "/items.lua")
|
dofile(path .. "/items.lua")
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
# textdomain: mcl_copper
|
||||||
|
A block of copper is mostly a decorative block.=Um bloco de cobre é principalmente um bloco decorativo.
|
||||||
|
A block used for compact raw copper storage.=Um bloco usado para armazenar minério de cobre compactado.
|
||||||
|
Block of Copper=Bloco de Cobre
|
||||||
|
Waxed Block of Copper=Bloco de Cobre Encerado
|
||||||
|
Block of Raw Copper=Bloco de Cobre Crú
|
||||||
|
Copper Ingot=Lingote de Cobre
|
||||||
|
Copper Ore=Minério de Cobre
|
||||||
|
Cut copper is a decorative block.=Cobre lapidado é um bloco decorativo
|
||||||
|
Cut Copper=Cobre Lapidado
|
||||||
|
Waxed Cut Copper=Cobre Lapidado Encerado
|
||||||
|
Double Slab of Cut Copper=Laje Dupla de Cobre Lapidado
|
||||||
|
Double Slab of Exposed Cut Copper=Laje Dupla de Cobre Lapidado Exposto
|
||||||
|
Double Slab of Oxidized Cut Copper=Laje Dupla de Cobre Lapidado Oxidado
|
||||||
|
Double Slab of Weathered Cut Copper=Laje Dupla de Cobre Lapidado Desgastado
|
||||||
|
Waxed Double Slab of Cut Copper=Laje Dupla de Cobre Lapidado Encerado
|
||||||
|
Waxed Double Slab of Exposed Cut Copper=Laje Dupla de Cobre Lapidado Exposto Encerado
|
||||||
|
Waxed Double Slab of Oxidized Cut Copper=Laje Dupla de Cobre Lapidado Oxidado Encerado
|
||||||
|
Waxed Double Slab of Weathered Cut Copper=Laje Dupla de Cobre Lapidado Desgastado Encerado
|
||||||
|
Exposed copper is a decorative block.=Cobre exposto é um bloco decorativo.
|
||||||
|
Exposed Copper=Cobre Exposto
|
||||||
|
Waxed Exposed Copper=Cobre Exposto Encerado
|
||||||
|
Exposed cut copper is a decorative block.=Cobre lapidado encerado é um bloco decorativo.
|
||||||
|
Exposed Cut Copper=Cobre Lapidado Exposto
|
||||||
|
Waxed Exposed Cut Copper=Cobre Lapidado Exposto Encerado
|
||||||
|
Molten Raw Copper. It is used to craft blocks.=Minério de Cobre Fundido. É utilizado para fabricar blocos.
|
||||||
|
Oxidized copper is a decorative block.=Cobre oxidado é um bloco decorativo.
|
||||||
|
Oxidized Copper=Cobre Oxidado
|
||||||
|
Waxed Oxidized Copper=Cobre Oxidado Encerado
|
||||||
|
Oxidized cut copper is a decorative block.=Cobre lapidado oxidado é um bloco decorativo.
|
||||||
|
Oxidized Cut Copper=Cobre Lapidado Oxidado
|
||||||
|
Waxed Oxidized Cut Copper=Cobre Lapidado Oxidado Encerado
|
||||||
|
Raw Copper. Mine a Copper Ore to get it.=Cobre Crú. Minere um minério de cobre para obtê-lo.
|
||||||
|
Raw Copper=Cobre Crú
|
||||||
|
Slab of Cut Copper=Laje de Cobre Lapidado
|
||||||
|
Slab of Exposed Cut Copper=Laje de Cobre Lapidado Exposto
|
||||||
|
Slab of Oxidized Cut Copper=Laje de Cobre Lapidado Oxidado
|
||||||
|
Slab of Weathered Cut Copper=Laje de Cobre Lapidado Desgastado
|
||||||
|
Waxed Slab of Cut Copper=Laje de Cobre Lapidado Encerado
|
||||||
|
Waxed Slab of Exposed Cut Copper=Laje de Cobre Lapidado Exposto Encerado
|
||||||
|
Waxed Slab of Oxidized Cut Copper=Laje de Cobre Lapidado Oxidado Encerado
|
||||||
|
Waxed Slab of Weathered Cut Copper=Laje de Cobre Lapidado Desgastado Encerado
|
||||||
|
Some copper contained in stone, it is pretty common and can be found below sea level.=Um pouco de cobre contido em rocha, é bem comum e pode ser encontrado abaixo do nível do mar.
|
||||||
|
Stairs of Cut Copper=Escadas de Cobre Lapidado
|
||||||
|
Stairs of Exposed Cut Copper=Escadas de Cobre Lapidado Exposto
|
||||||
|
Stairs of Oxidized Cut Copper=Escadas de Cobre Lapidado Oxidado
|
||||||
|
Stairs of Weathered Cut Copper=Escadas de Cobre Lapidado Desgastado
|
||||||
|
Waxed Stairs of Cut Copper=Escadas de Cobre Lapidado Encerado
|
||||||
|
Waxed Stairs of Exposed Cut Copper=Escadas de Cobre Lapidado Exposto Encerado
|
||||||
|
Waxed Stairs of Oxidized Cut Copper=Escadas de Cobre Lapidado Oxidado Encerado
|
||||||
|
Waxed Stairs of Weathered Cut Copper=Escadas de Cobre Lapidado Desgastado Encerado
|
||||||
|
Weathered copper is a decorative block.=Cobre desgastado é um bloco decorativo.
|
||||||
|
Weathered Copper=Cobre Desgastado
|
||||||
|
Waxed Weathered Copper=Cobre Desgastado Encerado
|
||||||
|
Weathered cut copper is a decorative block.=Cobre lapidado desgastado é um bloco decorativo.
|
||||||
|
Weathered Cut Copper=Cobre Lapidado Desgastado
|
||||||
|
Waxed Weathered Cut Copper=Cobre Lapidado Desgastado Encerado
|
|
@ -1,4 +1,4 @@
|
||||||
name = mcl_copper
|
name = mcl_copper
|
||||||
author = NO11
|
author = NO11
|
||||||
depends = mcl_core, mcl_sounds, mcl_stairs
|
depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util
|
||||||
description = Adds Copper Ore, blocks and items.
|
description = Adds Copper Ore, blocks and items.
|
||||||
|
|
|
@ -12,7 +12,6 @@ minetest.register_node("mcl_copper:stone_with_copper", {
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
_mcl_silk_touch_drop = true,
|
_mcl_silk_touch_drop = true,
|
||||||
_mcl_fortune_drop = mcl_core.fortune_drop_ore,
|
_mcl_fortune_drop = mcl_core.fortune_drop_ore,
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_raw", {
|
minetest.register_node("mcl_copper:block_raw", {
|
||||||
|
@ -35,7 +34,7 @@ minetest.register_node("mcl_copper:block", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block") end,
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block", {
|
minetest.register_node("mcl_copper:waxed_block", {
|
||||||
|
@ -47,7 +46,7 @@ minetest.register_node("mcl_copper:waxed_block", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block") end,
|
_mcl_stripped_variant = "mcl_copper:block",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_exposed", {
|
minetest.register_node("mcl_copper:block_exposed", {
|
||||||
|
@ -59,8 +58,8 @@ minetest.register_node("mcl_copper:block_exposed", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
_mcl_anti_oxidation_varient = "mcl_copper:block",
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_exposed",
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_exposed") end,
|
_mcl_stripped_variant = "mcl_copper:block",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_exposed", {
|
minetest.register_node("mcl_copper:waxed_block_exposed", {
|
||||||
|
@ -72,7 +71,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block") end,
|
_mcl_stripped_variant = "mcl_copper:block",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_weathered", {
|
minetest.register_node("mcl_copper:block_weathered", {
|
||||||
|
@ -84,8 +83,8 @@ minetest.register_node("mcl_copper:block_weathered", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
_mcl_anti_oxidation_varient = "mcl_copper:block_exposed",
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_weathered",
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_weathered") end,
|
_mcl_stripped_variant = "mcl_copper:block_exposed",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_weathered", {
|
minetest.register_node("mcl_copper:waxed_block_weathered", {
|
||||||
|
@ -97,7 +96,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block_exposed") end,
|
_mcl_stripped_variant = "mcl_copper:block_exposed",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_oxidized", {
|
minetest.register_node("mcl_copper:block_oxidized", {
|
||||||
|
@ -109,8 +108,8 @@ minetest.register_node("mcl_copper:block_oxidized", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
_mcl_anti_oxidation_varient = "mcl_copper:block_weathered",
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_oxidized",
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_oxidized") end,
|
_mcl_stripped_variant = "mcl_copper:block_weathered",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_oxidized", {
|
minetest.register_node("mcl_copper:waxed_block_oxidized", {
|
||||||
|
@ -122,7 +121,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block_weathered") end,
|
_mcl_stripped_variant = "mcl_copper:block_weathered",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_cut", {
|
minetest.register_node("mcl_copper:block_cut", {
|
||||||
|
@ -134,7 +133,7 @@ minetest.register_node("mcl_copper:block_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_cut") end,
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_cut", {
|
minetest.register_node("mcl_copper:waxed_block_cut", {
|
||||||
|
@ -146,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block_cut") end,
|
_mcl_stripped_variant = "mcl_copper:block_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_exposed_cut", {
|
minetest.register_node("mcl_copper:block_exposed_cut", {
|
||||||
|
@ -158,8 +157,8 @@ minetest.register_node("mcl_copper:block_exposed_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
_mcl_anti_oxidation_varient = "mcl_copper:block_cut",
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_exposed_cut",
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_exposed_cut") end,
|
_mcl_stripped_variant = "mcl_copper:block_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_exposed_cut", {
|
minetest.register_node("mcl_copper:waxed_block_exposed_cut", {
|
||||||
|
@ -171,7 +170,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block_cut") end,
|
_mcl_stripped_variant = "mcl_copper:block_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_weathered_cut", {
|
minetest.register_node("mcl_copper:block_weathered_cut", {
|
||||||
|
@ -183,8 +182,8 @@ minetest.register_node("mcl_copper:block_weathered_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
_mcl_anti_oxidation_varient = "mcl_copper:block_exposed_cut",
|
_mcl_stripped_variant = "mcl_copper:block_exposed_cut",
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_weathered_cut") end,
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_weathered_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_weathered_cut", {
|
minetest.register_node("mcl_copper:waxed_block_weathered_cut", {
|
||||||
|
@ -196,7 +195,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block_exposed_cut") end,
|
_mcl_stripped_variant = "mcl_copper:block_exposed_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:block_oxidized_cut", {
|
minetest.register_node("mcl_copper:block_oxidized_cut", {
|
||||||
|
@ -208,8 +207,8 @@ minetest.register_node("mcl_copper:block_oxidized_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
_mcl_anti_oxidation_varient = "mcl_copper:block_weathered_cut",
|
_mcl_stripped_variant = "mcl_copper:block_weathered_cut",
|
||||||
on_rightclick = function(pos, node, player, itemstack) waxing_copper_block(pos, node, player, itemstack, "mcl_copper:waxed_block_oxidized_cut") end,
|
_mcl_copper_waxed_variant = "mcl_copper:waxed_block_oxidized_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mcl_copper:waxed_block_oxidized_cut", {
|
minetest.register_node("mcl_copper:waxed_block_oxidized_cut", {
|
||||||
|
@ -221,7 +220,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", {
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 5,
|
_mcl_hardness = 5,
|
||||||
on_rightclick = function(pos, node, player, itemstack) scraping_copper_block(pos, node, player, itemstack, "mcl_copper:block_weathered_cut") end,
|
_mcl_stripped_variant = "mcl_copper:block_weathered_cut",
|
||||||
})
|
})
|
||||||
|
|
||||||
mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut",
|
mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut",
|
||||||
|
|
|
@ -405,6 +405,7 @@ function mcl_core.generate_tree(pos, tree_type, options)
|
||||||
elseif tree_type == BIRCH_TREE_ID then
|
elseif tree_type == BIRCH_TREE_ID then
|
||||||
mcl_core.generate_birch_tree(pos)
|
mcl_core.generate_birch_tree(pos)
|
||||||
end
|
end
|
||||||
|
mcl_core.update_sapling_foliage_colors(pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Classic oak in v6 style
|
-- Classic oak in v6 style
|
||||||
|
@ -801,23 +802,19 @@ end
|
||||||
|
|
||||||
local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed"))
|
local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed"))
|
||||||
|
|
||||||
function mcl_core.get_grass_palette_index(pos)
|
|
||||||
local biome_data = minetest.get_biome_data(pos)
|
|
||||||
local index = 0
|
|
||||||
if biome_data then
|
|
||||||
local biome = biome_data.biome
|
|
||||||
local biome_name = minetest.get_biome_name(biome)
|
|
||||||
local reg_biome = minetest.registered_biomes[biome_name]
|
|
||||||
if reg_biome then
|
|
||||||
index = reg_biome._mcl_grass_palette_index
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return index
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Return appropriate grass block node for pos
|
-- Return appropriate grass block node for pos
|
||||||
function mcl_core.get_grass_block_type(pos)
|
function mcl_core.get_grass_block_type(pos)
|
||||||
return {name = "mcl_core:dirt_with_grass", param2 = mcl_core.get_grass_palette_index(pos)}
|
return {name = minetest.get_node(pos).name, param2 = mcl_util.get_palette_indexes_from_pos(pos).grass_palette_index}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Return appropriate foliage block node for pos
|
||||||
|
function mcl_core.get_foliage_block_type(pos)
|
||||||
|
return {name = minetest.get_node(pos).name, param2 = mcl_util.get_palette_indexes_from_pos(pos).foliage_palette_index}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Return appropriate water block node for pos
|
||||||
|
function mcl_core.get_water_block_type(pos)
|
||||||
|
return {name = minetest.get_node(pos).name, param2 = mcl_util.get_palette_indexes_from_pos(pos).water_palette_index}
|
||||||
end
|
end
|
||||||
|
|
||||||
------------------------------
|
------------------------------
|
||||||
|
@ -927,28 +924,17 @@ minetest.register_lbm({
|
||||||
label = "Replace legacy dry grass",
|
label = "Replace legacy dry grass",
|
||||||
name = "mcl_core:replace_legacy_dry_grass_0_65_0",
|
name = "mcl_core:replace_legacy_dry_grass_0_65_0",
|
||||||
nodenames = {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt_with_dry_grass_snow"},
|
nodenames = {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt_with_dry_grass_snow"},
|
||||||
|
run_at_every_load = true,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
local biome_data = minetest.get_biome_data(pos)
|
if node.name == "mcl_core:dirt_with_dry_grass_snow" then
|
||||||
if biome_data then
|
node.name = "mcl_core:dirt_with_grass_snow"
|
||||||
local biome = biome_data.biome
|
else
|
||||||
local biome_name = minetest.get_biome_name(biome)
|
node.name = "mcl_core:dirt_with_grass"
|
||||||
local reg_biome = minetest.registered_biomes[biome_name]
|
end
|
||||||
if reg_biome then
|
-- use savanna palette index to simulate dry grass.
|
||||||
if node.name == "mcl_core:dirt_with_dry_grass_snow" then
|
if not node.param2 then
|
||||||
node.name = "mcl_core:dirt_with_grass_snow"
|
node.param2 = SAVANNA_INDEX
|
||||||
else
|
|
||||||
node.name = "mcl_core:dirt_with_grass"
|
|
||||||
end
|
|
||||||
node.param2 = reg_biome._mcl_grass_palette_index
|
|
||||||
-- Fall back to savanna palette index
|
|
||||||
if not node.param2 then
|
|
||||||
node.param2 = SAVANNA_INDEX
|
|
||||||
end
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
node.param2 = SAVANNA_INDEX
|
|
||||||
minetest.set_node(pos, node)
|
minetest.set_node(pos, node)
|
||||||
return
|
return
|
||||||
end,
|
end,
|
||||||
|
@ -1084,6 +1070,16 @@ local grow_acacia = sapling_grow_action(ACACIA_TREE_ID, 2, true, false)
|
||||||
local grow_spruce = sapling_grow_action(SPRUCE_TREE_ID, 1, true, true, "mcl_core:sprucesapling")
|
local grow_spruce = sapling_grow_action(SPRUCE_TREE_ID, 1, true, true, "mcl_core:sprucesapling")
|
||||||
local grow_birch = sapling_grow_action(BIRCH_TREE_ID, 1, true, false)
|
local grow_birch = sapling_grow_action(BIRCH_TREE_ID, 1, true, false)
|
||||||
|
|
||||||
|
function mcl_core.update_sapling_foliage_colors(pos)
|
||||||
|
local pos1, pos2 = vector.offset(pos, -8, 0, -8), vector.offset(pos, 8, 30, 8)
|
||||||
|
local fnode
|
||||||
|
local foliage = minetest.find_nodes_in_area(pos1, pos2, {"group:foliage_palette", "group:foliage_palette_wallmounted"})
|
||||||
|
for _, fpos in pairs(foliage) do
|
||||||
|
fnode = minetest.get_node(fpos)
|
||||||
|
minetest.set_node(fpos, fnode)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Attempts to grow the sapling at the specified position
|
-- Attempts to grow the sapling at the specified position
|
||||||
-- pos: Position
|
-- pos: Position
|
||||||
-- node: Node table of the node at this position, from minetest.get_node
|
-- node: Node table of the node at this position, from minetest.get_node
|
||||||
|
|
|
@ -0,0 +1,287 @@
|
||||||
|
# textdomain: mcl_core
|
||||||
|
@1 could not survive in lava.=@1 não conseguiu sobreviver na lava.
|
||||||
|
@1 died in lava.=@1 morreu na lava.
|
||||||
|
@1 melted in lava.=@1 foi derretido na lava.
|
||||||
|
@1 took a bath in a hot lava tub.=@1 tomo um banho em uma banheira de lava quente.
|
||||||
|
A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Um bloco de diamante é principalmente um bloco decorativo brilhante, mas também é útil para armazenar diamantes de forma compacta.
|
||||||
|
A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Um bloco de esmeralda é principalmente um bloco decorativo brilhante, mas também é útil para armazenar esmeraldas de forma compacta.
|
||||||
|
A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Um bloco de ouro é principalmente um bloco decorativo brilhante, mas também é útil para armazenar ouro de forma compacta.
|
||||||
|
A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Um bloco de ferro é principalmente um bloco decorativo brilhante, mas também é útil para armazenar ferro de forma compacta.
|
||||||
|
A cactus can only be placed on top of another cactus or any sand.=Um cacto só pode ser colocado em cima de outro cacto ou em qualquer areia.
|
||||||
|
A decorative and mostly transparent block.=Um bloco decorativo e na maior parte transparente.
|
||||||
|
A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Um bloco de grama é um bloco de terra com cobertura de grama. Blocos de gramas são recursos que permitem o crescimento de qualquer tipo de planta. Eles podem se tornar terras aradas com uma enxada e em caminhos com uma pá. Sob a luz, a grama lentamente se espalha em blocos de terra próximos. Sob um bloco opaco ou um líquido, um bloco de grama pode se tornar em um bloco de terra.
|
||||||
|
A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Um bloco de lápis-lazuli é principalmente um bloco decorativo brilhante, mas também é útil para armazenar lápis-lazuli de forma compacta.
|
||||||
|
A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Uma fonte de lava incendeia alguns blocos de ar acima quando estão próximos de um bloco inflamável.
|
||||||
|
A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Um pedaço de escada que lhe permite escalar verticalmente. Escadas só podem ser colocadas na face de um bloco sólido e naão em vidros, folhas, gelo, lajes, glowstone e nem em lanternas marinhas.
|
||||||
|
Acacia Bark=Casca de Acácia
|
||||||
|
Acacia Leaves=Folhas de Acácia
|
||||||
|
Acacia Sapling=Muda de Acácia
|
||||||
|
Acacia Wood=Madeira de Acácia
|
||||||
|
Acacia Wood Planks=Tábuas de Acácia
|
||||||
|
Acacia leaves are grown from acacia trees.=Folhas de acácia crescem a partir de árvores de acácia.
|
||||||
|
Andesite=Andesito
|
||||||
|
Andesite is an igneous rock.=Andesito é uma rocha ígnea.
|
||||||
|
Apple=Maçã
|
||||||
|
Apples are food items which can be eaten.=Maçãs são itens alimentícios que podem ser comidos.
|
||||||
|
Barrier=Barreira
|
||||||
|
Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Barreiras são blocos invisíveis que podem ser caminhados. Eles são usados para criar barreiras em mapas de aventura e similares. Monstros ou animais não aparecerão nas barreiras e cercas não se conectarão com elas. Outros blocos podem ser construídos sob barreiras como qualquer outro bloco.
|
||||||
|
Bedrock=Rocha-mãe
|
||||||
|
Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Rochas-mãe são um tipo muito duro de rochas. Elas não podem ser quebradas, destruídas, coletadas ou movidas por meios normais, a não ser no Modo Criativo.
|
||||||
|
Birch Bark=Casca de Bétula
|
||||||
|
Birch Leaves=Folhas de Bétula
|
||||||
|
Birch Sapling=Muda de Bétula
|
||||||
|
Birch Wood=Madeira de Bétula
|
||||||
|
Birch Wood Planks=Tábuas de Bétula
|
||||||
|
Birch leaves are grown from birch trees.=Folhas de bétula crescem a partir de árvores de bétula.
|
||||||
|
Black Stained Glass=Vidro Tingido de Preto
|
||||||
|
Block of Coal=Bloco de Carvão
|
||||||
|
Block of Diamond=Bloco de Diamante
|
||||||
|
Block of Emerald=Bloco de Esmeralda
|
||||||
|
Block of Gold=Bloco de Ouro
|
||||||
|
Block of Iron=Bloco de Ferro
|
||||||
|
Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Blocos de carvão são úteis para armzenad carvão de forma compacta e muito úteis como combustível de fornalas. Um bloco de carvão é tão eficiente quanto 10 carvões.
|
||||||
|
Blue Stained Glass=Vidro Tingido de Azul
|
||||||
|
Bone Block=Bloco de Osso
|
||||||
|
Bone blocks are decorative blocks and a compact storage of bone meal.=Blocos de osso são blocos decorativos e uma forma compacta de armazenar farinha de osso.
|
||||||
|
Bowl=Tigela
|
||||||
|
Bowls are mainly used to hold tasty soups.=Tigelas são utilizadas principalmente para segurar sopas deliciosas.
|
||||||
|
Brick=Tijolo
|
||||||
|
Brick Block=Bloco de Tijolo
|
||||||
|
Brick blocks are a good building material for building solid houses and can take quite a punch.=Blocos de tijolo são bons materiais de construção para a construção de casas sólidas e que podem aguentar a porrada.
|
||||||
|
Bricks are used to craft brick blocks.=Tijolos são usados para fabricar blocos de tijolo.
|
||||||
|
Brown Stained Glass=Vidro Tingido de Marrom
|
||||||
|
Cactus=Cacto
|
||||||
|
Charcoal=Carvão Vegetal
|
||||||
|
Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Carvão vegetal é um combustível alternativo de fornalha produzido ao cozinhar madeira em uma fornalha. Possui o mesmo tempo de queima que o carvão e também compartilha diversas receitas de fabricação, mas não pode ser usado para fabricar blocos de carvão.
|
||||||
|
Chiseled Stone Bricks=Tijolo de Rocha Cinzelado
|
||||||
|
Chiseled Red Sandstone=Arenito Vermelho Cinzelado
|
||||||
|
Chiseled Sandstone=Arenito Cinzelado
|
||||||
|
Chiseled red sandstone is a decorative building block.=Arenito vermelho cinzelado é um bloco de construção decorativo.
|
||||||
|
Chiseled sandstone is a decorative building block.=Arenito cinzelado é um bloco de construção decorativo.
|
||||||
|
Clay=Argila
|
||||||
|
Clay Ball=Bola de Argila
|
||||||
|
Clay balls are a raw material, mainly used to create bricks in the furnace.=Bolas de argila são materiais não processados, principalmente utilizados para fabricar tijolos quando cozidos.
|
||||||
|
Clay is a versatile kind of earth commonly found at beaches underwater.=Argila é um tipo de terra versátil comumente encontrado em praias e submerso.
|
||||||
|
Coal=Carvão
|
||||||
|
Coal Ore=Minério de Carvão
|
||||||
|
Coarse Dirt=Terra Infértil
|
||||||
|
Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Terra infértil age como solo para algums plantas e é similar à terra, mas nunca crescerá uma cobertura.
|
||||||
|
Cobblestone=Pedregulho
|
||||||
|
Cobweb=Teia de Aranha
|
||||||
|
Cobwebs can be walked through, but significantly slow you down.=Teias de aranha podem ser atravessadas, mas reduzindo significativamente sua velocidade.
|
||||||
|
Cracked Stone Bricks=Tijolo de Rocha Rachado
|
||||||
|
Cut Red Sandstone=Arenito Vermelho Cortado
|
||||||
|
Cut Sandstone=Arenito Cortado
|
||||||
|
Cut red sandstone is a decorative building block.=Arenito vermelho cortado é um bloco de construção decorativo.
|
||||||
|
Cut sandstone is a decorative building block.=Arenito cortado é um bloco de construção decorativo.
|
||||||
|
Cyan Stained Glass=Vidro Tingido de Ciano
|
||||||
|
Dark Oak Bark=Casca de Carvalho Escuro
|
||||||
|
Dark Oak Leaves=Folhas de Carvalho Escuro
|
||||||
|
Dark Oak Sapling=Muda de Carvalho Escuro
|
||||||
|
Dark Oak Wood=Madeira de Carvalho Escuro
|
||||||
|
Dark Oak Wood Planks=Tábuas de Carvlho Escuro
|
||||||
|
Dark oak leaves are grown from dark oak trees.=Folhas de carvalho escuro crescem em árvores de carvalho escuro.
|
||||||
|
Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Mudas de carvalho escuro podem se tornar carvalhos escuro, mas apenas em grupo. Uma muda de carvalho escuro solitária não crescerá. Um grupo de quatro mudas de carvalho escuro crescem em uma árvore de carvalho escuro após um tempo em um quadrado de 2x2 sendo expostas à luz.
|
||||||
|
Dead Bush=Arbusto Morto
|
||||||
|
Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Arbustos mortos são plantas normais comumente encontradas em áreas secas. Podem ser colhidas na forma de gravetos.
|
||||||
|
Diamond=Diamante
|
||||||
|
Diamond Ore=Minério de Diamante
|
||||||
|
Diamond ore is rare and can be found in clusters near the bottom of the world.=Minérios de diamante são raros e podem ser encontrados em aglomerados perto do fundo do mundo.
|
||||||
|
Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Diamantes são minerais preciosos e úteis para criar as armaduras e ferramentas do mais alto nível.
|
||||||
|
Diorite=Diorito
|
||||||
|
Diorite is an igneous rock.=Diorito é uma rocha ígnea.
|
||||||
|
Dirt=Terra.
|
||||||
|
Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Terra atua como solo para algumas plantas. Quando sob a luz, esse bloco pode crescer grama ou uma cobertura de micélio se tais blocos estão próximos.
|
||||||
|
Emerald=Esmeralda
|
||||||
|
Emerald Ore=Minério de Esmeralda
|
||||||
|
Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Minério de esmeralda é o minério das esmeraldas. É raro e podem ser encontrados solitários, não em aglomerados.
|
||||||
|
Emeralds are used in villager trades as currency.=Esmeraldas são utilizadas nas trocas como aldeões na forme de moeda.
|
||||||
|
Flint=Sílex
|
||||||
|
Flint is a raw material.=Sílex é um material não processado.
|
||||||
|
Flowing Lava=Lava Fluíndo
|
||||||
|
Flowing Water=Água Fluíndo
|
||||||
|
Frosted Ice=Gelo Fosco
|
||||||
|
Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=Gelo fosco é um bloco sólido de vida curta. Ele derrete em uma fonte de água após alguns segundos.
|
||||||
|
Glass=Vidro
|
||||||
|
Gold Ingot=Lingote de Ouro
|
||||||
|
Gold Nugget=Pepita de Ouro
|
||||||
|
Gold Ore=Minério de Ouro
|
||||||
|
Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Pepitas de ouro são pequenas peças de ouro fundido; sua principal finalidade é criar lingotes de ouro.
|
||||||
|
Golden Apple=Maçã Dourada
|
||||||
|
Golden apples are precious food items which can be eaten.=Maçãs douradas são alimentos preciosos que podem ser consumidos.
|
||||||
|
Granite=Granito
|
||||||
|
Grass Block=Bloco de Grama
|
||||||
|
Grass Path=Caminho de Grama
|
||||||
|
Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Caminhos de gramas são variantes decorativas do bloco de grama. Seu topo possui diferentes cores e são um pouco mais baixos que blocos de grama, tornando-os úteis para construír trilhas. Caminhos de grama se tornam terra quando é colocado abaixo de um bloco sólido.
|
||||||
|
Gravel=Cascalho
|
||||||
|
Green Stained Glass=Vidro Tingido de Verde
|
||||||
|
Grey Stained Glass=Vidro Tingido de Cinza
|
||||||
|
Ice=Gelo
|
||||||
|
Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Gelo é um bloco sólido normamente encontrado em áreas frias. Ele derrete quando próximo de um bloco luminoso sob um nível de luz 12 ou superior. Quando derrete ou é quebrado enquanto acima de um bloco, se torna em uma fonte de água.
|
||||||
|
In the End dimension, starting a fire on this block will create an eternal fire.=Na dimensão do End, começar um fogo nesse bloco criará um fogo eterno.
|
||||||
|
Iron Ingot=Lingote de Ferro
|
||||||
|
Iron Nugget=Pepita de Ferro
|
||||||
|
Iron Ore=Minério de Ferro
|
||||||
|
Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Pepitas de ferro são pequenas peças de ferro fundido; seu principal propósito é na criação de lingotes de ferro.
|
||||||
|
Jungle Bark=Casca da Selva
|
||||||
|
Jungle Leaves=Folhas da Selva
|
||||||
|
Jungle Sapling=Mudas da Selva
|
||||||
|
Jungle Wood=Madeira da Selva
|
||||||
|
Jungle Wood Planks=Tábuas da Selva
|
||||||
|
Jungle leaves are grown from jungle trees.=Folhas da selva crescem em árvores da selva.
|
||||||
|
Ladder=Escada
|
||||||
|
Lapis Lazuli Block=Bloco de Lápis-lazuli
|
||||||
|
Lapis Lazuli Ore=Minério de Lápis-lazuli
|
||||||
|
Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Minerios de lápis-lazuli são o minério que contém lápis-lazuli. Pode ser encontrado raramente em aglomerados perto do fundo do mundo.
|
||||||
|
Lava Source=Fonte de Lava
|
||||||
|
Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Lava é quente e um tanto quanto perigosa. Não a toque, irá te queimar muito e será dificil sair.
|
||||||
|
Light Blue Stained Glass=Vidro Tingido de Azul Claro
|
||||||
|
Light Grey Stained Glass=Vidro Tingido de Cinza Claro
|
||||||
|
Lime Stained Glass=Vidro Tingido de Lima
|
||||||
|
Lit Redstone Ore=Minério de Redstone Aceso
|
||||||
|
Magenta Stained Glass=Vidro Tingido de Magenta
|
||||||
|
Molten gold. It is used to craft armor, tools, and whatnot.=Ouro fundido. É usado para fabricar armaduras, ferramentas e o que não.
|
||||||
|
Molten iron. It is used to craft armor, tools, and whatnot.=Ferro fundido. É usado para fabricar armaduras, ferramentas e o que não.
|
||||||
|
Mossy Cobblestone=Pedregulho Musgoso
|
||||||
|
Mossy Stone Bricks=Tiolos de Rocha Musgosos
|
||||||
|
Mycelium=Micélio
|
||||||
|
Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Micélio é um tipo de terra e é o solo ideal para cogumelos. Diferente de outros tipos de blocos de terra, ele não pode ser convertido em terra arada com uma enxada. Sob a luz, micélio lentamente se espalha sobre outros blocos de terra próximos. Sob um bloco opaco ou um líquido, eventualmente se torna terra.
|
||||||
|
Oak Bark=Casca de Carvalho
|
||||||
|
Oak Leaves=Folhas de Carvalho
|
||||||
|
Oak Sapling=Muda de Carvalho
|
||||||
|
Oak Wood=Madeira de Carvalho
|
||||||
|
Oak Wood Planks=Tábuas de Carvalho
|
||||||
|
Oak leaves are grown from oak trees.=Folhas de carvalho crescem a partir de árvores de carvalho.
|
||||||
|
Obsidian=Obsidiana
|
||||||
|
Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Obsidiana é um mineral extremamente duro com uma enorme resistência a explosões. Obsidiana é formada quando a água encontra com a lava.
|
||||||
|
One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Um dos blocos mais comuns do mundo, o subsolo consiste quase que na integridade de rocha. Algumas vezes contém minérios. Rochas podem ser criadas quando a água entra em contato com a lava.
|
||||||
|
Orange Stained Glass=Vidro Tingido de Laranja
|
||||||
|
Packed Ice=Gelo Compactado
|
||||||
|
Packed ice is a compressed form of ice. It is opaque and solid.=Gelo compactado é uma forma comprimida de gelo. É um bloco opaco e sólido.
|
||||||
|
Paper=Papel
|
||||||
|
Paper is used to craft books and maps.=Papel é utilizado para fabricar livros e mapas.
|
||||||
|
Pink Stained Glass=Vidro Tingido de Rosa
|
||||||
|
Podzol=Podzol
|
||||||
|
Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Podzol é um tpo de terra encontrado em florestas de taiga. Apenas algumas plantas conseguem sobreviver nele.
|
||||||
|
Polished Andesite=Andesito Polido
|
||||||
|
Polished Diorite=Diorito Polido
|
||||||
|
Polished Granite=Granito Polido
|
||||||
|
Polished Stone=Rocha Polida
|
||||||
|
Polished andesite is a decorative building block made from andesite.=Andesito polido é um bloco de construção decorativo feito a partir de andesito.
|
||||||
|
Polished diorite is a decorative building block made from diorite.=Diorito polido é um bloco de construção decorativo feito a partir de diorito.
|
||||||
|
Polished granite is a decorative building block made from granite.=Granito polido é um bloco de construção decorativo feito a partir de granito.
|
||||||
|
Purple Stained Glass=Vidro Tingido de Roxo
|
||||||
|
Realm Barrier=Barreira de Mundo
|
||||||
|
Red Sand=Areia Vermelha
|
||||||
|
Red Sandstone=Arenito Vermelho
|
||||||
|
Red Stained Glass=Vidro Tingido de Vermelho
|
||||||
|
Red sand is found in large quantities in mesa biomes.=Areia vermelha é encontrada em grandes quantidades nos biomes de mesa.
|
||||||
|
Red sandstone is compressed red sand and is a rather soft kind of stone.=Arenito vermelho é areia vemelha comprimida e é um tipo mais macio de rocha.
|
||||||
|
Redstone Ore=Minério de Redstone
|
||||||
|
Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Minério de redstone é comumente encontrado próximo a superfície do mundo.
|
||||||
|
Sand=Areia
|
||||||
|
Sand is found in large quantities at beaches and deserts.=Areia é encontrada em grande quantidade em praias e desertos.
|
||||||
|
Sandstone=Arenito
|
||||||
|
Sandstone is compressed sand and is a rather soft kind of stone.=Arenito é areia comprimida e é um tipo mais macio de rocha.
|
||||||
|
Slime Block=Bloco de Slime
|
||||||
|
Slime blocks are very bouncy and prevent fall damage.=Blocos de slime são bastante saltitantes e previnem dano de queda.
|
||||||
|
Smooth Red Sandstone=Arenito Vermelho Liso
|
||||||
|
Smooth Sandstone=Arenito Liso
|
||||||
|
Smooth red sandstone is a decorative building block.=Arenito vemelho liso é um bloco de construção decorativo
|
||||||
|
Smooth sandstone is compressed sand and is a rather soft kind of stone.=Arenito liso é um bloco de construção decorativo
|
||||||
|
Snow=Neve
|
||||||
|
Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Algum carvão contigo na rocha, é bem comum e pode ser encontrado dentro de rochas em aglomerados médios a grantes a praticamente qualquer altitude.
|
||||||
|
Some iron contained in stone, it is prety common and can be found below sea level.=Algum ferro contido na rocha, é relativamente comum e pode ser encontrado abaixo do nível do mar.
|
||||||
|
Spruce Bark=Casca de Pinheiro
|
||||||
|
Spruce Leaves=Folhas de Pinheiro
|
||||||
|
Spruce Sapling=Muda de Pinheiro
|
||||||
|
Spruce Wood=Madeira de Pinheiro
|
||||||
|
Spruce Wood Planks=Tábuas de Pinheiro
|
||||||
|
Spruce leaves are grown from spruce trees.=Folhas de pinheiro crescem a partir de árvores de pinheiro.
|
||||||
|
Stained glass is a decorative and mostly transparent block which comes in various different colors.=Vidro tingido é um bloco decorativo majoritariamente transparente e que possui diferentes colorações.
|
||||||
|
Stick=Graveto
|
||||||
|
Sticks are a very versatile crafting material; used in countless crafting recipes.=Gravetos são materiais de fabricação muito versáteis; usados em inumeráveis receitas de fabricação.
|
||||||
|
Stone=Rocha
|
||||||
|
Stripped Acacia Log=Tronco de Acácia Descascado
|
||||||
|
Stripped Acacia Wood=Madeira de Acácia Descascada
|
||||||
|
Stripped Birch Log=Tronco de Bétula Descascado
|
||||||
|
Stripped Birch Wood=Madeira de Bétula Descascada
|
||||||
|
Stripped Dark Oak Log=Tronco de Carvalho Escuro Descascado
|
||||||
|
Stripped Dark Oak Wood=Madeira de Carvalho Escuro Descascada
|
||||||
|
Stripped Jungle Log=Tronco da Selva Descascado
|
||||||
|
Stripped Jungle Wood=Madeira da Selva Descascada
|
||||||
|
Stripped Oak Log=Tronco de Carvalho Descascado
|
||||||
|
Stripped Oak Wood=Madeira de Carvalho Descascada
|
||||||
|
Stripped Spruce Log=Tronco de Pinheiro Descascado
|
||||||
|
Stripped Spruce Wood=Madeira de Pinheiro Descascada
|
||||||
|
Stone Bricks=Tijolo de Rocha
|
||||||
|
Sugar=Açúcar
|
||||||
|
Sugar Canes=Cana de Açúcar
|
||||||
|
Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=
|
||||||
|
Canas de açúcar são plantas que possui alguns usos em fabricações. Canas de açúcar crescerão lentamente até 3 blocos quando estão próximas da água e são colocadas em blocos de grama, terra, areia, areia vermelha, podzol ou terra infértil.
|
||||||
|
Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Canas de açúcar só podem ser colocados emcima de outras canas de açúcar ou sobre blocos em qual elas podem crescer.
|
||||||
|
Sugar comes from sugar canes and is used to make sweet foods.=Açúcar vem de canas de açúcar e é utilizado para fazer doces comidas.
|
||||||
|
The stripped trunk of an acacia tree.=O tronco descascado de uma acácia.
|
||||||
|
The stripped trunk of a birch tree.=O tronco descascado de uma bétula.
|
||||||
|
The stripped trunk of a dark oak tree.=O tronco descascado de um carvalho escuro.
|
||||||
|
The stripped trunk of a jungle tree.=O tronco descascado de uma árvore da selva.
|
||||||
|
The stripped trunk of an oak tree.=O tronco descascado de um carvalho.
|
||||||
|
The stripped trunk of a spruce tree.=O tronco descascado de um pinheiro.
|
||||||
|
The trunk of a birch tree.=O tronco de uma bétula.
|
||||||
|
The trunk of a dark oak tree.=O tronco de um carvalho escuro.
|
||||||
|
The trunk of a jungle tree.=O tronco de uma árvore da selva.
|
||||||
|
The trunk of a spruce tree.=O tronco de um pinheiro.
|
||||||
|
The trunk of an acacia.=O tronco de uma acácia.
|
||||||
|
The trunk of an oak tree.=O tronco de um carvalho.
|
||||||
|
The stripped wood of an acacia tree.=A madeira descascada de uma acácia.
|
||||||
|
The stripped wood of a birch tree.=A madeira descascada de uma bétula.
|
||||||
|
The stripped wood of a dark oak tree.=A madeira descascada de um carvalho escuro.
|
||||||
|
The stripped wood of a jungle tree.=A madeira descascada de uma árvore da selva.
|
||||||
|
The stripped wood of an oak tree.=A madeira descascada de um carvalho.
|
||||||
|
The stripped wood of a spruce tree.=A madeira descascada de um pinheiro.
|
||||||
|
This block consists of a couple of loose stones and can't support itself.=Esse bloco consiste de várias pedras soltas e não consegue se suportar.
|
||||||
|
This is a decorative block surrounded by the bark of a tree trunk.=Este é um bloco decorativo envolto das cascas de uma árvore.
|
||||||
|
This is a decorative block.=Este é um bloco decorativo.
|
||||||
|
This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Esse é um bloco cheio de neve. Neve dessa espessura geralmente é encontrada em áreas de frio extremo.
|
||||||
|
This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Esse é um pedaço de cacto comumente encontrado em áreas secas, especialmente desertos. Com o passar do tempo, cactos crescerão até 3 blocos de altura em areia ou areia vermelha. Um cacto machuca seres vivos que o encostarem com o dano de 1 HP a cada meio segundo. Quando um cacto é quebrado, todo bloco de cacto conectado acima também será quebrado.
|
||||||
|
This stone contains pure gold, a rare metal.=Essa rocha contem ouro puro, um metal raro.
|
||||||
|
Top Snow=Cobertura de neve
|
||||||
|
Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=A cobertura de neve é uma camada de neve. Ela derrete próxima de fontes luminosas além do sol quando o nível de luz for 12 ou superior.
|
||||||
|
Vines=Vinhas
|
||||||
|
Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Vinhas são blocos escaláveis que podem ser colocadas ao lado de blocos sólidos. Vinhas crescem lentamente e se espalham.
|
||||||
|
Void=Vazio
|
||||||
|
Water=Água
|
||||||
|
Water Source=Fonte de Água
|
||||||
|
Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=Água é abundante em oceanos e também aparece em algumas nascentes no solo. Você pode nadar facilmente na água, mas é preciso tomar fôlego de tempo em tempo.
|
||||||
|
When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Quando colocada no solo (como na terra) e exposta a luz, a muda de bétula crescerá em uma árvore após algum tempo.
|
||||||
|
When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=Quando colocada no solo (como na terra) e exposta a luz, a muda da selva crescerá em uma árvore após algum tempo. Quando há 4 mudas da selva em um quadrado de 2x2, elas crescerão em uma enorme árvore da selva.
|
||||||
|
When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=Quando colocada no solo (como na terra) e exposta a luz, a muda de pinheiro crescerá em uma árvore após algum tempo. Quando há 4 mudas de pinheiro em um quadrado de 2x2, elas crescerão em um enorme pinheiro.
|
||||||
|
When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Quando colocada no solo (como na terra) e exposta a luz, a muda de acácia crescerá em uma árvore após algum tempo.
|
||||||
|
When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Quando colocada no solo (como na terra) e exposta a luz, a muda de carvalho rescerá em uma árvore após algum tempo.
|
||||||
|
When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Quando você segura uma barreira na mão, lhe é revelado todas as barreiras posicionadas próximas de você.
|
||||||
|
White Stained Glass=Vidro Tingido de Branco
|
||||||
|
Yellow Stained Glass=Vidro Tingido de Amarelo
|
||||||
|
“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.="Carvão" se refere a pedaços de carvão obtidos quando escavados minérios de carvão, que podem ser encontrados no subsolo. Carvão é seu combustível de fornalha padrão, mas também pode ser usado para fazer tochas, blocos de carvão e outras coisas.
|
||||||
|
Water interacts with lava in various ways:=Água interage com a lava de várias formas:
|
||||||
|
• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Quando a água está diretamente acima ou horizontalmente próxima de uma fonte de lava, a lava se torna obsidiana.
|
||||||
|
• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Quando água fluindo toca em lava fluindo tanto por cima quanto horizontalmente, a lava se torna pedregulho.
|
||||||
|
• When water is directly below lava, the water turns into stone.=• Quando a água está diretamente abaixo da lava, a água se torna rocha.
|
||||||
|
Lava interacts with water various ways:=Lava interage com a água de várias maneiras:
|
||||||
|
• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Quando uma fonte de lava está diretamente abaixo ou horizontalmente perto da água, a lava se torna obsidiana.
|
||||||
|
• When lava is directly above water, the water turns into stone.=• Quando a lavaz está diretamente acima da água, a água se torna rocha.
|
||||||
|
Stained Glass=Vidro Tingido
|
||||||
|
Granite is an igneous rock.=Granito é uma rocha ígnea.
|
||||||
|
Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Cobertura de neve pode ser empilhada e possui 8 diferentes níveis de altura. Aos níveis 2-8, a cobertura de neve é colisional. Cobertura de neve derruba 2-9 bolas de neve, dependendo de sua altura.
|
||||||
|
This block can only be placed on full solid blocks and on another top snow (which increases its height).=Esse bloco só pode ser colocado em blocos sólidos e em outras coberturas de neve (o que aumenta sua altura).
|
||||||
|
Needs soil and water to grow=Necessita de solo e água para crescer
|
||||||
|
Needs soil and light to grow=Necessita de solo e luz para crescer
|
||||||
|
Grows on sand=Cresce na areia
|
||||||
|
Contact damage: @1 per half second=Dano de contato: @1 por meio segundo
|
||||||
|
Slows down movement=Diminui a velocidade de movimento
|
||||||
|
2×2 saplings required=2x2 de mudas necessário
|
||||||
|
2×2 saplings @= large tree=2x2 de mudas @=
|
||||||
|
Grows on sand or dirt next to water=Cresce na areia ou em terra próximo a água
|
||||||
|
Stackable=Empilhável
|
||||||
|
Crying Obsidian=Obsidiana Chorona
|
||||||
|
Crying obsidian is a luminous obsidian that can generate as part of ruined portals.=Obsidiana chorona é uma obsidiana luminosa que pode ser gerada como parte de portais arruinados.
|
||||||
|
Enchanted Golden Apple=Maçã Dourada Encantada
|
|
@ -127,7 +127,7 @@ minetest.register_node("mcl_core:reeds", {
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
if node.param2 == 0 then
|
if node.param2 == 0 then
|
||||||
node.param2 = mcl_core.get_grass_palette_index(pos)
|
node.param2 = mcl_util.get_palette_indexes_from_pos(pos).grass_palette_index
|
||||||
if node.param2 ~= 0 then
|
if node.param2 ~= 0 then
|
||||||
minetest.set_node(pos, node)
|
minetest.set_node(pos, node)
|
||||||
end
|
end
|
||||||
|
|
|
@ -92,11 +92,13 @@ minetest.register_node("mcl_core:vine", {
|
||||||
_doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."),
|
_doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."),
|
||||||
drawtype = "signlike",
|
drawtype = "signlike",
|
||||||
tiles = {"mcl_core_vine.png"},
|
tiles = {"mcl_core_vine.png"},
|
||||||
|
color = "#48B518",
|
||||||
inventory_image = "mcl_core_vine.png",
|
inventory_image = "mcl_core_vine.png",
|
||||||
wield_image = "mcl_core_vine.png",
|
wield_image = "mcl_core_vine.png",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype2 = "wallmounted",
|
paramtype2 = "colorwallmounted",
|
||||||
|
palette = "[combine:16x2:0,0=mcl_core_palette_foliage.png",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
climbable = true,
|
climbable = true,
|
||||||
buildable_to = true,
|
buildable_to = true,
|
||||||
|
@ -107,7 +109,7 @@ minetest.register_node("mcl_core:vine", {
|
||||||
groups = {
|
groups = {
|
||||||
handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1,
|
handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1,
|
||||||
dig_by_piston = 1, destroy_by_lava_flow = 1, compostability = 50,
|
dig_by_piston = 1, destroy_by_lava_flow = 1, compostability = 50,
|
||||||
flammable = 2, fire_encouragement = 15, fire_flammability = 100
|
flammable = 2, fire_encouragement = 15, fire_flammability = 100, foliage_palette_wallmounted = 1
|
||||||
},
|
},
|
||||||
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
||||||
drop = "",
|
drop = "",
|
||||||
|
@ -155,6 +157,20 @@ minetest.register_node("mcl_core:vine", {
|
||||||
return itemstack
|
return itemstack
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
on_construct = function(pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local foliage_palette_index = mcl_util.get_palette_indexes_from_pos(pos).foliage_palette_index
|
||||||
|
if node.name == "mcl_core:vine" then
|
||||||
|
local biome_param2 = foliage_palette_index
|
||||||
|
local rotation_param2 = node.param2
|
||||||
|
local final_param2 = (biome_param2 * 8) + rotation_param2
|
||||||
|
if node.param2 ~= final_param2 and rotation_param2 < 6 then
|
||||||
|
node.param2 = final_param2
|
||||||
|
minetest.swap_node(pos, node)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
-- If dug, also dig a “dependant” vine below it.
|
-- If dug, also dig a “dependant” vine below it.
|
||||||
-- A vine is dependant if it hangs from this node and has no supporting block.
|
-- A vine is dependant if it hangs from this node and has no supporting block.
|
||||||
on_dig = function(pos, node, digger)
|
on_dig = function(pos, node, digger)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue